procedure TMainForm.MSComm1Comm(Sender: TObject);
var
  buffer :variant;
  s1:string;
  c :char;
begin
  case Mscomm1.CommEvent of
  ComEvSend:
    begin
      Memo_Show.Lines.Add('发送数据!');
    end;
  ComEvReceive:
    begin
      buffer:=Mscomm1.Input;
      s1:=buffer;
      c:=s1[1];
      ss:=ss+c;
      Memo_show.Lines.Add(ss);
      ss:='';
      inc(JSdate);
      StatusBar.Panels.Items[2].Text:='接收:'+inttostr(JSdate);
      Diff(datetostr(now)+' '+timetostr(now)+' 接收到:'+ss);
    end;
  end; 
end;procedure TMainForm.Btn_SysClick(Sender: TObject);
var
  SendHex:array[0..8] of char;
  s:string;
  i:integer; 
begin
  try   
    s:='';
    SendHex[0]:=chr($44);
    SendHex[1]:=chr($30);
    SendHex[2]:=Chr($31);
    SendHex[3]:=chr(13);
    SendHex[4]:=chr($50);
    SendHex[5]:=chr($4f);
    SendHex[6]:=chr($4c);
    SendHex[7]:=chr(13);
    SendHex[8]:=chr(4);
    for i:= 0 to 8 do
     s:=s + SendHex[i];
     Mscomm1.Output:=s;
     FSdate:=FSdate+length(s);
     diff(datetostr(now)+' '+timetostr(now)+' 发送:'+s);
     StatusBar.Panels.Items[1].Text:='发送:'+inttostr(FSdate);
  except
    Memo_show.Lines.Add('发送查询系统指令出错!')
  end;
end;我在case Mscomm1.CommEvent of处设置断点,运行procedure TMainForm.Btn_SysClick(Sender: TObject);可是没有触发OnComm事件,why?

解决方案 »

  1.   

    在串口接收缓冲区中有字符,或者 Carrier Detect (CD) 或 Request To Send (RTS) 线上一个字符到达或一个变化发生时。在这些情况下,可以利用 MSComm 控件的 OnComm 事件捕获并处理这些通讯事件。OnComm 事件还可以检查和处理通讯错误。所有通讯事件和通讯错误的列表,参阅 CommEvent 属性。在编程过程中,就可以在OnComm事件处理函数中加入自己的处理代码。这种方法的优点是程序响应及时,可靠性高。每个MSComm 控件对应着一个串行端口。如果应用程序需要访问多个串行端口,必须使用多个 MSComm 控件。 
      

  2.   

    OnComm 常数 常数 值 描述 
    comEvSend 1 发送事件。 
    comEvReceive 2 接收事件。 
    comEvCTS 3 clear-to-send 线变化。 
    comEvDSR 4 data-set ready 线变化。 
    comEvCD 5 carrier detect 线变化。 
    comEvRing 6 振铃检测。 
    comEvEOF 7 文件结束。 
      

  3.   

    原来是我自己把控件的rthreshold设置为0了,这样即使有数据接收过来也不会触发.