串口通讯数据处理?(100分)

  • 主题发起人 主题发起人 taowei
  • 开始时间 开始时间
T

taowei

Unregistered / Unconfirmed
GUEST, unregistred user!
我用spcomm接收串口通讯的数据,并且接收到的数据要处理?即进行数据分析,采用默认的方法,很容易出现接收帧不全,由于串口不停地在接收,怎样采用接收时处理不会出现丢失帧的情况?
 
主线程负责接收数据,收到数据后用另外一个线程来处理。(新建 TThread 对象)
 
我想处理的速度太慢的话,数据是有可能丢失的,只有保证你处理的速度了!
 
缓冲区增大就可以了。
 
开一个线程监听串口,如果有指令过来,先进入指令队列
然后,开一个线程从队列中去指令逐个执行.就可以了
 
楼主你叫陶伟吗。。?
不巧我也叫~你好啊 认识下~~。。
 
用全局变量,把接收到的数据放在里面,然全再处理
 
串口再快还有你的CPU快啊,肯定可以处理过来的
 
劝你改用别的控件cport
 
必须修改ReadInterValTimeout属性,规定读取串口缓冲区的时间间隔,我有这个经验,多多探讨。
QQ:46760485
 
必须修改ReadInterValTimeout属性
怎样更改?
 
我也是对接收丢数据的问题很苦恼。
我现在是这样处理的(API实现),建立一个线程专门接收数据一接收到数据就写到一个临时文件里,另外建立一个线程监视临时文件,临时文件内容一增加就读取处理,用的仪器较多,有时还是会出现掉数据的现象,接收时有什么方法可以知道接收的数据中有数据已经掉了。
 
我也是。。赫赫。。也是遇到这样的问题。。

把数据缓冲区定的大一点。。。。

用线程或TTimer对象,进行单byte读取,再保存到一个public变量。

我现在作的项目是。。每2个byte表示1个采集数据。 没一帧 5K多个数据。也就1w个byte

起先也是老丢数据。。。后来这样解决的。。。。我是自己写通信单元的。。相对比用组件要较灵活
 
spcomm默认的接收缓冲只有2K,所以你接收的数据量大的话,它就忙不过来,你打开spcomm.pas,找到2048,改为64K以下的任何一个即可,必需是1024的倍数,我就这么用的,ReadInterValTimeout属性是指串口接收数据后等待多长时间处理数据,所以这个属性数字越小越好
 
这是我接收水深仪的程序,如果数据量大的话可以增大缓冲区,如下。波特率为9600,处理没有一点问题。
procedure TMainForm.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
s2,s1:string;
i,j:integer;
NMEA_BUF:array[1..32] of byte;//可以增大1024..2048
Deepth,NMEA_DATA:string;
begin
Deepth:='';
try
move(buffer^,pchar(@NMEA_BUF)^,bufferlength);
for i:=1 to bufferlength do
begin
NMEA_DATA:=NMEA_DATA+chr(NMEA_BUF)+'';
end;
NMEA_DATA:=trim(NMEA_DATA);
if memo1.Lines.Count>=200 then
memo1.Clear;
memo1.lines.add(NMEA_DATA);

//数据处理
s1:=RegulateStr(NMEA_DATA,Space);
if NMEA_I=l1 then
begin
for j:=0 to 3 do
begin
s2:=GetSubStr(s1,Space);
case j of
3:Deepth:=s2;
0,1,2:Deepth:='';
end;
end;
if Deepth<>'' then
begin
nmea_data_flag:=true;
if checknumber(deepth) then
ValueListEditor1.cells[1,ta1[1]]:=s2
else
ValueListEditor1.cells[1,ta1[1]]:='0';
end
else
nmea_data_flag:=false;
end;
except
ValueListEditor1.cells[1,ta1[1]]:='0';
end;
end;
 
建立一个数据处理线程,一个大点的全局缓冲,Comm1ReceiveData响应时只进行往全局缓冲添加数据的操作,如果处理耗时不大,用楼上的方法也可以
 
后退
顶部