我做的一个项目是通过485通讯接收传来的数据,200公斤称重的大桶灌装,下位机是称重传感器然后进称重仪表,有个接口板负责采集仪表的数据然后发给我——工控机,然后我判断接收的数据是否灌状结束了 如果结束了 就记录下来 送到数据库里!不过 现在现实情况反映来看 有丢桶的现象500桶数据能丢20-40桶的样子 不知道什么原因 高手有做过类似的工程吗??帮帮忙 我现在在现场呢!!解决不了 就回不了家了!!!郁闷啊!!在线等!!
    我是用mscomm控件通讯的!!现在怀疑是不是接收缓冲区满的原因 导致数据有个别记录不下来啊!!现在只是怀疑没有查明原因! 

解决方案 »

  1.   

    关于你所说的问题我是没有做过,不过可以给你个提示:
    MSComm1.OutBufferCount = 0
    MSComm1.InBufferCount = 0
    MSComm1.Output = Sd_Data
    记得在发送新的串口数据去采集此时的什么桶装的数量时把发送和接收数据缓冲区都清空后再发送数据。建议不要使用OnComm事件进行通讯,使用定时器更加可靠。
    在定时器中:
    1》先检查缓冲区数据,如果不为空则全部取出进行效验和计算。2》计算完成,如果符合条件则入数据库,不符合则自行处理3》然后发送本次要查询字节数据出去即可在下个定时器事件中你将要再次重复1》,2》,3》三步,如此不断得进行检查数据,应该更加可靠另外,定时器间隔要看波特率和发送数据多少决定的。一般建议9600bps发送一个字节或接收一个字节需要1ms左右注意:定时器最小间隔不能设置为50ms以下!
      

  2.   

    缓冲区满了?晕死 mscomm的缓冲区是可以设置的 怎么可能会满有可能你处理数据的时候的错误
      

  3.   

    我的只是发送a 和b 然后下位机返回给我a#1********#2********和b#1********#2********我从接收到的数据中读出4个数据即为4条线的数据 !!!
    MSComm1.OutBufferCount = 0
    MSComm1.InBufferCount = 0
    MSComm1.Output = Sd_Data
    记得在发送新的串口数据去采集此时的什么桶装的数量时把发送和接收数据缓冲区都清空后再发送数据。
    请问如何清的接收缓冲区啊??
      

  4.   

    是啊 我用个定时器 轮流发a和b 然后下位机接收到a后就把a线的字符串发给我 同理b线也是这样的 a#1********#2********和b#1********#2******** 然后从接收的字符串中判断数据是否符合条件然后插入数据库 一桶大概1分20秒左右!!
      

  5.   

    MSComm1.InBufferCount = 0 没记错得话这个就是清空接收缓冲得指令
      
    桶满得时候会是什么数据  还有桶满了以后会立刻装新得桶吗? 还是要等你得指令 
      
      
     我觉得这个是关键
      

  6.   

    1 如果一次接收的数据大于 1024 字节,则需要事先设置缓冲区大小,如:
    MSComm1.InBufferSize = 40962 每次接收数据(发送命令)之前,清空缓冲区: 
    MSComm1.InBufferCount = 0
      

  7.   

    丢数据,
    1:检查485接口是否有问题,是否存在虚焊,接地端是否有问题.
    2:设置COM缓存为16K
    3:使用事件方式获取端口数据
    4:简化/优化算法,使数据处理速度提高