- ベストアンサー
MSCommのCommEventプロパティで通信エラーのイベントを取得できない場合の対策は?
- COMポートは正常に機能しているのに、MSCommのCommEventプロパティで通信エラーのイベントを取得できません。データ受信ができない理由と対策を教えてください。
- MSComm1.InBufferCountの値が正しくないため、データの受信ができません。質問のコードで、通信エラーのイベントを取得する方法を教えてください。
- MSCommのCommEventプロパティで通信エラーのイベントを取得するためには、正しくCOMポートを機能させる必要があります。データ受信ができない場合の対策を説明してください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
OnCommイベントの中で処理したいなら、 CommEventプロパティがcomEvReceiveのときに While MSComm1.InBufferCount <> 0 DoEvents Buffer$ = Buffer$ & MSComm1.Input If Right$(Buffer$, 1) = Chr(3) Then ''' 1ブロック受信した時の処理をここに書く ''' ' Buffer$の先頭がSTX以外なら、通信失敗なのでこのブロックは捨てる。 If Left$(Buffer$, 1) = Chr(2) Then Call hogehoge(Buffer$) ' 処理を呼ぶ End If Buffer$ = "" End If Wend とすれば、STXからETXまでのブロックを渡してhogehoge()で処理できます。 ただし、予め MSComm1.RThreshold = 1 MSComm1.InputLen = 1 と設定する必要があります。 >提示いただいたコードでは、"(STX)IJKL...(ETX)"しか取得できません。 複数のブロックをいっぺんに受信したいのでしょうか? 提示したコードは、1ブロックずつ処理するようになっています。(今回のコードも)
その他の回答 (1)
- Hayashi_Trek
- ベストアンサー率44% (366/818)
CommEventプロパティは、通常OnComm イベントの中で使います。 その値はOnComm イベントが発生しないと変化しません。 データを読み込むだけなら Dim Buffer As String Do '5桁受信するまで待機 DoEvents Loop Until MSComm1.InBufferCount >= 5 Buffer$ = MSComm1.Input で十分だと思います。 送られるデータが改行コードで一区切りのブロックになるならば Dim Buffer As String MSComm1.InputLen = 1 Do DoEvents If MSComm1.InBufferCount <> 0 Then Buffer$ = Buffer$ & MSComm1.Input If Right$(Buffer$, 1) = vbCr Then ''' 1ブロック受信した時の処理をここに書く ''' Buffer$ = "" End If End If Loop でどうでしょう。
補足
1. ケーブルが外れているなど、データ送受信に装置接続が取れていないときを想定して OnCommイベントを設定しておきたいのですが、 ↓のようにしておけば良いのでしょうか? Private Sub MSComm1_OnComm() Select Case MSComm1.CommEvent '通信ポートのチェック Case comEvReceive 'OK Buffer$ = MSComm1.Input Case Else 'NG ・ ・ End Select End Sub 2. マンドデータ送信後、ASCII制御文字で囲まれた↓例の桁数、データブロックが不定で連続して受信されます。 最後の1桁は(ETX)です。 (STX)IJKL...(ETX)(STX)ABCD...(FS)EFGH...(ETX)(STX)MNOP........(FS)QRST...............(ETX) このようなときは、提示いただいたコードでは、"(STX)IJKL...(ETX)"しか取得できません。 この対策を教えていただけないでしょうか? Dim Buffer As String MSComm1.InputLen = 1 Do DoEvents If MSComm1.InBufferCount <> 0 Then Buffer$ = Buffer$ & MSComm1.Input If Right$(Buffer$, 1) = Chr(13) Then ''' 1ブロック受信した時の処理をここに書く ''' Buffer$ = "" End If End If Loop
補足
ありがとうございます。 データ受信の件、複数のブロックを一度に受信したいです。 しかし、必要なデータは先頭30桁だけです。 1. しかし、↓例のようにするとタイムアウトで抜けないとDo-Loop間でループしずつけてしまいます。 MSComm1.InputLen = 0 Dim Buffer As String Do '30桁受信するまで待機 DoEvents 'タイムアウト設定 Exit Do Loop Until MSComm1.InBufferCount >= 30 Buffer$ = MSComm1.Input また、MSComm1.InBufferCountから先頭30桁だけ、Mid関数などで取り出せば良いのでしょうか? できるだけ、処理に時間をかけたくございません。 対策はございますか? 2. 複数のブロックを一度に受信する場合は、↓例のようにしていますが 桁数が多いので時間がかかります。 アドバイスございますか? Dim Buffer As String MSComm1.InputLen = 0 Do DoEvents If MSComm1.InBufferCount Then Buffer$ = Buffer$ & MSComm1.Input End If 'タイムアウト設定 Do Exit Loop