下位机50HZ的频率传数据,每组数据38
上位机软件收到数据后,经过变换得到传感器的实际值,然后以时间为序在界面上进行更新。求以解决方案目前使用的是.Net 平台下的SerialPort组件,在其DataRecevied事件里缓冲数据,
但发现每次serialPort1.BytesToRead总是大于38好多。请大家不吝赐教,提供方案,若有好的方案本人愿出资酬谢。

解决方案 »

  1.   

    首先要搞清楚数据是每帧定长38字节还是每帧有开始停止位的固定格式数据,
    BytesToRead不管这些的,有数据就接收,有可能里面有多帧数据,也有可能有不完整的数据,例如帧的前面部分字节或帧的后面部分字节,这些都需要自己分割出一帧数据。
    一般的处理是先把数据全部连接起来,然后根据数据特征分割出一帧数据,然后调用一帧的处理函数。
    如果处理过慢,缓冲区数据越来越多,则需要流量控制,看传输控制协议,一般有xon/xof和rts/cts两种流量控制方式。
      

  2.   

    串口通信不可靠的, 如果按照38个字节卡,你必定出问题。 合理的是帧里有头标示,长度和帧crc
      

  3.   

    要按照协议解析。BytesToRead是指当前缓冲区中可读的字节数,如果有边界,则按照协议中规定的边界截取每一包数据,否则就按照协议去解析吧,比如如果是Modbus协议,就按照ModeBus协议解析。
      

  4.   

    A5 02 XX XX XX XX AA AA AA AA AA AA AA AA BB BB BB BB BB BB BB BB CC CC CC CC CC CC CC CC DD DD DD DD DD DD DD DD
      

  5.   

    A5 02 XX XX XX XX AA AA AA AA AA AA AA AA BB BB BB BB BB BB BB BB CC CC CC CC CC CC CC CC DD DD DD DD DD DD DD DD注意串口接收,每次不一定是从第几位字节开始的。所以一定要缓冲在一起,然后找头位置开始向后读取。说一下大概流程吧。 
    1. 定义一个全局的缓冲数组 byte[] recivedBytes;
    2. 数据接收部分放在serialport_datarecived事件中,每次收到多少个字节的数据都合并到缓冲数组中。
    3. 定义分析数据函数(注意一定要判断头标示,开始进行数据分析)
    4. 可以定时执行分析函数,或者在serialport_datarecived事件里调用。