目前写一个串口通讯程序,采样周期20ms,用控件时,一旦界面刷新,就会丢数据包。估计是刷新产生的中断比串口的中断级别高。于是,就想开一个线程,但不知道是把串口的接收放到辅助线程,还是把界面放到辅助线程。如果把串口接收放到辅助线程,哪么,串口中断产生的事件,会从主线程传到辅助线程吗?现在一筹莫展,请高手指教。最好给个例程。邮箱:[email protected]。谢谢。

解决方案 »

  1.   

    把串口的接收放到辅助线程,中断就会在辅助线程中发生。应该把串口接收放到辅助线程中。不用控件做,用CreateFile/SetCommState等API。
      

  2.   

    控件要求和窗口通讯,也就是说,要求辅助线程是个用户界面线程,这使编程变得复杂。所以放弃用控件的想法吧,直接用API
      

  3.   

    自己写一个组件吧,加入一接收数据后的响应事件;//简单来讲,基本原理如下:
    const MaxLen=255;
    type 
      TReceviceEvent=procedure (Sender:Tobject) of object;
      TBuffer=array [0..MaxLen) of byte;
    TMyComPort=class(TCOMM)//inherited from SPCOMM
      private 
        FReceviceEvent:TReceviceEvent;
        procedure DoRecevice(sender:tobject);//这个方法就是接收后响应事件
        procedure ReceviceData(sender:tobject;buffer:pointer;bufflen:word);//这个方法对应串口接收数据事件
      public
        FBuffData:TBuffer;
        FReceviceLen:Integer;
        property OnReceviceEvent:TReceviceEvent read FReceviceEvent write FReceviceEvent;
      end;//..............实现procedure TMyComPort.ReceviceData(sender:tobject;buffer:pointer;bufflen:word);
    begin
      fillchar(fbuffdata,sizeof(tbuffer),0);
      move(byte(buffer^),fbuffdata,bufflen);
      frecevicelen:=bufflen;
      if assigned(FReceviceEvent) then FreceviceEvent(self);
    end;  
      

  4.   

    自己写吧,正好也可以学习一下,COM编程没有想像中那么难,就是几个API函数而已.