none
SerialPortの割り込み処理について(Visual Basic) RRS feed

  • 質問

  • Visual Studio 2010 Professional評価版を使っています。

    Visual Basicで、外部装置とSerial Portでデータをやり取りするプログラムを作成しています。

    データを送信する事はできるようになったのですが、データを受信した時に割り込みイベントを発生させて、処理を行う事ができません。

    もう少し具体的に書きますと、外部装置から文字列が送られてきたら、その文字列をEvent drivenで検出し、TextBoxに表示させたいのです。

    どなたか、ご教示頂けませんでしょうか?

    何卒,よろしくお願い申し上げます。

    2011年6月10日 6:24

回答

  • WindowsFormの場合の簡単な例
    フォームにツールボックスからSerialPortを貼り付け。
    追加されたSerialPortを選択して、プロパティウィンドウでDataReceivedイベントを作ります。
    あとは以下のようなコードでTextBoxに表示できます。
    Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) _
    Handles SerialPort1.DataReceived
      Dim strReceiveData As String = SerialPort1.ReadExisting()
      'イベントは別スレッドで発生するのでフォームのスレッドに同期させる必要があります。
      Dim action As Action(Of String) = AddressOf AppendTextBox
      Me.Invoke(action, strReceiveData)
    End Sub
    
    Private Sub AppendTextBox(ByVal s As String)
      Me.TextBox1.AppendText(s)
    End Sub
    


    • 回答の候補に設定 山本春海 2011年6月29日 5:15
    • 回答としてマーク 山本春海 2011年7月4日 8:32
    2011年6月10日 10:38
  •  何となく、書かれていることから読み取れること(シリアルポートの読み取りを、イベント ドリブンで行う)と、発生している問題が異なっているように思いました。

     SerialPort.DataReceived イベントにハンドラを設定して、その中で受信は出来ていますよね?で、受信した内容を、UI に表示しようとすると、不定なタイミング(Debug モードだと、いつも、かな?)で例外が発生しているのではないですか?発生している事象、困っている内容は、守秘義務に反しない程度に詳しく書かないと、解決から遠ざかりますよ。

     で、そうだとすると、C# ですが、この様なスレッドがありました。serialPortコンポーネント DataReceivedイベントについてご教授ください。


    Jitta@わんくま同盟
    • 回答の候補に設定 山本春海 2011年6月29日 5:15
    • 回答としてマーク 山本春海 2011年7月4日 8:32
    2011年6月13日 12:20
  • あと、くどいようですが、環境はしっかりお書きになったようがよろしいかと。

    仮想化していたり、USB⇔シリアル変換をしていたり、64bit OSを利用していたりなどで、場合によっては機器やドライバとの相性問題などが発生して涙することもありますので……
    #泣かされましたともorz

    コードは正しいのに、うまくいかない場合は、フロー制御などを疑うとともに、使用している機器も疑ってみてください。
    #もし、コードそのものがわからないというのであれば、まずはgekkaさんのコードをご確認くださいm(_ _)m

     

     

    • 回答の候補に設定 山本春海 2011年6月29日 5:15
    • 回答としてマーク 山本春海 2011年7月4日 8:32
    2011年6月13日 18:47

すべての返信

  • WindowsFormの場合の簡単な例
    フォームにツールボックスからSerialPortを貼り付け。
    追加されたSerialPortを選択して、プロパティウィンドウでDataReceivedイベントを作ります。
    あとは以下のようなコードでTextBoxに表示できます。
    Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) _
    Handles SerialPort1.DataReceived
      Dim strReceiveData As String = SerialPort1.ReadExisting()
      'イベントは別スレッドで発生するのでフォームのスレッドに同期させる必要があります。
      Dim action As Action(Of String) = AddressOf AppendTextBox
      Me.Invoke(action, strReceiveData)
    End Sub
    
    Private Sub AppendTextBox(ByVal s As String)
      Me.TextBox1.AppendText(s)
    End Sub
    


    • 回答の候補に設定 山本春海 2011年6月29日 5:15
    • 回答としてマーク 山本春海 2011年7月4日 8:32
    2011年6月10日 10:38
  •  何となく、書かれていることから読み取れること(シリアルポートの読み取りを、イベント ドリブンで行う)と、発生している問題が異なっているように思いました。

     SerialPort.DataReceived イベントにハンドラを設定して、その中で受信は出来ていますよね?で、受信した内容を、UI に表示しようとすると、不定なタイミング(Debug モードだと、いつも、かな?)で例外が発生しているのではないですか?発生している事象、困っている内容は、守秘義務に反しない程度に詳しく書かないと、解決から遠ざかりますよ。

     で、そうだとすると、C# ですが、この様なスレッドがありました。serialPortコンポーネント DataReceivedイベントについてご教授ください。


    Jitta@わんくま同盟
    • 回答の候補に設定 山本春海 2011年6月29日 5:15
    • 回答としてマーク 山本春海 2011年7月4日 8:32
    2011年6月13日 12:20
  • あと、くどいようですが、環境はしっかりお書きになったようがよろしいかと。

    仮想化していたり、USB⇔シリアル変換をしていたり、64bit OSを利用していたりなどで、場合によっては機器やドライバとの相性問題などが発生して涙することもありますので……
    #泣かされましたともorz

    コードは正しいのに、うまくいかない場合は、フロー制御などを疑うとともに、使用している機器も疑ってみてください。
    #もし、コードそのものがわからないというのであれば、まずはgekkaさんのコードをご確認くださいm(_ _)m

     

     

    • 回答の候補に設定 山本春海 2011年6月29日 5:15
    • 回答としてマーク 山本春海 2011年7月4日 8:32
    2011年6月13日 18:47