プロが教える店舗&オフィスのセキュリティ対策術

VB6で、シリアル通信プログラムを作っています。
機器からレスポンスが、02 00 44 03 61 62 63 03 72 0Dと9バイトくるのですが、
8バイト受信した後に、また、最後の0Dを1バイト目として受信しているので困っています。
on commイベントで以下のようにして受信データをテキストボックスに表示しているのですが、

Select Case MSComm1.CommEvent
  Case comEvReceive
      Dim Buffer() As Byte
      Buffer() = MSComm1.Input
      For t = 0 To 6 + Buffer(3)  ,BUffer(3)はデータ長です。
      Text1.Text = Text1.Text & Hex$(Buffer(t)) & Chr(&H3A)
      Next t
8バイト表示した後、1バイト受信が起こるので、Buffer(3)が範囲外となりエラーが起こります。
inputLenは0にしています。
この問題は解決するにはどうしたらよいでしょうか?
0Dは終了コードです。0Dを受信するまで、きちんと1バイトづづ格納していくなどというようにできたらよいのですが、、、
他にも簡単な方法があったらよいのですが、、、
よろしくお願いいたします。

A 回答 (2件)

CommEventの受信って、別に1通信単位を認識して決まったタイミングで起こるものじゃなかった記憶が…。


なので、6 + Buffer(3)みたいに固定の長さでループをまわすことに無理があると思います。
とりあえず来たデータをすべて文字列なりに格納して、終了判断などはその後行えばいいのでは?

たとえば、bufStr as string をモジュール変数で定義して、
      For t = 0 To ubound(Buffer)  ,BUffer(3)はデータ長です。
      if Buffer(t)=&h0D then
       Text1.Text =bufStr
      bufStr = ""
      else
      bufStr = bufStr & Hex$(Buffer(t)) & Chr(&H3A)
      end if
      Next t

という感じで。とにかくループは来たデータのデータ長で単純に回すということがポイントだと思います。
    • good
    • 0

Select Case MSComm1.CommEvent


Case 2
Inp$ = MSComm1.Input
InpStr = InpStr + Inp
If Inp = Chr(13) Then
RcvData = InpStr
InpStr = ""
Text1.Text = Text1.Text & vbCrLf & RcvData
End If
End Select

のようにして、1行ずつ取得すればどうですか?
0Dを検出したら、処理を行ないます。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
試してみたのですが、text1には何も表示されなかったです。
初心者なもので、やり方がまずいのだと思うのですが、、。
参考にさせていただきます。ありがとうございました。

また、プログラムをVB2005で書く必要ができたために、
これから回答くださる方、できればVB2005での記述をお願いします。

お礼日時:2006/10/25 20:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!