シリアル ポートから 12 バイトの 16 進文字列を読み取ってテキスト ボックスに表示できるアプリケーションを作成しようとしています。ソースは、RS232-USB コンバーターを使用して USB ポートに接続されている RFID モジュールです。
私の最初の問題は、無効なクロススレッド操作が原因で datarecieved イベントのテキスト ボックスにアクセスすることでした。それをグーグルで検索すると、それを機能させるために必要なコードをコピー/貼り付けました。これらはすべてクロススレッド関数です。
OpenPort 関数と Datarecieved イベントは私自身のコードで、残りは Google から取得しました。
その後、アプリケーションは機能しましたが、不完全なコードを取得し、最初のスワイプで 12 桁すべてを取得し、2 回目のスワイプごとに最初のバイトが消えてしまいました。さらに読んで、受信データのサイズ (以下のコードを参照) の配列を作成することにしましたが、クロススレッド エラーが再び発生します。
配列の使用方法に問題があることはわかっています。これは私のVBの知識をはるかに超えており、私はここで頭を悩ませています。専門家の助けを借りることができます。私は電子技術者で、自分のハードウェア用のアプリを作成するためのプログラミングを独学で学びました。
ありがとう。
更新されたコード:
Public Class Form3
Dim msg As String
Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
For Each s In System.IO.Ports.SerialPort.GetPortNames()
lstPorts.Items.Add(s)
Next s
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If lstPorts.SelectedIndex = -1 Then
MessageBox.Show("Please select a port")
Exit Sub
Else
SerialPort1.BaudRate = 9600
SerialPort1.DataBits = 8
SerialPort1.Parity = IO.Ports.Parity.None
SerialPort1.StopBits = IO.Ports.StopBits.One
SerialPort1.PortName = lstPorts.SelectedItem.ToString
SerialPort1.Open()
End If
End Sub
Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
msg = SerialPort1.ReadExisting
Me.Invoke(New Action(
Sub()
txtReceived.Clear()
txtReceived.Text += msg
End Sub))
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
SerialPort1.Close()
txtReceived.Text = ""
End Sub
End Class