2

シリアル通信は初めてです。かなりの数のチュートリアルを読みました。私がやろうとしていることのほとんどは機能していますが、C#とのシリアル通信に関して質問があります。私は常にシリアルラインを介してデータを送信しているマイクロコントローラーを持っています。データは次の形式になっています:bxxxxixx.xx、xx.xx *ここで、xは異なる数字、+または-記号を表します。PCのC#プログラムからこの情報を読みたい場合があります。私が抱えている問題は、ReadTo( "*");を使用しているにもかかわらず、メッセージがランダムな位置に分割されているように見えることです。これは*文字までのすべてを読み取ると思いました。受信したメッセージが完全であることを確認するにはどうすればよいですか?

ご協力ありがとうございました。

    public string receiveCommandHC()
    {

        string messageHC = "";
        if (serialHC.IsOpen)
        {
            serialHC.DiscardInBuffer();
            messageHC = serialHC.ReadTo("*");

        }
        return messageHC;
    }
4

3 に答える 3

3

なぜそれをしているのかわかりませんが、読み取る直前にバッファ内のシリアルポートのすべてを破棄しているので、その時点でコンピュータがすでに「bxxx」を受信して​​いる場合は、それを破棄してください。 「xixx.xx、xx.xx」のみを読み取ります。

于 2012-01-27T08:20:07.050 に答える
1

私はあなたが実際にコマンドの終わりb01234.56.78.9を取得していると推測します。つまり、取得する(finalを省略する)代わりに*、(たとえば)を取得します.56.78.9。これは、入力バッファを破棄したためです。そうしないでください。その時点(読み取りの直前)の状態を知ることはできないので、バッファーを破棄することは単に間違っています。行を削除しserialHC.DiscardInBuffer();ます。

于 2012-01-27T08:21:54.420 に答える
1

ほとんどの場合、シリアル通信では、データメッセージ(非常に小さい場合を除く)が分割されていることがわかります。これは主に、通信速度とポートからデータを取得するポイントに依存します。

通常、コードを別のスレッドで実行するように設定します(コードの残りの部分のパフォーマンスへの影響を防ぐため)。これにより、完全なメッセージが受信されたときにイベントが発生し、完全なメッセージが送信されます。読み取りおよび書き込み機能はワーカースレッドによって処理されます(シリアル通信トラフィックは低速です)。

読み取りバッファと書き込みバッファが必要です。これらは、数サイクルのデータを保持するのに適した大きさである必要があります。

入力から読み取ったデータを読み取りバッファーの最後に追加します。バッファの先頭から、メッセージ全体を循環的に読み取るために、読み取りバッファを読み取ります。

使用されるプロトコルに応じて、通常はデータ開始とデータ終了インジケーターがあり、どこかにメッセージサイズがあります(これもプロトコルによっては修正される場合があります)。私はあなたのプロトコルから、メッセージの開始文字が'b'であり、メッセージの終了文字がであるということを収集します'*'。これは不完全なメッセージからのものであるため、メッセージの開始文字('b')の前にあるすべてのデータを破棄します。

完全なメッセージが見つかったら、バッファの前面からメッセージを取り除き、メッセージの到着を示すイベントを発生させます。

メッセージを分割する必要がある場合を除いて、データを送信するために同様のプロセスが実行されます。したがって、送信されるデータはバッファの最後に追加され、送信されるデータは最初から読み取られます。

これがシリアル通信の扱い方を理解するのに役立つことを願っています。

マークが指摘したように、あなたは現在、問題を引き起こすような方法でバッファをクリアしています。

編集

コメントで述べたように、serialHCは認識しませんが、生データを処理する場合は、SerialPortクラスの使用を検討してください。使用方法と例(上記で説明したプロセスを大まかに使用)の詳細については、こちらを参照してください。

于 2012-01-27T08:46:51.500 に答える