1

以下の形式に従って PC のシリアル ポートにデータを送信するマイクロコントローラーを使用しています。

Start Byte = 0x7E
Data Bytes ...........
StopByte = 0x7E

したがって、基本的には、このパケットをバイト配列で読み取りたいと考えています。DataReceivedクラスのイベントを使用してこれを実行しようとしていSerialPortますが、失敗するだけで、適切なデータパケットを完全に受信することはありません:

private List<int> _readBuffer = new List<int>();

private void Connection_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    var sp = (SerialPort)sender;
    var indata = sp.ReadChar();

    if (indata == 0x7E && _readBuffer.Count == 0)
        _readBuffer.Add(indata);

    if(_readBuffer.Count > 0 && indata != 0x7E)
        _readBuffer.Add(indata);

    if(_readBuffer.Count > 0 && indata == 0x7E)
    {
        _readBuffer.Add(indata);

        //Dump packet to textbox
        Invoke(new EventHandler((o, args) =>
        {
           foreach(var i in _readBuffer)
           {
               tbIn.Text += string.Format("{0:X} ", i);
           }

            _readBuffer = new List<int>(); //Renew the reading buffer array!
        }));
    }
}

何が問題なのかわかりません。次のように、テキストボックスへの開始バイトと終了バイトのみを取得します。

7E 7E

正しいパケットは次のとおりです。

7E 0 43 00 FF FF 0 0 7E

あなたのヒント/トリックを楽しみにしています!

4

1 に答える 1

3

うーん...では、そのコードを見てみましょう。以下に参照するいくつかのコメントを追加しました。

var sp = (SerialPort)sender;
var indata = sp.ReadChar();  // A

if (indata == 0x7E && _readBuffer.Count == 0) // B
    _readBuffer.Add(indata);  

if(_readBuffer.Count > 0 && indata != 0x7E) // C
    _readBuffer.Add(indata);

if(_readBuffer.Count > 0 && indata == 0x7E) // D
{
    _readBuffer.Add(indata);

    //Dump packet to textbox
    Invoke(new EventHandler((o, args) =>
    {
       foreach(var i in _readBuffer)
       {
           tbIn.Text += string.Format("{0:X} ", i);
       }

        _readBuffer = new List<int>(); //Renew the reading buffer array!
    }));
}

sp.ReadChar()あなたは「A」で電話します

「B」でテストすると、おそらく 0x7E になり、空のリストが得られたので、7E をリストに追加します。

indata は実際には 7E に等しいため、「C」は true と評価されません。

"D"true と評価されます。これは、indata がまだ 7E に等しく、リストに 1 つあるためです。

そのため、7E はリストに 2 回含まれています。同じバイトを 2 回コピーしました。

次に、2 つのリスト項目をテキスト ボックスにプッシュします... 7E を 2 回。

あなたはsp.ReadChar一度しか電話したことがありません。そのデータを取得したい場合は、SerialPort から残りのデータを読み取る必要があります。そうすれば、探しているすべてのバイトが見つかると思います。

于 2012-10-13T01:21:40.763 に答える