解决方案 »

  1.   

    while (serialPort.BytesToRead > 0)
    这就不对了
    你是如何确保收到的信息是对的?仅仅是断点调试?
    要知道,你在断点调试的时候,程序走的是很慢的,而你正常运行的时候,是很快的
    串口发送,跟TCP包不同,不能确保一次性收到完整的包,你必须循环,直到一定时间内不再有数据到达,才算完整
    这个一定时间,可以根据波特率来确定,一般是3.5个字节周期
    比如波特率9600,每秒1200字节,每字节大约1ms,那么如果超过4ms还没有数据到达,就可以认为此次发送已经结束如果你另一头的设备也是自己编程,那么可以将协议做的更简单一些,就是发送间隔不要太短,接收的时候也就不用太严格按照3.5ms来做,直接在while里加个sleep(100),那么100ms之后没有新数据,while才退出循环
      

  2.   

    另外,既然涉及到只读一次无法读到完整数据的问题
    你处理的时候也应该先将读到的数据放到list里,等确定全部读完了,再统一处理
    而不是收到1字节,就处理1字节
    float占4字节,你只收到3个字节就开始计算,那能对吗
      

  3.   

       你好,谢谢你的回复! 我在一开始用了一个invoke来显示刚刚收到的信息,是hex的,然后才进入协议。我在正常运行的时候,进行了很多次的实验,确保每次接收到的信息(也就是hex形式的)都是对的。所以我认为可以收到正确的信息。请问您怎么看?谢谢!
      

  4.   

    float f11 = BitConverter.ToSingle(rxDataBuffer, 0);
                                    float f22 = BitConverter.ToSingle(rxDataBuffer, 4);
    那就是这里错了
    你重新定义一个byte[4],把数据放到这个byte数组里,再转float
    而不是直接8位一起转float
      

  5.   

    你好!我也不认为是这个问题,因为,我在断电调试的时候,问题在rxdatastate之前就出现了,就是说,在byte转换float之前,乱码就自己出来了。谢谢!