我给一部分我项目中的代码。。呵呵。。不能多给。。只是讲明原理
在你的单元中创建一个线程。。或者是TTimer。
我这里是用Timer。
{
//readTimer处理过程
ReadIP:CBUf的保存指针
saveBuf:用于保存从串口读取的byte
CBuf:用于保存转换后的(2位byte) to 1个integer
}
procedure TPluck.ReadOnTimer(sender:Tobject);
var
ReadBuf:byte;
i,iRow,iCol:integer;
// temp:double;
begin
{*一次读取1个byte*
前 12个 byte为头信息。。无效
}
if pluck.ReadComm_Byte(comm,ReadBuf) then
begin
// form1.Memo1.Lines.Add(intTostr(ReadBuf[1]));
if readbuf=$7e then
begin
if messagebox(0,'数据采集结束!'+#13+#13+
'是否将本次采集数据保存到数据库中?',
'系统提示:',
mb_YesNO+MB_ICONQUESTION)=IDYES
then StorageDB;//进行保存数据库操作
(*显示到详细表中*)
form1.Label3.Caption:='正在将数据添加到详细列表中';
form1.SaveDBPanel.Show;
form1.Gauge1.MaxValue:=ReadIP-4;
i:=0;
while i<=8 do
begin
(*显示列表头*)
form1.RRTDetailGrid.Cells[i,0]:='采集时间';
form1.RRTDetailGrid.Cells[i+1,0]:='数值';
i:=i+2;
end;
//------------
irow:=1;//行
iCol:=0;//列
for i:=1 to readIp-4 do
begin
form1.Gauge1.Progress:=i;
form1.RRTDetailGrid.Cells[icol,irow]:=timeTostr(CBUF.time);
form1.RRTDetailGrid.Cells[icol+1,irow]:=floatTostr(CBUF.val);
iCol:=iCol+2;
if i mod 4=0 then
begin
(*每行显示4个数据*)
inc(iRow);
form1.RRTDetailGrid.RowCount:=iRow;
iCol:=0;
end;
application.ProcessMessages;//防止处理死锁
end;
form1.SaveDBPanel.hide;
pluck.StopRead;
exit;
end;{ if readbuf=$7e then}
if JOFlag then
begin
(*如果是偶数则进行转化*)
saveBuf[2]:=ReadBuf;//保存读取的1个byte[偶数时]
(*去掉帧头:aa 55 eb 90 eb 90 eb 90*)
// form1.Memo1.Lines.Add(intTostr(saveBuf[1])+' '+intTostr(saveBuf[2]));
if ReadIP>4 then
begin
CBuf[ReadIP-4].val:=GetVal(saveBuf,0);//记录数值
CBuf[ReadIP-4].time:=time;//记录时间
form1.Memo1.Lines.Add(floatTostr(CBuf[ReadIP-4].val));
(*绘制曲线图 时间/数值*)
form1.DBChart1.Series[0].AddXY(CBuf[ReadIP-4].time,CBuf[ReadIP-4].val);
(*2位读取好后,清空saveBuf*)
saveBuf[1]:=0;
saveBuf[2]:=0;
end;
inc(ReadIP);//CBUF读取指值加1
end else saveBuf[1]:=ReadBuf;//为奇数时保存到saveBuf[1]
JOFlag:=not JOFlag;
end; //else begin
// form1.Memo1.Lines.Add('错误');
// end;
(*BufSizeEdit显示缓冲区大小*)
form1.BufSizeEdit.Text:=intTostr(GetRXDsize(comm))
end;
--------下面是-ReadComm_Byte的原型-----------------------
//********************
//读串口 ReadComm_Byte
//读取一个Byte
//********************
Function TMyComm.ReadComm_Byte(Const Com:integer;var OneByte:byte):boolean;
begin
result:=true;
if GetRXDSize(com)<=0 then
begin
result:=false;
exit;
end;
bSuccessFlag:=ReadFile(ComHandle[com],OneByte,1,nBytesRead,nil);
if (not bSuccessFlag) or (nBytesRead=0) then
begin
//CloseComm(com); //调用关闭串口
result:=false;
end;
end;