2

SerialPortクラスから適切に読み込もうとして、少し頭痛がしています。

ブロッキング メソッドを使用した場合、ReadLineまたはReadExistingアプリケーションは魅力的に機能しますが、string変換のために一部の値が影響を受けます。つまり、0xFCバイトは0x3F("?") として表示されます。私の推測では、ASCII スコープ外の値も失われると思います。

を使用してRead(byte[] buffer,int offset,int count)メソッドを使用して、SerialPort.ReadBufferSize読み取るバイト数を確認しようとしましたが、UART から 8 バイトしか読み取ろうとしていない場合でも、常にほぼ 5000 が返されます。この配列をより小さな配列にトリミングして使用する関数を作成する必要がありました。この方法は効率的ではありませんが、使用することはできますが、それを使用すると、配列が範囲外の実行エラーになることがあります。デバッグ後、ゼロの完全な配列を読み取ったときにこれが発生することがわかりました。

私の最後の試みは、このコードを使用していました:

private void DataRec(object sender, SerialDataReceivedEventArgs e)
{
    SerialPort sp = (SerialPort)sender;
    byte[] myarray = new byte[200];
    int pos = 0;
    bool eol = false;
    while (!eol)
    {
        myarray[pos++] = (byte) sp.ReadByte();
        if (myarray[pos] == 0x7E) eol = true;
    }

    byte[] newarray = Recorta(myarray);
    this.Dispatcher.Invoke(new AtualizaCallBack(this.atualiza), new object[] { newarray });
    sp.DataReceived -= DataRec;
}

これをデバッグするとき、byte[] newarray = Recorta(myarray);ブレークポイントに到達することはありませんが、エラーはありません。奇妙なことは、イベントが再び発生するたびに (UART にパケットを送信するように指示した場合)、pos変数がゼロで始まらないことです。

何が起こっているのかについてのアイデアはありますか?

言及する価値のあること:

  • 0x7E "~" は行末文字です
  • 一度に受信できる最大バイト数は 200 です
  • UART コードは一度に 1 バイトずつデータを送信していますが、それは適切な要求を受信した後でのみです。
4

2 に答える 2

3

SerialPort クラスの間違ったメンバーを使用しているだけです。ReadLine() と ReadExisting() は文字列を返しますが、データを文字列に格納することはできません。0xFC には ASCII 文字コードがないため、あきらめて「そのバイトを変換できません」という値を生成します。これは 0x3F で、疑問符です。

同様に、値を再割り当てしない限り、ReadBufferSize は固定数です。プログラムが読み取る前に、受信したバイトを格納するためにシリアル ポート ドライバーが使用するバッファーのサイズを設定します。せいぜい、BytesToRead プロパティに関心があるだけです。これにより、そのバッファー内で読み取り可能なバイト数がわかります。

SerialPort.Read() メソッドを使用するだけです。また、その戻り値に注意してください。読み取ったバイト数がわかります。ほとんどの場合、これは小さな数値で、通常は 1 バイトまたは 2 バイトです。シリアル ポートが遅い。デバイスの完全な応答が得られるまで読み続ける必要があります。あなたの場合、その0x7Eを取得したとき。

于 2013-09-09T12:44:54.830 に答える
1

これを試して。ほとんどの場合、正しく実装していなかったと思います。

    private byte[] ReadLine(SerialPort serialPort)
    {
        byte[] buffer = new byte[4096];
        int count = 0;

        for (; count < buffer.Length; count++)
        {
            buffer[count] = (byte)serialPort.ReadByte();
            if (buffer[count] == 0x7E) break;
        }

        return buffer.Take(count);
    }
于 2013-09-09T12:55:00.843 に答える