|
分類:[VB.NET/VB2005 以降]
VB2005でserialPortを使った232C通信のプログラムで問題があり質問させて頂きます。
・ざっくりの仕様
自社製品との通信で、パワーオン時製品から送信される特定文字列を受信したら"OK"+0x0dを返す。
製品との接続はUSBで、FTDIの仮想シリアルドライバを使用。
通信設定は9600bps,データ8bit,Stop 1bit,パリティー無し、ハード制御無し
・問題点
一応文字列受信及びOK返信はできるが、反応が異常に遅く装置側がタイムアウトしてしまう。
・備考
フリーウェアのSerialDebugToolを実機の代わりにして同文字列を送信すると問題無いスピードで反応する。
逆にSerialDebugToolと実機で、SerialDebugToolで文字列受信及び手作業でOK返信するとこちらも問題無し。
下のソースのように受信処理内で1バイト毎にTextBoxに表示していますが、それを見てると実機相手の場合は受信が遅く、ランダムに間が空くようです。
・ソース
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
SerialPort1.NewLine = vbCr '文字列読み込みの終端を 0x0d 指定
SerialPort1.ReceivedBytesThreshold = 1 '1byte受信毎にイベント発生
End Sub
'受信スタート
Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnKisyumei.Click
If SerialPort1.IsOpen = False Then
MsgBox("ポートはクローズされています")
Exit Sub
End If
TextBox1.Clear()
Array.Clear(rBuf, 0, UBound(rBuf)) '受信バッファクリア
loc = 0 '受信配列を先頭に
rCnt = 4 '受信バイト数4に
tEnd = False '受信終了フラグ Falseに
TextBox1.Text = "コード受信待ち、装置の電源を入れて下さい" + Chr(13) + Chr(10)
TextBox1.Text = TextBox1.Text + "<-" + Chr(13) + Chr(10)
trFlg = "PUP" '動作種別をパワーアップに
End Sub
'受信からTextBox1を使うためのDelegate
Delegate Sub AddDataDelegate(ByVal str As String)
Private Sub AddData(ByVal str As String)
TextBox1.Text = TextBox1.Text + str
End Sub
'受信処理
Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
Dim strDataReceived As String
Dim tmpBuf(5) As Byte
Dim add As New AddDataDelegate(AddressOf AddData)
Try
SerialPort1.Read(tmpBuf, 0, 1)
Catch ex As Exception
strDataReceived = ex.Message
End Try
rBuf(loc) = tmpBuf(0)
TextBox1.Invoke(add, rBuf(loc).ToString("X") + ",")
loc = loc + 1
jusin()
End Sub
'受信内の処理
Private Sub jusin()
Dim add As New AddDataDelegate(AddressOf AddData)
Select Case trFlg
Case "PUP"
If loc >= rCnt Then
Dim i, j As Integer
Dim jFlg As Boolean = False
Dim s As String
Dim tmpB(3) As Byte
For i = 0 To loc
For j = 0 To 3
tmpB(j) = rBuf(i + j)
Next
s = System.Text.Encoding.ASCII.GetString(tmpB)
If s = "abcd" Then '文字列"abcd"受信確認
s = "OK"
SerialPort1.WriteLine(s) '"OK"送信
trFlg = ""
TextBox1.Invoke(add, Chr(13) + Chr(10) + "->" + Chr(13) + Chr(10) + s)
jFlg = True
Exit For
End If
Next
If jFlg = False Then
Exit Sub
End If
End If
'ケース文の他の処理は省略
Case "VR0"
Case "WMS"
Case "RMS"
End Select
End Sub
以上よろしくお願いします。
|