• 締切済み

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バイトづづ格納していくなどというようにできたらよいのですが、、、 他にも簡単な方法があったらよいのですが、、、 よろしくお願いいたします。

みんなの回答

回答No.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 という感じで。とにかくループは来たデータのデータ長で単純に回すということがポイントだと思います。

回答No.1

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を検出したら、処理を行ないます。

kiyume
質問者

お礼

回答ありがとうございます。 試してみたのですが、text1には何も表示されなかったです。 初心者なもので、やり方がまずいのだと思うのですが、、。 参考にさせていただきます。ありがとうございました。 また、プログラムをVB2005で書く必要ができたために、 これから回答くださる方、できればVB2005での記述をお願いします。