解决方案 »

  1.   

    串口本来也并不保证数据一定能够正常接收到
    它本身是利用电路的高低电平切换来实现通信的
    TCP协议底层封装好了校验的方法,如果数据出错,数据包会被丢弃
    而串口通信是一个字节一个字节发送,一个字节一个字节接收,并没有"包"的概念
    需要你自己制定协议来校验什么样算一组数据,同一组数据通过什么来检测它是否完整,是否有错误参考SUM校验,CRC校验,MODBUS RTU协议
      

  2.   

      comm.DiscardInBuffer();    //清空缓存,避免下次的数据相互干扰
    为什么要Discard,把这行去掉试试
      

  3.   

    比如串口线附近有个大电机启动了,一个强电磁干扰很可能使你的数据全部变成0xff
      

  4.   

    你用串口调试助手跟踪了多长时间发现没有问题?
    你的程序中不定时发生问题又是多长时间?
    不要以为串口调试助手1分钟没有问题,再过5小时就都不会有问题我用串口助手跟踪了8个小时,没有一个数据错误的,换自己的软件,过了一段时间就有几个错误,错误有时是连着的,有时不是,错误时间也没有规律,还有串口缓存中的数据是怎么存的,每次都会自动清空吗,还有我的串口控件comm的属性ReceivedBytesThreshol设置的是6(为了获取完整数据),跟这个有关系吗?
      

  5.   

    你用串口调试助手跟踪了多长时间发现没有问题?
    你的程序中不定时发生问题又是多长时间?
    不要以为串口调试助手1分钟没有问题,再过5小时就都不会有问题
    我用串口调试助手测了8个小时左右都没问题,但用自己的软件就会出错,但也测了7、8个小时,每秒读一次的话,总共有2、3万组数,大概有200个数据出错,出错有时是连着2、3个,有时间断,出错也没有规律,发送应该没问题,还有我comm控件的ReceivedBytesThreshol写的是6(为了保证读数完整性,默认为1的),可不可能是这个原因?
      

  6.   

    你用串口调试助手跟踪了多长时间发现没有问题?
    你的程序中不定时发生问题又是多长时间?
    不要以为串口调试助手1分钟没有问题,再过5小时就都不会有问题
    我用串口调试助手测了8个小时左右都没问题,但用自己的软件就会出错,但也测了7、8个小时,每秒读一次的话,总共有2、3万组数,大概有200个数据出错,出错有时是连着2、3个,有时间断,出错也没有规律,发送应该没问题,还有我comm控件的ReceivedBytesThreshol写的是6(为了保证读数完整性,默认为1的),可不可能是这个原因?
      

  7.   


    好久没来了,看到这个楼主写的那个接收方法明显有问题,comm.DiscardInBuffer();   特别是用上了这个
    串口发送过来的数据,有时还在缓存区,如果没达到一定的长度是不会触发DataRevive事件 此时你把他清空了,就造成你上面说的200个数据出错。那是因为它也像TCPIP通信一样,在接收的缓存区 粘包。串口数据接收到的数据,下位机有时发送6个字符过来。你的上位机在DataRecive时不一定就是6个字符,有可能是分成两次接收,先接收到4个字符,第二次是2个字符。 这是时有发生的,也就是发生了你上面的问题了,你做这个,应写一个接收字节缓冲区,专门接收字节,也不用Sleep()看一下这个吧,http://blog.csdn.net/wyd1520/article/details/23822313
    这个也是为论坛另一网友跟你提的一样的问题写的。这是当时他提的原贴子
    http://bbs.csdn.net/topics/390316188
      

  8.   

    串口本来也并不保证数据一定能够正常接收到
    它本身是利用电路的高低电平切换来实现通信的
    TCP协议底层封装好了校验的方法,如果数据出错,数据包会被丢弃
    而串口通信是一个字节一个字节发送,一个字节一个字节接收,并没有"包"的概念
    需要你自己制定协议来校验什么样算一组数据,同一组数据通过什么来检测它是否完整,是否有错误参考SUM校验,CRC校验,MODBUS RTU协议