只有在使用Receiveln才能触发OnRecieve事件?
反了吧?一旦有数据到,就会触发OnRecieve,只是此时数据可能尚未完全到达,接受时需要注意

解决方案 »

  1.   


    不是啊,就是这样的,我执行以下RecieveIn才会触发OnRecieve
      

  2.   


    哈哈,下面是发送代码procedure TForm1.RzButton1Click(Sender: TObject);
    begin
     tcpClient1.Active :=true;
     TcpClient1.Sendln('FD0,001,060'+#13#10) ;
    end;
    下面我是我执行RecieveIn方法的代码procedure TForm1.RzButton2Click(Sender: TObject);
    var
      s:string;
    begin
      s:=TcpClient1.Receiveln() ;
    end;
    当执行上述操作后,发生OnRecieve事件procedure TForm1.TcpClient1Receive(Sender: TObject; Buf: PAnsiChar;
      var DataLen: Integer);
    var
      s:string;
    begin
      SetLength(s,DataLen);
      Move(buf^,s[1],DataLen);
      mmo1.Lines.Add(s);
    end;
    代码就这么简单,具体的数据格式就顶楼
      

  3.   

    1、可以设置为同步或者异步,通过修改属性BlockMode
    2、因为这个控件的OnRecieve方法只由ReceiveBuf回调,而Receiveln就是调用ReceiveBuf实现的
    3、建议你通讯协议里加上包结尾,比如一个包以2个#13#10结尾,这样你可以使用Receiveln(#13#10#13#10)收取整个完整的包,数据处理则是在OnRecieve中
      

  4.   

    你好,针对第二点,当我发送请求指令后,我该何时调用RecieveIn方法比较合理,如果在异步或者同步的情况,调用时间是否有区别?谢谢你
      

  5.   

    你好,针对第二点,当我发送请求指令后,我该何时调用RecieveIn方法比较合理,如果在异步或者同步的情况,调用时间是否有区别?谢谢你
    同步模式下
    接受界面线程阻塞的话直接Receiveln就可以,不接受界面线程阻塞的话,有2种选择1、开个线程,线程里Receiveln,但是因为OnRecieve不是在主线程被调用的,所以记得不能直接操作vcl。2、开个定时器,在定时器中使用控件的WaitForData方法,返回值为True的时候调用一次Receiveln。 其中2方法当包尾未发来时候还是会产生阻塞。
    异步模式下
    开个定时器,定时器里直接Receiveln就可以,当然也是可以开线程,线程中Receiveln,这个你自己决定。