a -> b 发请求,b->a 回复时a自动接收,当自动接收时,用Timer事件还是需要开线程?想用Timer事件,它会丢失数据吗?有经验的帮个忙,先谢了。

解决方案 »

  1.   

    是的Timer 可能会丢失数据 因为优先级较低 当其他线程占用时间比较久时 会得不到执行
      

  2.   

    在串口通信中有两种方式,取得串口数据。一种是轮询方式,另一种是多线程方式:    用Timer事件来实现串口通信是轮询方式的一种,假如用它来打开线程,再到缓冲区去取数据占用资源很大,有时会访问不到Buffer里的数据;
          
        我建议你使用第三方控件吧,你真的用timer来访问我给你一种方案是:
       
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      //建立线程对象,并且激活执行
      ReadThread:=TReadThread.Create(False);
    end;
    在线程单元文件中定义如下线程
    type
      TReadThread = class(TThread)
      private
        { Private declarations }
        procedure ReadPort;   //读取串行端口数据
      protected
        procedure Execute; override;
      end;procedure TReadThread.Execute;
    begin
      { Place thread code here }
      While not Terminated do
      begin
        Synchronize(ReadPort);//刚才所定义的读取数据函数
      end;
    end;//其它程序你自己可以写出来
    //读取串行端口的程序放在这里
    procedure TReadThread.ReadPort;
      var
      Temp : string;
      inbuff: array[0..2047] of Char;
      nBytesRead, dwEvent, dwError:LongWORD ;
      cs:TCOMSTAT;
      begin
       if (hComm=0) then exit;//先判断是否已打开通信端口
       ClearCommError(hComm,dwError,@CS);  //取得状态
       ReadFile(hComm, inbuff,cs.cbInQue,nBytesRead,nil); // 接收COM 的数据
       //串行在读取数据后,会自动将缓冲区中已被读取的数据清除掉
       if cs.cbInQue =0 then exit;
       // 数据是否大于我们所准备的Buffer
       if cs.cbInQue > sizeof(inbuff) then begin
         PurgeComm(hComm, PURGE_RXCLEAR);  // 清除COM 数据
         exit;
       end;
       Temp:=Copy(inbuff,1,cs.cbInQue);//取出数据
       Form1.mReceive.Text :=Form1.mReceive.Text + Temp;   // 将数据显示于Memo1 上
       Form1.mReceive.SetFocus ;
       Form1.mReceive.SelStart  :=Length(Form1.mReceive.Text);
       Form1.mReceive.SelLength :=0;  //移到最下端
    end;
      

  3.   

    beyondtkl(大龙驹<无悔这一生 恩德汝>) or Jute(东方明珠) ( ):可否留下联系方式以方便交流,谢谢了。
      

  4.   

    what does "自动接收" mean?