从c#中的串口接收时处理大字节

时间:2017-07-07 03:47:35

标签: c# .net byte

我是串口新手。目前,我的项目是从机器中提取数据。我通过事件onDataReceive获取数据,机器正在发送字节。

我的问题是第一波字节似乎正确地转换为字符串,但在第二批字节中,我得到了垃圾数据。

输出的屏幕截图(这是多货币读取器机器给出的输出: enter image description here

垃圾数据是我认为序列号

这是我在onDataReceive方法中的代码:

EmojiSymbols

我试图用txt文件输出输出。

我希望有人可以帮我解决问题。数据处理中的任何提示和建议,特别是字节?

1 个答案:

答案 0 :(得分:1)

在不知道serialPort.ReadBufferSize的大小的情况下,我只能怀疑你的缓冲区正在破坏字符串的编码字节。一个字符可以由一个或多个字节组成。

技巧是在解码字符串之前读取所有字节。

试试这个示例程序:

var encoding = System.Text.Encoding.Unicode;
var message = "I am new in serial port. Currently my project is to extract data from machine.";
using (var ms = new MemoryStream(encoding.GetBytes(message)))
{
    var bytes = new List<byte>();
    var buffer = new byte[23];
    var bytesRead = ms.Read(buffer, 0, buffer.Length);
    while (bytesRead > 0)
    {
        Console.WriteLine(encoding.GetString(buffer, 0, bytesRead));
        bytes.AddRange(buffer.Take(bytesRead));
        bytesRead = ms.Read(buffer, 0, buffer.Length);
    }
    Console.WriteLine(encoding.GetString(bytes.ToArray(), 0, bytes.Count));
}

它将输出以下内容:

I am new in�
猀攀爀椀愀氀 瀀漀爀琀�
. Currently�
洀礀 瀀爀漀樀攀挀琀 �
is to extra�
琀 搀愀琀愀 昀爀漀洀�
 machine.
I am new in serial port. Currently my project is to extract data from machine.

最后一行是正确的,因为它使用所有字节进行解码。之前的行有错误,因为我使用的缓冲区大小为23,这打破了字符串编码。