- 締切済み
rs232cでの受信データ(mscomm)の受信方法VB6
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バイトづづ格納していくなどというようにできたらよいのですが、、、 他にも簡単な方法があったらよいのですが、、、 よろしくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- khazad-lefty
- ベストアンサー率44% (296/668)
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 という感じで。とにかくループは来たデータのデータ長で単純に回すということがポイントだと思います。
- otto0001otto
- ベストアンサー率25% (64/249)
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を検出したら、処理を行ないます。
お礼
回答ありがとうございます。 試してみたのですが、text1には何も表示されなかったです。 初心者なもので、やり方がまずいのだと思うのですが、、。 参考にさせていただきます。ありがとうございました。 また、プログラムをVB2005で書く必要ができたために、 これから回答くださる方、できればVB2005での記述をお願いします。