2

シリアルポート経由でデータを継続的に送受信するアプリケーションを vb.net で作成しました。フレーム番号、フレームの長さ、実際の文字列など、必要ないくつかのカスタム パラメーターを使用してフレームを作成します。それらは、'@'、'#'、'$' などの特殊文字で区切られます。例: @#3$21%Hello.There!!&

2 つの連続するフレーム間に最小 1 ミリ秒のギャップでこれをテストする必要があります。私が直面している問題は、ループ バック テストでデータを受信すると、通常、いくつかの文字が失われることです。破損したフレームとしてカウントされますが、Windows のループ バック テストで発生する理由がわかりません。このフレームは、 @#3$21Hello.The!!& のように表示されます。受信機能はこんな感じ。

Private Sub DataReceivedHandler(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles RXCOMPort.DataReceived

        If e.EventType = SerialData.Chars Then
            If checkFlag = False Then
                '---receive data 
                str &= RXCOMPort.ReadExisting()
                checkFlag = True ' for the thread of processing received data
            End If
        End If
End Sub

後で、UART から UART へデータを送受信するマイクロコントローラ ベースのハードウェアが登場する予定です。

4

1 に答える 1

0
 If checkFlag = False Then
            '---receive data 
            str &= RXCOMPort.ReadExisting()
            checkFlag = True ' for the thread of processing received data
        End If

他の処理関数で checkFlag を設定する前に Handler が実行されるとどうなりますか?

たとえば、最初の Handler コールバックは@#3$21%Hello.Theを収集します。

次に、プロセスに進みます。処理関数がデータの最初のバッチで終了する前に Handler が実行されるとどうなりますか? 新しいシリアル ポートのデータは削除されますか?

通常、受信したデータを循環バッファーに入れたいと思うでしょう。この操作は受信ハンドラ内で行い、この操作のみを行ってください。

別の関数またはスレッドで、循環バッファーで作業を行います。このように、ハンドラーの仕事はデータを循環バッファーに入れることだけであり、データをドロップすることはありません。

于 2014-12-07T05:12:43.430 に答える