• 締切済み

MSCommについて

↓例の桁数、データブロックが不定で連続して受信されます。 最後の1桁は(ETX)です。 (STX)XXXXXX...(ETX)(STX)XXXXX...(FS)XXXXX...(ETX)(STX)XXXXX.......(FS)XXXX...............(ETX) すべての桁数、データブロックが対象なので一度に受信します。 1. 質問はInputプロパティで1桁ずつデータをREC変数に読み込んで、ある条件で、Loop分を抜けたいのですが、 VB6の定義方法がわかりません。 1-1.最後の(ETX)の読み込み 1-2.先頭30桁  MSComm1.InBufferCount = 0 MSComm1.InputLen = 1 Dim REC As String Do DoEvents If MSComm1.InBufferCount Then REC = REC & MSComm1.Input If ..... '最後の(ETX)の読み込み '先頭30桁 Exit Do End If   End If Loop 2. スピート重視で処理するために、InBufferCountに値があったら、すべての受信データをRECにいれたいのですが 取得できていません。 アドバイスはございますか? MSComm1.InBufferSize = 2048 MSComm1.InBufferCount = 0 MSComm1.InputLen = 0 Dim REC As String Do DoEvents If MSComm1.InBufferCount >= 1 Then Exit Do End If Loop REC = MSComm1.Input

みんなの回答

回答No.2

何度も同種の質問を繰り返されているようですが。 まずはMSDNや参考書にサンプルコードはいくらでも載っていますからそれを理解することですね。 全く進歩が見られません。

すると、全ての回答が全文表示されます。
回答No.1

もし、受信したブロックが最終ブロックだと判定する方法があるなら OnCommイベントの中で処理したいなら、 CommEventプロパティがcomEvReceiveのときに While MSComm1.InBufferCount <> 0 DoEvents TotalBuffer$ = TotalBuffer$ & MSComm1.Input If Right$(Buffer$, 1) = Chr(3) Then ' Buffer$の先頭がSTXなら、正常なブロックとする。 If Left$(Buffer$, 1) = Chr(2) Then ' TotalBuffer$ = ToTalBuffer$ & Buffer$ If (Buffer$が最後のブロックかどうかの判定) Then Call hogehoge(TotalBuffer$) ' 全ブロックの処理を呼ぶ TotalBuffer$ = "" End If End If Buffer$ = "" End If Wend とすれば、STXからETXまでを1ブロックとして受信し、最後のブロックを受信したら、 これまで受信したすべてのブロックを渡してhogehoge()で処理できます。 ただし、予め MSComm1.RThreshold = 1 MSComm1.InputLen = 1 と設定する必要があります。 それとも、最終ブロックの判定はデータ送信に間が空いたことでしか判らないのでしょうか?

noname#187796
質問者

お礼

ありがとうございました。 >最終ブロックの判定はデータ送信に間が空いたことでしか判らないのでしょうか? はい、デバッカーで↓コード、連結したBuffer$をみると各ブロック間が空いています。 あと、OnCommイベントの中で処理はこのケースでは使用しません。 一つ解らないことがございます。 8秒以上待って、連結処理を開始するとすべてのデータがBuffer$に取れています。 Sleepの指定をしないと、1桁もデータが取れていません。 考えられる原因・対策をお分かりましたら教えていただけないでしょうか? 対策はございますか? Dim Buffer$ MSComm1.Handshaking=3 MSComm1.InBufferSize = 2048 MSComm1.InBufferCount = 0 MSComm1.InputLen = 1 Sleep 8000 While MSComm1.InBufferCount <> 0 DoEvents   Buffer$ = Buffer$ & MSComm1.Input Wend

すると、全ての回答が全文表示されます。

関連するQ&A