用SPCOMM控件接收下位机发送的数据,下位机是每隔5秒发送7个字节的数据,我用onreceivedata事件接收数据,但是一直处在接收数据的状态,导致数据的提取和显示一直进行。
图:
程序:Move(Buffer^,PChar(@rbuf)^,BufferLength);
if(rbuf[6]=$ff)then             //以0xff(END)结尾
    begin
       //取出需要的数据
    mmoComm.Lines.Add('已收到:'+intTostr(BufferLength)+'字节的数据');
    mmocomm.Lines.Add('测试时间'+ IntToStr(hour)+'小时'+ IntToStr(min) + '分'+ IntToStr(sec) + '秒') ;
    mmoComm.Lines.Add('电池电压:'+prvol+'mv');
    end;
我在数据接收后,清空缓冲区,但这样就无法接受数据了。小弟初学,求大神帮忙。测试串口通讯Delphi

解决方案 »

  1.   

    看下下位机的说明书上有没有设置5秒传输数据,我在公司的电子称是有设置,可以设置成当重量变化时才传输数据;
    如果没有,那么就在onreceivedata过滤下,当发现数据和上次读到的数据相同时,那过5秒数据还是相同才作相应处理,或者没变就一直不处理。
      

  2.   

    还是用事件触发来接收,因为你多个上位机不可能同时发送,如果等5秒可能会收到很多数据,造成缓冲溢出。所以主机还是用事件触发来接收,有数据就接收。
    至于接收格式,也要考虑,本次接收有可能接收一个不完全的数据,通过分析提取有效的数据,把不完整的数据合并下次接收数据一起分析。如数据有效格式为ABC:本次接收为ABCABCAB,通过分析,本次接收的数据有两个有效数据ABC,ABC,一个不完整数据AB,这个AB可留做下次接收的数据全并分析。我用过消费机有确认功能,即它会重复地发送数据,直到主机接收后给它一个确认信息。不知道你这个有没有。
      

  3.   

    你这是串口通信吧,每5秒发7个字节,这时间很充裕啊。用事件接收可以的,也来得及处理。
    onreceivedata的方法里的第一句加个
    sleep(50);这个"10"具体大小你自己试下调整如是还有问题,你换个CPort控件试试,肯定行的