C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: SerialPortで複数のデータを受信したい


(過去ログ 139 を表示中)

[トピック内 2 記事 (1 - 2 表示)]  << 0 >>

■81770 / inTopicNo.1)  SerialPortで複数のデータを受信したい
  
□投稿者/ しりある (1回)-(2016/11/11(Fri) 12:15:41)

分類:[VB.NET/VB2005 以降] 

VB2010
Win7

シリアル通信のプログラムを作成しています。
一対一の送受信は可能なのですが、受信が複数ある場合に
2つ目以降のデータを取りこぼす現象が発生しています。
プログラムは以下になります。
ご存知の方教えてください。

送信、受信データともに、STX,ETXで囲まれた文字列データになります。

送信ソース
SerialPort1.Close
SerialPort1.NewLine=Chr(&H3)
SerialPort1.Open
SerialPort1.Writeline(Chr(&H2)+"aaa")

受信ソース
Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived

With sender

If .IsOpen = False Or e.EventType <> IO.Ports.SerialData.Chars Then Exit Sub
m_RcvData = m_RcvData + .ReadLine
End With

End Sub


フローとしては
送信:STX+"aaa"+ETX
受信:STX+"bbb"+ETX
の場合は、受信データの取得はできるのですが、

送信:STX+"aaa"+ETX
受信:STX+"bbb"+ETXSTX+"ccc"+ETX
の場合は、STX+"ccc"+ETX
のデータを受信できない状態です。1つ目のデータを受信終えたところで、
DataReceivedが発生しないのでしょうか。

以上、よろしくお願いいたします。
引用返信 編集キー/
■81780 / inTopicNo.2)  Re[1]: SerialPortで複数のデータを受信したい
□投稿者/ 774RR (458回)-(2016/11/14(Mon) 11:02:45)
DataReceived は1バイトの受信とか1行の受信とかで毎回発生するわけではないのでそうなります。
(特に USB/COM 変換器を使っていると USB 上バルク転送となるのでその傾向が強まります)

今回の例では bbb と ccc の転送が終わった後で1回だけ発生しているのでしょう。
それに対して現コードは ReadLine を1回だけ発行しています。
つまり bbb を受信して終了しているので ccc は捨てちゃってます。
データがある限り ReadLine するよう修正する必要があるでしょう。

オイラなら ETX を受信し損ねた場合のエラーハンドルとか考えると ReadLine を使う気になりません。
全データをバイト列で送受信し STX/ETX の分解は自分でやるでしょう。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -