Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将serialport.readline()非ascii字符串转换为字节数组_C#_String_Encoding_Serial Port - Fatal编程技术网

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

C# 将serialport.readline()非ascii字符串转换为字节数组,c#,string,encoding,serial-port,C#,String,Encoding,Serial Port,我想使用serialport.readline(),因为这是一个阻塞调用,并且我得到的数据末尾有0x0D 0x0A(CR LF)。但是,我想要的是十六进制字符串,而不是Ascii表示 例如,与我通信的设备正在发送类似{0xff,0xff,0x45,0x0D,0x0A}的字节数组。我只想在我的程序中像这样打印:0xff,0xff,0x45。Readline()善意地修剪LF和CR 我想通过指定要读取的字节数来使用serialport.read(buff[…)。但它工作得不太好,因为如果读取速度太快

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

听起来你根本不应该将其作为文本数据读取

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

听起来你根本不应该把它当作文本数据来阅读

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

你是对的。我以前试过,但我必须限制阅读速度,以避免溢出或“过度阅读”。我说的“over read”是指read()方法清空缓冲区的速度太快,所以返回0x00@Timtianyang:请参阅我文章的后半部分-只要考虑到
read
的返回值,就可以使用太大的缓冲区进行读取。这就像bytesRead=port.read(buff,bytesRead,buffer.length);那么下一次它将把新的字节放入带有offset=bytesRead的缓冲区时?@timtyang:如果你还没有实际使用这些字节,是的-但是
buffer.Length-bytesRead
用于计数(否则参数无效)。@timtyang:需要记住的一件事-这是你应该如何读取所有流-网络、文件、内存,串口等等,你说得对。我以前试过,但我必须限制阅读速度,以避免溢出或“过度阅读”。我说的“over read”是指read()方法清空缓冲区的速度太快,所以返回0x00@Timtianyang:请参阅我文章的后半部分-只要考虑到
read
的返回值,就可以使用太大的缓冲区进行读取。这就像bytesRead=port.read(buff,bytesRead,buffer.length);那么下一次它将把新的字节放入带有offset=bytesRead的缓冲区时?@timtyang:如果你还没有实际使用这些字节,是的-但是
buffer.Length-bytesRead
用于计数(否则参数无效)。@timtyang:需要记住的一件事-这是你应该如何读取所有流-网络、文件、内存,串口等@leppie你是说Encoding.ACSII.getBytes(字符串)?它给了我同样的结果。十六进制数总是变成0x3F。@leppie您是说Encoding.ACSII.getBytes(字符串)吗?它给了我同样的结果。十六进制数始终转换为0x3F。