我通过串口对一组电表进行读取,我是通过FOR循环来做的,现在有个问题就是要等
循环结束才能执行Comm1ReceiveData事件过程,这样一来就收不到数据。
我想要等一块表接收完成再执行下一块表,请问怎么实现?    for i:=0 to Lvwbjxx.Items.Count -1 do
    begin
        if Leftstr(trim(Lvwdxst.Items[0].SubItems[i]),1)='1' then
        begin
            //这是个发送过程
      SetErr(Lvwbjxx.Items[i].SubItems[3],0);
       
        end;    end;

解决方案 »

  1.   

    你是不是先发送然后再读取?可以这样:
    FOR I := 1 TO 100 DO
    BEGIN
      发送电表[I];
      S := 读取电表[I];
      WHILE S > '' DO
      BEGIN
        S := S + 读取电表[I];
      END;
    END;意思就是直到读取完了再操作下一个电表!
      

  2.   

    newfang(传说中的MIC) 
    你这样不行的,我试过的,Comm1ReceiveData事件是自动触发的,主动执行这个是不行的
      

  3.   

    你的问题是在循环中没有办法让Comm1ReceiveData得到机会出发而已,你需要循环等待中加上
    application.ProcessMessages让COM有机会得到消息Comm1ReceiveData就有机会执行了,循环中一般应该还有个GetTickCount来保证等待结果时间.
      

  4.   

    哦 ~你用的是组件!
    偶一直都是用READFILE等API函数自己写的 !
    SPCOMM应该也是通过线程循环,一旦读取到数据就触发事件的吧!没用过它!
      

  5.   

    STYun(天云)说的正确:FOR I := 1 TO 100 DO
    BEGIN
      发送电表[I];
      //延时
      application.ProcessMessages;
    END;中间最好加上一定的延时,要看串口设备响应的迟滞时间长短!
      

  6.   

    用application.ProcessMessages;是不行的,我试过了
      

  7.   

    呵呵 ~SPCOMM好像是带原码的,你可以修改它接收事件的触发机制!
    或者用API来实现串口读写,简单而且方便,比较好控制!
      

  8.   

    我感觉最好不要在主线程里使用长时间的循环,可以另开一个线程来用循环;或者在你的循环里加application.processmessages;并在发送完请求后sleep(200);以等待接收数据;
      

  9.   

    循环的时间不长,但是在循环里加了application.processmessages,延时一样不会触发接收事件,只有等循环结束了才能触发。
      

  10.   

    SPCOMM是基于线程的,为异步控制方式
    所以你需要接收缓存区,然后通过控制队列来逐个处理~
    必要时,需要多线程来配合