关于网友提出的“ 急急急!串口通信 数据丢失”问题疑问,本网通过在网上对“ 急急急!串口通信 数据丢失”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 急急急!串口通信 数据丢失
描述: 我的串口通信是接收1024个数据,可是每次只能接受236个,代码如下:
//处理控件中的该事件,获取底层交换数据和连线状态
procedure TForm5.MSComm1Comm(Sender: TObject);
var
i,inputlen,tmpint:integer;
tmpvar:variant;
begin
if mscomm1.CommEvent=comevreceive then
begin
inputlen:=mscomm1.InBufferCount;
tmpvar:=mscomm1.Input;
count:=count+inputlen;
for i:=0 to inputlen-1 do
begin
tmpint:=tmpvar[i];
index:=i+j;
a[index]:=tmpint;
end;
j:=index+1;
end;
end;
//转换并存储数据
procedure TForm5.Button3Click(Sender: TObject);
var
k,x,i:integer;
jj:integer;
begin
max1:=-9999.0;
s1:=0.0; s2:=0.0;s3:=0.0;s4:=0.0;s5:=0.0;s6:=0.0;
s7:=0.0; s8:=0.0;s9:=0.0;s10:=0.0;s11:=0.0;s12:=0.0;
memo13.Clear;
jj:=0;
for k:=0 to (count div 2)-1 do
begin
b[k]:=(a[jj]+256*a[jj+1]);
jj:=jj+2;
if b[k]<$8000 then
begin
b[k]:=b[k]/32768;
end
else
begin
b[k]:=(b[k]-65536)/32678;
end;
end;
//显示转速曲线
begin
Series13.Clear;
for i:=0 to 1023 do
begin
memo13.Lines.Add(floattostr(b[i]));
memo13.lines.savetofile('转速.txt');
end;
drawClick(Sender);
end;
end;
//画图
procedure TForm5.drawClick(Sender: TObject);
var
aStringlist: TStringList;
i: Integer;
begin
aStringlist := TStringList.Create;
try
aStringlist.CommaText:= memo13.Text;
for i := 0 to aStringlist.Count -1 do
begin
Series13.Addxy(i*0.2,b[i],'',clred);
if max1<>
begin
max1:=b[i];
j1:=i+1;
end;
end;
edit3.Text:= floattostr(max1) ;
finally
aStringlist.Free;
end;
end;
其中,窗口的输入输出缓冲区均设置为2048,请各位大大帮忙提供宝贵的建议及其意见,谢谢!
解决方案1: 嗯,有一个接收阀值设置下试试
解决方案2: 上位机发命令,(你的延时在这吧?)下位机接收处理并向上位机发送数据,上位机程序检测到串口有数据来(这里就是字符标志或其它标志),引发事件(起作用的延时要在这里!),延时,读串口。。。。
解决方案3: procedure TForm5.MSComm1Comm(Sender: TObject);
var
i,inputlen,tmpint:integer;
tmpvar:variant;
begin
//DELAY();这里延时
if mscomm1.CommEvent=comevreceive then
begin
//DELAY();或者这里延时
inputlen:=mscomm1.InBufferCount;
tmpvar:=mscomm1.Input;
count:=count+inputlen;
for i:=0 to inputlen-1 do
begin
tmpint:=tmpvar[i];
index:=i+j;
a[index]:=tmpint;
end;
j:=index+1;
end;
end;
我一般用CPORT这个控件,就是这么处理的。
解决方案4: 接收到字符产生事件,这时很可能还没收全,检测已收到字符长度,长度够了才读串口。
何时检测收到字符长度,实现方式有许多,如定时检测、线程处理等
最简单的是在你事件处理里一开始加个延时(延时时间自己试出来)。。。笨,但有效~~~~~
解决方案5: 设置通讯协议中的时间间隔,这个会影响数据接收的准确性
以上介绍了“ 急急急!串口通信 数据丢失”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/3658693.html