0

serialport.readline()を使用したいのは、これがブロッキングコールであり、取得するデータの最後に0x0D 0x0A(CR LF)があるためです。ただし、必要なのはASCII表現ではなく16進文字列です。

たとえば、私が通信しているデバイスは、{0xff、0xff、0x45,0x0D、0x0A}のようなバイト配列を送信しています。0xff、0xff、0x45のように、プログラムで単純に印刷したいと思います。Readline()は、LFとCRを親切に削除します。

読み取りたいバイト数を指定して、 serialport.read(buff [] ...)を使用することについて考えました。しかし、読み取りが速すぎると配列の半分が0x00になり、読み取りが遅すぎるとcomポートがオーバーフローするため、うまく機能しませんでした。バイトを失いたくない。

serialport.readline ()から取得したものをバイト配列に変換しようとしましたが、取得した16進文字列は通常0x3fになります。コードは次のようになります。

var line = string.Join(",", mySerialPort.ReadLine().Select(c => ((Byte)c).ToString("X")).ToArray());

エンコーディングを数回変更しましたが(ASCII、UTF8、UNICODE)、それでもうまくいきません。

readline()から取得した非ASCII文字列をバイト配列に変換する方法はありますか?

4

1 に答える 1

5

テキストデータとして読むべきではないようです。

基本的にバイナリデータを扱っているので、 char配列ではなくbyteRead配列をとるオーバーロードを使用します。(または繰り返し呼び出します。)ReadByte

任意のバイナリデータをテキストのように処理しようとすると、悪い経験をすることになります。

すでにこれを試したようですが、うまくいきませんでした。

しかし、読み取りが速すぎると配列の半分が0x00になるため、うまく機能しませんでした。

Readこれは、実際に読み取られたバイト数を示すの戻り値を無視していることを示しています。次のようなものが必要です。

int bytesRead = port.Read(buffer, 0, buffer.Length);
// Now use the portion of buffer which is from 0 (inclusive) to
// bytesRead (exclusive).
于 2013-02-15T16:29:37.940 に答える