VB6.0用掲示板の過去のログ(No.2)−VBレスキュー(花ちゃん)
[記事リスト] [新規投稿] [新着記事] [ワード検索] [管理用]

投稿日: 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送信


- 関連一覧ツリー (★ をクリックするとツリー全体を一括表示します)

- 返信フォーム (この記事に返信する場合は下記フォームから投稿して下さい)

- VBレスキュー(花ちゃん) - - Web Forum -