用MSCOMM通过串口从工业秤中读重量数据
procedure TForm1.MSComm1Comm(Sender: TObject);
var
  STX:string;
begin
  case MSComm1.CommEvent of
     ......
    comEvCTS: exit;          //有时进入该清除发送通信事件,我不希望该事件
       
    comEvReceive:           //我需要进入接收事件,我希望该事件
    begin
      strWei:= MSComm1.Input ;
      STX:=MidStr(strWei,1,1);
      if STX= #2 then
      begin
        iWei:= strtoint(MidStr(strWei,5,6));
        edit1.Text:= inttostr(iWei) ;
        MSComm1.InBufferCount := 0;
        MSComm1.PortOpen :=false;
        if MSComm1.PortOpen =false then
        begin
          sleep(100);
          MSComm1.PortOpen :=true;
        end;
      end;
    end;
  end;
end;
CTS信号线的状态经常发生变化,影响我接受数据,怎样才能在程序中屏蔽该信号线的状态

解决方案 »

  1.   

    有就是说经常进入comEvCTS通信事件,而我希望的是一直进入comEvReceive通信事件
    procedure TForm1.MSComm1Comm(Sender: TObject);
    var
      STX:string;
    begin
      case MSComm1.CommEvent of
         ......
        comEvCTS: exit;          //有时进入该清除发送通信事件,我不希望该事件
           
        comEvReceive:           //我需要进入接收事件,我希望该事件
        begin
          ......
        end;
       end;
    end;
        
    CTS信号线的状态经常发生变化,影响我接受数据,怎样才能在程序中屏蔽该信号线的状态
      

  2.   

    哈哈  老兄  你就不能写成:
    procedure TForm1.MSComm1Comm(Sender: TObject);
    var
      STX:string;
    begin   if Mscomm1.CommEvent = comEvReceive:          
        begin
          ......
        end;
       end;
    end;
    就这样
      

  3.   

    我用spcomm从托利多的地中衡读取数据,很稳定
    不妨换一下
    msn:[email protected]
      

  4.   

    if Mscomm1.CommEvent = comEvReceive then
    SORRY   刚才写错了
      

  5.   

    我先用if Mscomm1.CommEvent = comEvReceive then 试试,如果不行再用SPCOMM我也是从托利多的工业秤中对重量数据,秤的型号:8142PRO,但读出来的数据格式跟该技术手册上的有点不一样,技术手册上的数据格式是:#20000004000000000DH0
    而我读出的是:#2)0 0004000000000DH0,都为18个字节
      

  6.   

    哦忘了说:0DH为ASCII回车符
    我有点记不清了
      

  7.   

    to:suuare(督察)
    用if Mscomm1.CommEvent = comEvReceive then不能解决问题,当CommEvent的通信事件连续为comEvCTS时,就接收不到comEvReceive通信事件下面是我初始化MSCOMM,我接收的数据是18个字节,
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      ....
      if MSComm1.PortOpen then
        MSComm1.PortOpen := false;  with MSComm1  do
      begin
        CommPort :=1;
        Settings :='4800,e,7,1';
        InBufferSize :=18;
        InputLen :=18;
        RThreshold :=17;                //18??
        SThreshold :=0;
        Handshaking := comNone;
        PortOpen :=true;
        sleep(500);
        InBufferCount:=0 ;
        ....
    end;我把RThreshold的值设置为0或17都不行,后来我将其改为10,测试了几十次都OK,不知道是不是这个原因,请高手指教,谢!!!明天在去测试。
      

  8.   

    RThreshold:该属性为一阀值,它确定当接收缓冲区内的字节个数达到或超过该值后就产生代码为ComEvReceive的OnComm事件。
    可能正确
      

  9.   

    RThreshold := 1;即 没接收到一个字节就产生一次OnComm事件
    另外  你在每次产生OnComm的时候去处理显然不对,在产生事件的时候 应该做适当的延时 否则 你接收到的数据不全
     故:
    var S:Sring;
    if Mscomm1.CommEvent = comEvReceive then
      begin
       Sleep(200);   //这个时间你可以按照你的波特率和接收长度算出来  即超时时间
       S := Mscomm1.Input;
       ......
      end;