我有一个程序,我通过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。
谢谢,感谢您的帮助......
答案 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);
}