|
分類:[VB.NET/VB2005 以降]
VS2008 VB.NET Windowsフォームアプリ
232Cのシリアル通信を使ったアプリを開発しています。
送受信したデータをフォームのテキストBOXに表示させたいのですが、 デリゲートを使ってテキストBOXに表示させようと思ったのですが、 送信時は問題ないのですが、 受信したときに下記のようなエラーになってしまいます。
「ウィンドウ ハンドルが作成される前、コントロールで Invoke または BeginInvoke を呼び出せません。」
このような場合どう対処すればよいでしょうか?
よろしくお願いします。
FormMain.vb Public mCom1 As ComPort
'TextBoxに文字を追加するデリゲート Public Delegate Sub TextWriteLineDelegate(ByVal msg As String) Public Sub TextWriteLine(ByVal msg As String) TextBox1.AppendText(msg & vbCrLf) End Sub
Private Sub Button_Start_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_Start.Click Dim data() As Byte = New Byte(2) {} data = Encoding.Default.GetBytes("TEST") mCom1.SendData(data)
End Sub
ComPort.vb Public Function SendData(ByVal data() As Byte) As Integer Dim ret As Integer = 0 Dim dlg As New FormMain.TextWriteLineDelegate(AddressOf FormMain.TextWriteLine)
Try 'TextBoxに文字を追加 FormMain.Invoke(dlg, New Object() {Encoding.ASCII.GetString(data).ToString()}) '書込み mCom.Write(data, 0, data.Length) FormMain.Invoke(dlg, New Object() {"test"}) Catch ex1 As InvalidOperationException 'ポートが開いていない Console.WriteLine(ex1.Message) Catch ex As Exception Console.WriteLine(ex.Message) End Try Return ret End Function
Private Sub mCom_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles mCom.DataReceived Dim size As Integer Dim data As Integer Dim dlg As New FormMain.TextWriteLineDelegate(AddressOf FormMain.TextWriteLine)
Try size = mCom.BytesToRead() If size <> 0 Then
While size <> 0 'バッファから受信 data = mCom.ReadByte() 'TextBoxに文字を追加 FormMain.Invoke(dlg, New Object() {data.ToString()}) End While End If Catch ex As Exception Console.WriteLine(ex.Message) End Try End Sub
|