1

UART 経由で PIC24 マイクロコントローラーから 10 バイトの ASCII データを受信する VB.NET 4 アプリケーションがあります。これは私の受信機能です:

Private Sub mySerialPort_DataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs)
        'Handles serial port data received events 
        UpdateFormDelegate1 = New UpdateFormDelegate(AddressOf UpdateDisplay)
        Dim n As Integer = mySerialPort.BytesToRead 'find number of bytes in buf 
        comBuffer = New Byte(n - 1) {} 're dimension storage buffer 
        mySerialPort.Read(comBuffer, 0, n) 'read data from the buffer 
        Me.Invoke(UpdateFormDelegate1) 'call the delegate
    End Sub  

これがこのコードブロックを入手した場所です

受信したデータを解析し、次のコードで必要な場所に割り当てます。

    Private Sub UpdateDisplay()
        Dim i As Integer
        Dim RX_String(15) As String
        Dim RX_String_Hex(15) As String
        Dim Message As String

        For i = 0 To comBuffer.Length - 1
            RX_String(i) = Chr(comBuffer(i))
        Next
        Message = String.Join("", RX_String)
        TextBox1.Text = Message
    End Sub

アプリケーションを起動するときに、シリアル ポートを開きます。次に、マイクロコントローラーにデータを送信するように指示します。つまり1234567890、私のVBアプリでは124567890などを表示し、最終的にマイクロコントローラーからの乱数の送信後にデータの完全な文字列を表示します。私はこれまでVBでシリアルをやったことがないので、明らかなことを見逃すことは間違いありません。毎回 10 バイト全体を受信するのを妨げている何かが欠けていますか?

4

1 に答える 1

1

DataReceived イベント ハンドラーの一般的なコードを次に示します。

Dim dataByts As New List(Of Byte)
Dim dataLock As New Object
Dim datarcvd As New Threading.AutoResetEvent(False)

Private Sub SerialPort1_DataReceived(sender As Object, _
                                     e As IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    Dim br As Integer = SerialPort1.BytesToRead '# of bytes to read
    If br > 0 Then
        Dim b(br - 1) As Byte 'create buffer to read into
        Try
            br = SerialPort1.Read(b, 0, b.Length) 'read the bytes
            If br < b.Length Then 'adjust length if required
                Array.Resize(b, br)
            End If
            'add bytes just read to list
            Threading.Monitor.Enter(dataLock)
            dataByts.AddRange(b)
            Threading.Monitor.Exit(dataLock)
            datarcvd.Set() 'signal event fired
            '
            'check for a condition
            '
            If dataByts.Count >= 10 Then
                'condition met <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
            End If
            '
            'fine tune exception handling
            '
        Catch ex As Exception
            Debug.WriteLine(ex.Message)
        End Try
    End If
End Sub

Private Sub SerialPort1_ErrorReceived(sender As Object, _
                                      e As IO.Ports.SerialErrorReceivedEventArgs) _
                                  Handles SerialPort1.ErrorReceived
    Debug.WriteLine(e.EventType)
End Sub

10 バイト (またはそれ以上) になったら、デリゲートを呼び出して文字列をデコードします。バイトをバッファに配置するときのロックに注意してください。デリゲートは次のようになります

    Dim s As String = ""
    Threading.Monitor.Enter(dataLock) 'yes
    s = SerialPort1.Encoding.GetChars(dataByts.ToArray, 0, 10)
    dataByts.RemoveRange(0, 10) 'remove the bytes processed
    Threading.Monitor.Exit(dataLock)
    TextBox1.Text = s
于 2013-06-16T13:54:07.810 に答える