2014/01/10(Fri) 00:32:47 編集(投稿者)
■No69582 (くま さん) に返信
DataReceivedイベントで処理されるということは、非同期処理を行われる設定に
なっていると思いますが、受信割り込みと言う意味では、ReceivedBytesThreshold
は、1 byte にされていますか?
それと、DataReceivedイベントは、データ受信以外の制御線等の変化でもイベント
が発生しますので、受信データのみに応答するように判定機能を入れないといけま
せん。
If e.EventType = SerialData.Chars Then
' 受信データがある場合の処理
End If
あと、STX〜ETX と言うデータフォーマットであれば・・・
Public Overridable Sub OnReceive(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs)
Dim dev As SerialPort
Dim sz As String
dev = DirectCast(sender, SerialPort)
If e.EventType = SerialData.Chars Then
sz = dev.ReadTo(DATA_END_CODE)
If sz <> String.Empty Then
RaiseEvent ReceiveData(sz)
End If
End If
End Sub
と書けます。受信データは、RaiseEvent で返してますが、これはシリアル通信機能を
別クラスに定義し、DLL化している為です。
dev.ReadTo(...) を使うと、所定の文字を受信するまで待たれるので、CPU負荷を
低減でき非同期受信の機能を最大限に生かせます。
この場合の、DATA_END_CODE には、ETX を文字コードとして指定します。
今回、欲しい機能としては、RaiseEventしている部分に、STX〜ETXまでの受信した文
字列を判断し、返信する機能が必要となります。が、その辺はお解りになるでしょう
正しく導入できれば、受信した瞬間に応答文字列を送信できるようになりますので、
20秒もロスするようなことは無くなるはずです。
以上。参考まで