将serialport.readline()非ascii字符串转换为字节数组



我想使用serialport.readline(),因为这是一个阻塞调用,我得到的数据末尾有0x0D 0x0A(CR LF)。然而,我想要的是一个十六进制字符串,而不是Ascii表示。

例如,与我通信的设备正在发送字节数组,如{0xff,0xff,0x45,0x0D,0x0A}。我想在我的程序中简单地打印出来,就像这样:0xff,0xff,0x45。Readline()友好地去掉LF和CR。

我想通过指定要读取的字节数来使用serialport.read(buff[]…)。但它的工作不太好,因为如果我读得太快,数组的一半将是0x00,如果我读的太慢,com端口将溢出。我不想丢失任何字节。

我试图将从serialport.readline()得到的内容转换为字节数组,但得到的十六进制字符串通常会变成0x3f。代码如下:

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

我更改了几次编码(ASCII、UTF8、UNICODE),但仍然没有成功。

有没有办法将我从readline()得到的非Ascii字符串转换为字节数组?

听起来你根本不应该把它读成文本数据。

您从根本上处理的是二进制数据,因此使用Read的重载,它采用字节数组,而不是字符阵列。(或反复调用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).

最新更新