关于通讯方面的原代码网上有很多,其中以“串口调试助手”比较
的有名,它无非是当命令发送出去后,让返回信息促发 onreceive事件,
把返回的信息显示出来。这是是一种很典型的应用,它适合于调试的环境,
而且效率很高。
  但我们知道,还有一种方式就是“查询方式”,这种方式的特点就是控制简单,
但效率低。 我们的程序一般都是在自动运行,不可能知道命令发出后什么时候有信息返回,然后再发底二条
特别是当有多条命令需要安顺序发送时,如果按第一种方式通讯,相当不好控制
而用第二种方式发送,效率却很低下,而且它不能接受主动的上传信息。
 
 我想对于上面的问题,大家已经有了很好的解决方案,能否赐教!!!!!

解决方案 »

  1.   

    比方说:我有一个命令队列 命令(1)-> 命令(2) ->命令(3)只有当命令(1)发出后,并且得到正确的应答才能发命令(2),否则
    应该重发命令(1),依次类推,我如何选用第一种方式进行通讯,要知道用第一种方式的
    优点是很多的!!!
      

  2.   

    我是用线程实现的;先给你的命令定个数据结构:
    type TCMD=record
       bury:boolean;
       cmd:byte; //你要发送的字节,长度可以自定
    end;....
    var sMessage:TCMD;
    ....procedure Tform1.add(b:byte);
    var i:integer;
    begin
    if (High(sMessage)=0)and(sMessage.bruy=false) then
       begin
       setlength(sMessage,1);
       sMessage[0].bruy:=true;
       sMessage[0].cmd:=b;
       try
       if Thread1.Suspended then
          begin
          Thread1.Resume;
          end;
       except
         end;
       end
    else
       begin
       setlength(sMessage,High(sMessage)+2);
       sMessage[High(sMessage)].cmd:=d ;
       sMessage[High(sMessage)].bruy:=true ;
       try
       if Thread1.Suspended then
          begin
          Thread1.Resume;
          end;
       except
         end;
       end;
    end;procedure Tform1.Comm1ReceiveData(Sender: TObject;
      Buffer: Pointer; BufferLength: Word);
    var i:integer;
    begin
    //可以在这里加一个反馈判断
    ...
    for i:=0 to high(sMessage) do
       begin
       if sMessage[i].bruy=true then
          begin
          sMessage[i].bruy:=false;
          end;
       application.ProcessMessages; //不至于占太多系统资源
       end;
    ...
    end;//=============以下为线程内容=====================
    function sendmessage;
    begin
    for i:=0 to high(sMessage) do
       begin
       if sMessage[i].bury then
          begin
          //发送sMessage[i].cmd命令
          exit;
          end;
       end;
    setlength(sMessage,1);
    sMessage[0].bruy:=false;
    sMessage[0].cmd:=byte(0);
    end;procedure Thread1.Execute;
    begin
      while not Terminated do
       begin
       try
       sendmessage; 
       Application.ProcessMessages;
       sleep(2000);
       except
       end;
       end;
    end;
      

  3.   

    我想买一本这 DELPHI 方面得书,主要介绍DELPHI 关于 tcp/ip udp 编程得例子,
    要有一些详细得例子,什么书好?
      

  4.   

    基于上面得问题,谁能提供tcp/ip例子和源码?
      

  5.   

    delphi 的实例中就有。看实例吧,非常直观易懂。稍微改动,就是你的东东了。Borland\Delphi6\Demos
      

  6.   

    Borland\Delphi6\Demos 
    这里面有你想要的所有实例。delphi新增的控件用法及实例都在这里。用不着求人,
      

  7.   

    Delphi6\Demos\Indy\TCPStreamClientServer  按F12 窗口弹不出来,为什么?
      

  8.   

    Delphi6\Demos\Indy\TCPStreamClientServer  按F12 窗口弹不出来,为什么?
    将 FORM 的 TOP 属性改一下就行了。
      

  9.   

    look!http://218.56.11.178:8020/web/index.aspx有源代码http://218.56.11.178:8020/web/technology/chuangkou.htm