[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2005/07/19(Tue) 13:35
投稿者名:チロル
Eメール:
URL :
タイトル:
MSCommバイナリーデータ受信処理
主な目的は、A・B 二台のPCを使い通信を行います。Aからポーリングやレスポンスの数種類の電文を
送信し、Bでそのデータを受信し、その受信データを照合し、どの電文が送信されたかを判別するプロ
グラムを作成することです。

自分の考えと過去ログなどの参考資料を見合わせてやってることは、
・バイナリーデータを受信し、一度、受信データを丸ごとバッファーへ格納する。
・バッファーに入ったデータを1バイドづつ照合し、受信データが正しいかどうかの判断をさせる。
です。

参考資料などから、いくつか参考にさせてもらったのですが、どうしても上手く動作させられず、悩
んでいます。
現在、送信側は問題なく送信されています。受信側が正常に動作しません。エラーは出ていません。
        ' 受信データを受信バッファへ格納
        Buffer = MSComm1.Input
        ' データ照合
        If Len("Buffer") = 6 Then
という箇所でそこから先、照合しているつもりなのですが、Buffer側のデータが上手く代入できてい
ません。
デバック時、COMM_CODE側は2〜3桁の数字が格納されています。Buffer側はカーソルを持っていっても
反応なしです。

私はまだまだ経験が浅く、思わぬ場所でミスをしている可能性があります。また、それが判断できま
せん。
どうか、動作だけでなく何かお気づきの点がございましたらご教授お願いします。

   ' 制御コード初期化
   ' 全てByte型です。
    With COMM_CODE
        .STX = &H2
        .ETX = &H3
        .ENQ = &H5
        .ACK = &H6
        .DLE = &H10
        .NAK = &H15
        .POL = &H70
        .SEL = &H71
        .RSP = &H72
        .HA = &H80
        .UA = &H8A
    End With

Private Sub cmdOutPutPol_Click()
    ' ポーリング送信
    Dim Buffer(5) As Byte
    
    Buffer(0) = COMM_CODE.DLE
    Buffer(1) = COMM_CODE.POL
    Buffer(2) = COMM_CODE.DLE
    Buffer(3) = COMM_CODE.UA
    Buffer(4) = COMM_CODE.DLE
    Buffer(5) = COMM_CODE.HA
    MSComm1.Output = Buffer
End Sub

Private Sub cmdInPutPol_Click()
    ' ポーリング受信
    Dim Buffer() As Byte
    
    MSComm1.InputLen = 0
    MSComm1.RThreshold = 1
    MSComm1.SThreshold = 1
    MSComm1.InBufferCount = 0
    MSComm1.InputMode = comInputModeBinary
    
    ' 受信バッファのデータの有無を確認
    Select Case MSComm1.CommEvent
    Case comEvReceive
        ' 受信データを受信バッファへ格納
        Buffer = MSComm1.Input
        ' データ照合
        If Len("Buffer") = 6 Then
'            If Buffer(0) <> COMM_CODE.DLE Then MsgBox "DLE 1 NG"
'            If Buffer(1) <> COMM_CODE.POL Then MsgBox "POL NG"
'            If Buffer(2) <> COMM_CODE.DLE Then MsgBox "DLE 2 NG"
'            If Buffer(3) <> COMM_CODE.UA Then MsgBox "UA NG"
'            If Buffer(4) <> COMM_CODE.DLE Then MsgBox "DLE 3 NG"
'            If Buffer(5) <> COMM_CODE.HA Then MsgBox "HA NG"
            If Mid(Buffer, 1, 1) <> COMM_CODE.DLE Then MsgBox "DLE 1 NG"
            If Mid(Buffer, 2, 1) <> COMM_CODE.POL Then MsgBox "POL NG"
            If Mid(Buffer, 3, 1) <> COMM_CODE.DLE Then MsgBox "DLE 2 NG"
            If Mid(Buffer, 4, 1) <> COMM_CODE.UA Then MsgBox "UA NG"
            If Mid(Buffer, 5, 1) <> COMM_CODE.DLE Then MsgBox "DLE 3 NG"
            If Mid(Buffer, 6, 1) <> COMM_CODE.HA Then MsgBox "HA NG"
        End If
    End Select
End Sub

投稿時間:2005/07/19(Tue) 16:43
投稿者名:GOD
Eメール:
URL :
タイトル:
Re: MSCommバイナリーデータ受信処理
>     MSComm1.InputLen = 0
>     MSComm1.RThreshold = 1
>     MSComm1.SThreshold = 1
>     MSComm1.InBufferCount = 0
>     MSComm1.InputMode = comInputModeBinary
>    
ヘルプを読んで理解してください。

>         If Len("Buffer") = 6 Then
>
条件が常にTrueになりますが・・・

>If Mid(Buffer, 1, 1) <> COMM_CODE.DLE Then MsgBox "DLE 1 NG"
>
文字列と数値を比較するようになってますね。
そもそもBufferって文字列じゃない見たいですが。

投稿時間:2005/07/19(Tue) 17:22
投稿者名:チロル
Eメール:
URL :
タイトル:
Re^2: MSCommバイナリーデータ受信処理
GODさんアドバイス有難うございます。
私にはまだGODさんのアドバイスを受け取るだけの技量がないみたいなので私なりの解釈をします。
間違っているでしょうが、どうか訂正お願いします。

' データを一括で受信できるようにする
MSComm1.InputLen = 0
' データを一括で受信できるようにする
MSComm1.InBufferCount = 0
' 1バイト受信毎にOnCommイベント発生
MSComm1.RThreshold = 1
' 送信バッファ空でOnCommイベント発生
'MSComm1.SThreshold = 1
' バイナリーで取得するようにする
MSComm1.InputMode = comInputModeBinary
と認識しています。
Private Sub cmdOutPutPol_Click() を Private Sub MSComm1_OnComm()にし
MSComm1.SThreshold = 1をコメントアウトしました。

If Len("Buffer") = 6 Then
>条件が常にTrueになりますが・・・
申し訳ございません。理解することができません。

>If Mid(Buffer, 1, 1) <> COMM_CODE.DLE Then MsgBox "DLE 1 NG"
>文字列と数値を比較するようになってますね。
>そもそもBufferって文字列じゃない見たいですが。
まずBufferというバイナリーデータを数値に変換することが先なのでしょうか・・?!

投稿時間:2005/07/19(Tue) 18:00
投稿者名:GOD
Eメール:
URL :
タイトル:
Re^3: MSCommバイナリーデータ受信処理
> ' データを一括で受信できるようにする
> MSComm1.InBufferCount = 0
>
--- MSDNから抜粋
InBufferCount プロパティを 0 に設定すると、受信バッファをクリアすることができます。
--- ここまで

受信ボタンを押下するたびに毎回、初期化しているみたいですが、なぜでしょうか。
ポートのオープン前に一度初期化すればいいと思うのですが。

>  If Len("Buffer") = 6 Then
> >条件が常にTrueになりますが・・・
> 申し訳ございません。理解することができません。
>
"Buffer"は""で囲まれているのでBuffer という文字列です。
Len("Buffer")はBufferという文字列が6文字であるか比較しています。
その結果、条件は常にTrueを返します。
さらにいうとBuffer変数はByte配列として宣言しています。
MSComm1.InputMode = comInputModeBinary
を設定することによりMSComm1.Inputは
--- MSDNから抜粋
バイナリ データがバリアント型のバイト配列で読み取られます。
--- ここまで
となっていますので、受信バイト数は配列の次元と比較するべきです。
if Ubound(Buffer) = 5 Then
↑5と比較したのは通常なにも指定しない(Option Baseステートメント)と0〜5の要素を使用して6Byte格

します。UBoundは次元の最大値を返す為に5となります。
ヘルプと実験で理解してください。

> >If Mid(Buffer, 1, 1) <> COMM_CODE.DLE Then MsgBox "DLE 1 NG"
> >文字列と数値を比較するようになってますね。
> >そもそもBufferって文字列じゃない見たいですが。
> まずBufferというバイナリーデータを数値に変換することが先なのでしょうか・・?!
' If Buffer(0) <> COMM_CODE.DLE Then MsgBox "DLE 1 NG"
のコメントを外して使用すればいいはずです。

投稿時間:2005/07/19(Tue) 18:36
投稿者名:チロル
Eメール:
URL :
タイトル:
Re^4: MSCommバイナリーデータ受信処理
GODさん度々アドバイス有難うございます。

>受信ボタンを押下するたびに毎回、初期化しているみたいですが、なぜでしょうか。
>ポートのオープン前に一度初期化すればいいと思うのですが。
”データ受信の度に初期化”と誤った認識をしていました。
”ポートのオープン前に初期化”と認識します。

>"Buffer"は""で囲まれているのでBuffer という文字列です。
>Len("Buffer")はBufferという文字列が6文字であるか比較しています。

最初Len(Buffer)”コンパイルエラー 変数が必要です”とエラーが出てしまったため、安易に””で囲
ってしまいました。
受信データが6バイト固定だったのと”Buffer”がタマタマ6文字だったのとで・・・とてもお恥ずか
しい。

Uboundの説明に関し、とても丁寧にありがとうございます。
Ubound関数を調べました。なんとか理解できそうです。

GODさん、まだ素人な私の質問に答えてくれて本当に有難うございました。
すごく丁寧でわかりやすかったです。おかげで解決することができました。


以下、修正したプログラム

Private Sub Form_Load()
    ' ポート開放
    MSComm1.PortOpen = True
    ' 初期化 初期設定
    MSComm1.RThreshold = 1
    MSComm1.InputLen = 0
    MSComm1.InBufferCount = 0
    MSComm1.InputMode = comInputModeBinary
End Sub

Private Sub ctlComm_OnComm()
    ' ポーリング受信
    Dim Buffer() As Byte    
    ' 受信データを受信バッファへ格納
    Buffer = MSComm1.Input
    If MSComm1.CommEvent = comEvReceive Then
        If UBound(Buffer) = 5 Then
            If Buffer(0) <> COMM_CODE.DLE Then MsgBox "DLE 1 NG"
            If Buffer(1) <> COMM_CODE.POL Then MsgBox "POL NG"
            If Buffer(2) <> COMM_CODE.DLE Then MsgBox "DLE 2 NG"
            If Buffer(3) <> COMM_CODE.UA Then MsgBox "UA NG"
            If Buffer(4) <> COMM_CODE.DLE Then MsgBox "DLE 3 NG"
            If Buffer(5) <> COMM_CODE.HA Then MsgBox "HA NG"
        End If
    Else
        Exit Sub
    End If
End Sub

投稿時間:2005/07/19(Tue) 18:38
投稿者名:チロル
Eメール:
URL :
タイトル:
Re^5: MSCommバイナリーデータ受信処理
>”ポートのオープン前に初期化”と認識します。
”ポートのオープン毎に初期化”と認識します。
とんでもない誤字です。(汗