您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> Delphi >> 急急急!串口通信 数据丢失

急急急!串口通信 数据丢失

来源:网络整理     时间:2016/8/29 11:21:12     关键词:

关于网友提出的“ 急急急!串口通信 数据丢失”问题疑问,本网通过在网上对“ 急急急!串口通信 数据丢失”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: 急急急!串口通信 数据丢失
描述:

我的串口通信是接收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

相关图片

相关文章