投稿日 | : 2005/07/27(Wed) 03:34 |
投稿者 | : Starfish |
Eメール | : |
URL | : |
タイトル | : Re^4: MSCommのOn_Comm受信 |
受信系を直してみました。デバッグしていないのでバグっているかも
Dim mbytRecvData() As Byte
Private Sub ctlComm_OnComm()
Dim lngLen As Long
Dim lngEtxPos As Long
Dim lngDlePos As Long
Dim bytlenH As Byte
Dim bytlenL As Byte
Dim i As Long
Dim bytDataDLE() As Byte
Dim bytData() As Byte
Dim bytBcc As Byte
' イベントの確認(テストプログラムなので受信以外は終了)
If ctlComm.CommEvent <> comEvReceive Then
MsgBox "受信以外のイベント発生" & CStr(ctlComm.CommEvent)
Exit Sub
End If
' 受信データを受信バッファへ格納
mbytRecvData = CStr(mbytRecvData) & ctlComm.Input
' 受信データ長
lngLen = UBound(mbytRecvData) + 1
' 受信データを照合
If mbytRecvData(0) <> COMM_CODE.DLE Then
MsgBox "DLEが一致しません。"
mbytRecvData = "" ' 受信バッファをクリア
Exit Sub
End If
Select Case mbytRecvData(1)
' セレクティングと照合
Case COMM_CODE.SEL
lngEtxPos = InStrB(CStr(mbytRecvData), ChrB(COMM_CODE.DLE) & ChrB(COMM_CODE.ETX))
If lngEtxPos = 0 Then Exit Sub ' DLE ETX 未受信
If lngLen = lngEtxPos + 1 Then Exit Sub ' BCC未受信
If (lngLen = lngEtxPos + 2) And (mbytRecvData(lngLen - 1) = COMM_CODE.DLE) Then
Exit Sub ' BCCがDLE で1文字のみ受信
End If
' セレクティング受信処理
If (mbytRecvData(2) <> COMM_CODE.DLE) Or _
(mbytRecvData(3) <> COMM_CODE.HA) Or _
(mbytRecvData(4) <> COMM_CODE.DLE) Or _
(mbytRecvData(5) <> COMM_CODE.UA) Or _
(mbytRecvData(6) <> COMM_CODE.DLE) Or _
(mbytRecvData(7) <> COMM_CODE.STX) Or _
(mbytRecvData(8) <> COMM_CODE.DLE) Or _
(mbytRecvData(10) <> COMM_CODE.DLE) Then
MsgBox "セレクティングを受信しましたがデータ異常"
mbytRecvData = "" ' 受信バッファをクリア
Exit Sub
End If
' データ長
bytlenH = mbytRecvData(9)
bytlenL = mbytRecvData(11)
' データ部(DLE付)
bytDataDLE = MidB(mbytRecvData, 13, lngEtxPos - 13)
' BCC
bytBcc = mbytRecvData(lngEtxPos + 1)
' データ部からDLEを削除(元のデータ)
For i = 0 To UBound(bytDataDLE)
If bytDataDLE(i) = COMM_CODE.DLE Then
i = i + 1
End If
bytData = CStr(bytData) & ChrB(bytDataDLE(i))
Next
' データ長チェック
If (bytlenH * 256 + bytlenL) <> UBound(bytData) + 1 Then
MsgBox "データ長が一致しない"
mbytRecvData = "" ' 受信バッファをクリア
Exit Sub
End If
' BCCのチェックを追加してください
' セレクティングデータ表示
txtInPutData.Text = ""
For i = 0 To UBound(bytData)
txtInPutData.Text = txtInPutData.Text & Right("00" & Hex(bytData(i)), 2) & " "
Next i
labInPutData.Caption = "セレクティング受信"
mbytRecvData = "" ' 受信バッファをクリア
' NAKと照合
Case COMM_CODE.NAK
If lngLen < 6 Then Exit Sub ' 未完了
If (mbytRecvData(2) <> COMM_CODE.DLE) Or _
(mbytRecvData(3) <> COMM_CODE.HA) Or _
(mbytRecvData(4) <> COMM_CODE.DLE) Or _
(mbytRecvData(5) <> COMM_CODE.UA) Then
MsgBox "NAKを受信しましたが、データが異常です"
mbytRecvData = "" ' 受信バッファをクリア
Exit Sub
End If
labInPutData.Caption = "NAK受信"
mbytRecvData = "" ' 受信バッファをクリア
' RSP送信