用spcomm写了一个串口通讯程序,发送数据没有问题,但是在接收数据的时候,却出现假死现象(接收到一段数据后就不动了),但是发送端却显示已经把数据发送过来了,这是什么原因呢?不会是控件的问题吧?因为我在程序中需要对返回代码进行判断并在界面上显示,请问,这个过程需要设置多少ms的时间间隔才比较合理?并且我现在的程序有两个问题:一个就是接收数据的问题;一个就是界面显示的问题;由硬件送回来的数据都很快,一般都在几十ms左右,而我的程序却处理不了那么快,通常需要设置50ms左右,请问有什么办法可以加快处理速度呢(包括界面显示的速度)?

解决方案 »

  1.   


    主要代码如下:
    procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
      BufferLength: Word);
    var
      i:integer;
      viewstring :string;
    begin
      viewstring :='' ;
      move(buffer^,pchar(@rbuf)^,bufferlength);  for i:=0 to bufferlength-1   do
        viewstring:=viewstring+inttohex(rbuf[i],2)+'' ;
        viewstring:='GET='+viewstring;
        memo2.lines.add(viewstring);   //串口接收回来的数据  if ((rbuf[0] = byte($F0)) and (rbuf[4] = byte($F1))) then
      begin
         if ((rbuf[2] <> byte($D2)) or (rbuf[2] <> byte($D3))) then
           begin
            self.DisplayMatrixStatus(rbuf[1],rbuf[2],rbuf[3]);
           end
         else
         begin
            self.SetDisplay(rbuf[1]-1,rbuf[3]);
            self.GroupBox4.Repaint;
           end;
      end
      else
      begin
      ……………… 
      end;end;
    procedure TForm1.DisplayMatrixStatus(i, j, k: byte);
    var
      f,c1,c2,c3: integer;
    begin
      c1 := i-1;       
      c2 := j-$C0;
      c3 := k-1;
      f := k div 16; 
     showmessage(inttostr(k));
      if (f = 0) then  
      begin
        form6.CheckBox[c1,c2,c3].Checked := true;
        form6.CheckBox[c1,c2,c3].Repaint;
        form6.GroupBox[0].Repaint ;
        form6.GroupBox[1].Repaint ;
      end;
      if (f = 1) then           
      begin
        form6.CheckBox[c1,c2,k-17].Checked := false;
        form6.CheckBox[c1,c2,k-17].Repaint ;
        form6.GroupBox[0].Repaint ;
        form6.GroupBox[1].Repaint ;
      end ;
    end;