Serial受信中にテキスト表示 への返答
投稿で使用できる特殊コードの説明。(別タブで開きます。)
以下の返答は逆順(新しい順)に並んでいます。
投稿者 魔界の仮面弁士  (社会人)
投稿日時
2019/6/18 14:17:57
DataReceivedイベントが動作するスレッドは、UI スレッドではありません。
それぞれ別のスレッドなので、通信中にフォームのコントロールなどを
直接操作することは禁じられています。
(案1)SynchronizationContext クラスを用いて、各スレッドの処理を同期させる
https://devlights.hatenablog.com/entries/2009/03/19
(案2) Invoke/BeginInvoke メソッドを通じて、コントロールに対して処理を依頼する
https://www.atmarkit.co.jp/ait/articles/0506/17/news111.html
それぞれ別のスレッドなので、通信中にフォームのコントロールなどを
直接操作することは禁じられています。
(案1)SynchronizationContext クラスを用いて、各スレッドの処理を同期させる
https://devlights.hatenablog.com/entries/2009/03/19
(案2) Invoke/BeginInvoke メソッドを通じて、コントロールに対して処理を依頼する
https://www.atmarkit.co.jp/ait/articles/0506/17/news111.html
投稿者 素人  (学生)
投稿日時
2019/6/18 10:36:23
Serialポートを使用してデータの受信を行っています。
◆実現したいこと
例えば、
受信データが"A"だった場合は、TextBox11.Text="正常"
受信データが"B"だった場合は、TextBox11.Text="異常" と表示させたいです。
◆今の状況
Serialポートを使用してデータの受信はできました。
しかし、SerialPort1_DataReceivedイベントないで、TextBox11.Textの表示をさせようとしたところ、次のエラーが出てしまい、エラーの内容と原因が分からず困っております。
◆エラーメッセージ
System.InvalidOperationException
HResult=0x80131509
Message=有効ではないスレッド間の操作: コントロールが作成されたスレッド以外のスレッドからコントロール 'TextBox11' がアクセスされました。
◆試しているコード
Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
If SerialPort1.IsOpen = False Then
Return
End If
TextBox11.Text = "テスト中"
Try
Dim data As String
data = SerialPort1.ReadExisting()
Invoke(New Delegate_RcvDataToTextBox(AddressOf Me.RcvDataToTextBox), args)
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
◆実現したいこと
例えば、
受信データが"A"だった場合は、TextBox11.Text="正常"
受信データが"B"だった場合は、TextBox11.Text="異常" と表示させたいです。
◆今の状況
Serialポートを使用してデータの受信はできました。
しかし、SerialPort1_DataReceivedイベントないで、TextBox11.Textの表示をさせようとしたところ、次のエラーが出てしまい、エラーの内容と原因が分からず困っております。
◆エラーメッセージ
System.InvalidOperationException
HResult=0x80131509
Message=有効ではないスレッド間の操作: コントロールが作成されたスレッド以外のスレッドからコントロール 'TextBox11' がアクセスされました。
◆試しているコード
Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
If SerialPort1.IsOpen = False Then
Return
End If
TextBox11.Text = "テスト中"
Try
Dim data As String
data = SerialPort1.ReadExisting()
Invoke(New Delegate_RcvDataToTextBox(AddressOf Me.RcvDataToTextBox), args)
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
ありがとうございました。