投稿日 | : 2005/07/25(Mon) 12:31 |
投稿者 | : チロル |
Eメール | : |
URL | : |
タイトル | : MSCommのOn_Comm受信 |
こんにちは。
二度ほど質問させて頂いた続きなのですが,よろしくお願い致します。
NAK:6バイト固定で送信されるコマンド
セレクティング:TEXTへ入力されたバイナリー形式の文字列を送信する可変バイトのコマンド
の二つがあります。
コマンドはボタンを押し手動で送信をかける作りになっています。
環境的にはRS232Cには検査器が接続されており、送信されたバイナリーデータを目で確認することが
できます。
NAKに関して
コマンドは問題なく送信され、受信も問題ありません。
*ctlComm. はMSComm1.の事です。
以下送信プログラム
Private Sub cmdOutPutNak_Click()
' Nak送信
Dim Buffer(5) As Byte
Buffer(0) = COMM_CODE.DLE
Buffer(1) = COMM_CODE.NAK
Buffer(2) = COMM_CODE.DLE
Buffer(3) = COMM_CODE.UA
Buffer(4) = COMM_CODE.DLE
Buffer(5) = COMM_CODE.HA
ctlComm.Output = Buffer
End Sub
セレクティングに関して
コマンドは問題なく送信されています。
以下送信プログラム
Private Sub cmdOutPutSel_Click()
'セレクティング送信
Dim Buffer(0 To 2100) As Byte
Dim strData As String
Dim txtLen As Integer
Dim i As Integer
Dim j As Integer
Dim strTxtData As String
Dim bytBuf As Byte
Dim tempBuffer() As Byte
Dim bufLen As Integer
' 文字列から空白削除
strData = Replace(txtOutPutSel.Text, " ", "")
txtLen = Len(strData) / 2
' DLNGH・DLNGL設定
COMM_CODE.DLNGH = "&H" + Left(Format(txtLen, "0000"), 2)
COMM_CODE.DLNGL = "&H" + Right(Format(txtLen, "0000"), 2)
If COMM_CODE.DLNGL = 0 Then
MsgBox "送信データがありません"
Exit Sub
End If
' 送信バッファへ代入
Buffer(0) = COMM_CODE.DLE
Buffer(1) = COMM_CODE.SEL
Buffer(2) = COMM_CODE.DLE
Buffer(3) = COMM_CODE.HA
Buffer(4) = COMM_CODE.DLE
Buffer(5) = COMM_CODE.UA
Buffer(6) = COMM_CODE.DLE
Buffer(7) = COMM_CODE.STX
Buffer(8) = COMM_CODE.DLE
Buffer(9) = COMM_CODE.DLNGH
Buffer(10) = COMM_CODE.DLE
Buffer(11) = COMM_CODE.DLNGL
j = 0
For i = 0 To txtLen - 1 Step 1
strTxtData = Mid(strData, 1 + 2 * i, 2)
bytBuf = CByte("&H" & strTxtData)
Buffer(i + j + 12) = bytBuf
If bytBuf = &H10 Then
j = j + 1
Buffer(i + j + 12) = bytBuf
End If
Next i
Buffer(i + j + 12) = COMM_CODE.DLE
Buffer(i + j + 13) = COMM_CODE.ETX
COMM_CODE.BCC = "&H" & (txtLen + j + 6)
If COMM_CODE.BCC = COMM_CODE.DLE Then
Buffer(i + j + 14) = COMM_CODE.DLE
Buffer(i + j + 15) = COMM_CODE.BCC
bufLen = txtLen + 17
Else
Buffer(i + j + 14) = COMM_CODE.BCC
bufLen = txtLen + 16
End If
ReDim tempBuffer(0 To bufLen - 1)
For i = 0 To bufLen - 1
tempBuffer(i) = Buffer(i)
Next i
ctlComm.Output = tempBuffer
しかし、受信に問題があります。
Buffer(8)の照合の場所でエラーが出てしまいます。
実行時エラー’9’
インデックスが有効範囲にありません。
とエラーが出てしまいます。
おかしいと思う点は、突然、出はじめました。
一度目送信をかけると上手くいき、二度目送信をかけるとエラーとなり
さらに、それ以降はエラーが出続けます。この間プログラムの変更はしていません。
プログラムの変更なしに、上手くいく場合とエラーが出てしまう場合とがあります。
Dim Buffer() As Byte
Buffer = ctlComm.Input
この辺りが怪しいと思い Dim Buffer(0 To 2100) As Byte や Buffer() = ctlComm.Inputにしてみ
たり
色々やってみましたが、どれもエラーになり、手詰まりになってしまいました。
いくつか調べてもみましたが、どうしても解決できないので、またよろしくお願いします。
非常に長く見づらくなってしまっているがお許しください。
以下受信プログラム
Private Sub ctlComm_OnComm()
' 受信データ マトリックス
Dim Buffer() As Byte
Dim strData As String
Dim bufLen As Integer
Dim i As Integer
Dim j As Integer
Dim bufTxt(0 To 2100) As Byte
Dim lenBufTxt As Integer
Dim check As Integer
Dim lenH As Byte
Dim lenL As Byte
Dim Bcc As Byte
' 受信データを受信バッファへ格納
Buffer = ctlComm.Input
' データの有無確認
If ctlComm.CommEvent = comEvReceive Then
bufLen = UBound(Buffer)
Else
MsgBox "データがありません"
Exit Sub
End If
' 受信データを照合
If Buffer(0) <> COMM_CODE.DLE Then
MsgBox "DLEが一致しません。"
Exit Sub
End If
' バイナリーデータ表示
txtInPutSel.Text = ""
For i = 0 To bufLen
txtInPutSel.Text = txtInPutSel.Text + Format(Hex(Buffer(i)), "00") &
" "
Next i
Select Case Buffer(1)
' セレクティングと照合
Case COMM_CODE.SEL
' セレクティング受信処理
If Buffer(2) <> COMM_CODE.DLE Then
MsgBox "Err"
Exit Sub
End If
If Buffer(3) <> COMM_CODE.HA Then
MsgBox "Err"
Exit Sub
End If
If Buffer(4) <> COMM_CODE.DLE Then
MsgBox "Err"
Exit Sub
End If
If Buffer(5) <> COMM_CODE.UA Then
MsgBox "Err"
Exit Sub
End If
If Buffer(6) <> COMM_CODE.DLE Then
MsgBox "Err"
Exit Sub
End If
If Buffer(7) <> COMM_CODE.STX Then
MsgBox "Err"
Exit Sub
End If
If Buffer(8) <> COMM_CODE.DLE Then ←ここでエラーがでます。
MsgBox "Err"
Exit Sub
End If
lenH = Buffer(9)
If Buffer(10) <> COMM_CODE.DLE Then
MsgBox "Err"
Exit Sub
End If
lenL = Buffer(11)
j = 0
i = 0
Do
bufTxt(i) = Buffer(i + j + 12)
If Buffer(i + j + 12) = COMM_CODE.DLE And Buffer(i + j + 13) = COMM_CODE.DLE
Then
bufTxt(i) = Buffer(i + j + 13)
j = j + 1
End If
If Buffer(i + j + 12) = COMM_CODE.DLE And Buffer(i + j + 13) = COMM_CODE.ETX
Then
bufTxt(i) = Buffer(i + j + 12)
bufTxt(i + 1) = Buffer(i + j + 13)
If Buffer(i + j + 14) = COMM_CODE.DLE Then
bufTxt(i + 2) = Buffer(i + j + 14)
bufTxt(i + 3) = Buffer(i + j + 15)
' BCC取得
BCC = Buffer(i + j + 15)
check = 0
Else
bufTxt(i + 2) = Buffer(i + j + 14)
BCC = Buffer(i + j + 14)
check = 1
End If
Exit Do
End If
i = i + 1
Loop
Select Case check
Case 0
lenBufTxt = bufLen - 16
COMM_CODE.DLNGH = Hex(Left(Format(lenBufTxt, "0000"), 2))
COMM_CODE.DLNGL = Hex(Right(Format(lenBufTxt, "0000"), 2))
COMM_CODE.BCC = Hex(lenBufTxt + 6)
Case 1
lenBufTxt = bufLen - 15
COMM_CODE.DLNGH = Hex(Left(Format(lenBufTxt, "0000"), 2))
COMM_CODE.DLNGL = Hex(Right(Format(lenBufTxt, "0000"), 2))
COMM_CODE.BCC = Hex(lenBufTxt + 6)
Case Else
MsgBox "Err"
Exit Sub
End Select
If COMM_CODE.DLNGH <> lenH Then
MsgBox "lenH が一致しない"
Exit Sub
End If
If COMM_CODE.DLNGL <> lenL Then
MsgBox "lenL が一致しない"
Exit Sub
End If
If COMM_CODE.BCC <> BCC Then
MsgBox "BCC が一致しない"
Exit Sub
End If
' セレクティングデータ表示
txtInPutData.Text = ""
For i = 0 To bufLen
txtInPutData.Text = txtInPutData.Text + Format(Hex(bufTxt(i)), "00")
& " "
Next i
labInPutData.Caption = "セレクティング受信"
' NAKと照合
Case COMM_CODE.NAK
If Buffer(2) <> COMM_CODE.DLE Then
MsgBox "Err"
Exit Sub
End If
If Buffer(3) <> COMM_CODE.HA Then
MsgBox "Err"
Exit Sub
End If
If Buffer(4) <> COMM_CODE.DLE Then
MsgBox "Err"
Exit Sub
End If
If Buffer(5) <> COMM_CODE.UA Then
MsgBox "Err"
Exit Sub
Else
' 受信データ表示
txtInPutData.Text = ""
For i = 0 To bufLen
txtInPutData.Text = txtInPutData.Text + Format(Hex(Buffer(i)), "00&quo
t;) & " "
Next i
labInPutData.Caption = "NAK受信"
' RSP送信
End If