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

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

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

Re[1]: VB2010SerialPort処理について


(過去ログ 118 を表示中)

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

■69582 / inTopicNo.1)  VB2010SerialPort処理について
  
□投稿者/ くま (34回)-(2014/01/09(Thu) 22:03:05)

分類:[.NET 全般] 

VB2010でシリアル送受信のプログラムを作成しています。
OS:WinXPです

ある装置から、シリアルでSTX・・・ETXのデータが自発的に送られてきます。
自発データのうち、ある決まったデータの場合に、PCからコマンドを装置に
送る処理を行うのですが、その応答を受信するのに20秒近くかかります。

Private Sub SerialPort_DataReceived(sender As Object, e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort.DataReceived

    select case 受信データ

case ある決まったデータ
       call コマンド送信
    end select

End Sub

シリアルポート受信処理内で、コマンドを送信するからその応答が遅くなっていると思うのですが
他にどんなコードで実現できるのかわかりません。
ご存知の方教えて頂けないでしょうか。
以上、よろしくお願い致します。
引用返信 編集キー/
■69585 / inTopicNo.2)  Re[1]: VB2010SerialPort処理について
□投稿者/ オショウ (119回)-(2014/01/10(Fri) 00:32:25)
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秒もロスするようなことは無くなるはずです。

以上。参考まで

引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -