2016-09-21 141 views
0

我有一个程序,我有数据通过串口进入,我将这个数据转换成字节数组,然后询问每个字节。但是,例如有6个字节(字节[0]到字节[5]),这些都意味着各种各样的东西。但由于某种原因,最后一个字节(字节[5])在程序中总是返回一个0x63,即使通过端口输入的数据也会有所不同。我已经检查了与范围进来的数据以确认问题。下面是代码的相关部分:SerialPort字节数组始终在字节[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

您的代码似乎并不完整 - 例如,您不会显示您定义了“ mySerialPort',而你打开'port'并从不使用它。你也错过了一些右括号。如果您显示完整的代码打印输出,通常帮助您更容易。 – Guss

+0

对不起,我拿出了一些我觉得不相干的东西...... – Graham

+1

63是一个神奇的数字,与0x63不同,它是'?'的ASCII码。当必须将字节值> = 0x80转换时,由ASCIIEncoding类生成。它是SerialPort.Encoding属性的默认值。切勿使用ReadExisting()读取二进制数据,而应使用Read()方法。不要忽略它的返回值。 –

回答

1

很可能是什么问题@Hans帕桑特简称 - 如果你想读的二进制数据(即不关心它们是如何编码的文本的字节字符串),则不应使用SerialPortString读取方法。

您应该使用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); 
} 
+0

嘿Guss,谢谢。我设法使用Read()来使它工作。似乎进展顺利,谢谢... – Graham

+0

@格拉汉姆,如果答案适合你,请批准它。谢谢 :-) – Guss

相关问题