0

我想使用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字符串转换为字节数组?

4

1 回答 1

5

听起来您根本不应该将其作为文本数据来阅读。

你从根本上处理二进制数据,所以使用它的重载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).
于 2013-02-15T16:29:37.940 回答