SerialPort字节数组总是在字节[5]上返回0x63?

时间:2016-09-21 12:18:33

标签: c# arrays

我有一个程序,我通过serialPort传入数据,我将这些数据转换为字节数组,然后询问每个字节。但是,例如有6个字节(byte [0]到byte [5]),这些都意味着各种各样的事情。但由于某种原因,最后一个字节(byte [5])总是在程序中返回0x63,即使进入端口的数据也会有所不同。我已经检查了带有范围的数据以确认问题。以下是代码的相关部分:

        SerialPort mySerialport = new SerialPort("COM3",9600, Parity.None, 8, StopBits.One);
        rxString = mySerialPort.ReadExisting();
        byte[] bytes = Encoding.ASCII.GetBytes(rxString);
        textbox1.Clear();

        if (bytes[0] == 0x12)                          //Header
        {
            if (bytes[1] == 0xA6)                      //Header
            {
                if (bytes[2] == address)               //Address
                {
                    byte A = bytes[3];
                    byte B = bytes[4];
                    var checksum = ((address + A + B) ^ 0xFF) & 0xFF;

                    if (checksum == bytes[5])
                    {
                        textbox1.AppendText("Connected OK!!!");
                    }
                    else
                    {
                        textbox1.AppendText("Byte 5 = " + bytes[5]);
                    }

                }
            }
          }

我注意到,如果我在文本框中显示我计算的校验和,它与作用域上的校验和相同(在字节[5]中)。所以它必须在某个地方,即字节[5]变为0x63。

谢谢,感谢您的帮助......

1 个答案:

答案 0 :(得分:1)

问题可能是@Hans Passant所提到的 - 如果你想读取二进制数据(即字节而不关心它们如何被编码为文本字符串),你不应该使用String阅读SerialPort的方法。

您应该使用Read(Byte[], Int32, Int32)将字节直接输入字节数组。代码可能如下所示:

 SerialPort mySerialport = new SerialPort("COM3",9600, Parity.None, 8, StopBits.One);
 byte[] bytes = new byte[10];
 int read = mySerialport.Read(bytes, 0, 10);

通常最好分配一个比预期接收的数据大一些的数组,然后引用read值来了解数组中有多少字节实际包含实际数据。

另一方面,如果您知道您的串行设备始终生成固定大小的数据包(例如可能是5,在您的情况下?),那么您只需分配一个所需大小的字节数组,并确保每次都读取一个完整的数据包 - 如果没有得到完整的数据包,可能会重复读取:

int read = 0;
while (read < packet_size) {
    read += mySerialport.Read(bytes, read, bytes.Length);
}