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

时间:2013-02-15 16:27:51

标签: c# string encoding serial-port

我想使用 serialport.readline(),因为它是一个阻塞调用,而我得到的数据最后有0x0D 0x0A(CR LF)。但是,我想要的是Hex String而不是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 字符串转换为字节数组?

1 个答案:

答案 0 :(得分:5)

听起来你根本不应该把它作为 text 数据阅读。

您从根本上处理二进制数据,因此请使用Read的重载,该重载采用字节数组而不是 char 数组。 (或者反复拨打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).