串口自动接收数据的问题? a -> b 发请求,b->a 回复时a自动接收,当自动接收时,用Timer事件还是需要开线程?想用Timer事件,它会丢失数据吗?有经验的帮个忙,先谢了。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 是的Timer 可能会丢失数据 因为优先级较低 当其他线程占用时间比较久时 会得不到执行 在串口通信中有两种方式,取得串口数据。一种是轮询方式,另一种是多线程方式: 用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; beyondtkl(大龙驹<无悔这一生 恩德汝>) or Jute(东方明珠) ( ):可否留下联系方式以方便交流,谢谢了。 what does "自动接收" mean? 有谁知道使用winAPI读取安装软件信息 菜鸟急求高手请教Delphi问题 大量数据操作时,界面冻结,如何解决。 SocketConnection必须放在RemoteDataModule中才可以用么 函数中二维数组参数的传递 Delphi开发Sqlserver数据库问题…… 文件真正的创建时间 加密问题!!!!!!!!!!! 求教关于extended stored procedure 的操作 是D版原因吗? 请系统介绍delphi几种连接数据库的方法 緊急求助,為深麼在access被設置密碼以後用ado連接總是連接不上阿,提示已被另一用戶以獨占方式打開
我建议你使用第三方控件吧,你真的用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;