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 バイトずつデータを送信していますが、それは適切な要求を受信した後でのみです。