我们现在是通过spcomm这个控件发送at命令到某个手机完成拨打号码动作。
我的流程是循环检测用户电脑的所有端口,然后发送标准的ATD 命令。然后每个串口等待2秒,如果没有返回数据则循环到下一个端口;如果有返回数据则退出循环,完成其他动作。
那么问题来了,有时候会出现命令发送出去了,但是没有接受到返回数据,造成客户端这边不知道是否发送成功还在那循环检测。
ps:这种出现的几率也不是很大。
  我的接受代码procedure TFrm_AppClient.Comm1myReceiveData(Sender: TObject; Buffer: Pointer;
  BufferLength: Word);
  var s:string;
begin  
  s:='';
  sleep(100);//等待100ms,保证接收到所有数据
  SetLength(s, BufferLength);
  Move(buffer^, PChar(s)^, BufferLength);    //将接收缓存区中的数据转移到数组中  
  if pos('OK',s)>0 then
      getlghuwei:=true;
 // else
 //    getlghuwei:=false;
  Application.ProcessMessages;
end;问题会出现在哪里呢?
我是动态生成spcomm控件的,comm_call.CommName:=basedata.sysInfo.strCallPhoneCom;
            comm_call.BaudRate := 9600;
            comm_call.ByteSize := _8;
            comm_call.DsrSensitivity := False;
            comm_call.DtrControl := DtrDisable;
            comm_call.IgnoreNullChar := False;
            comm_call.Inx_XonXoffFlow := False;
            comm_call.Outx_CtsFlow := False;
            comm_call.Outx_DsrFlow := False;
            comm_call.Outx_XonXoffFlow := False;
            comm_call.Parity :=None;
            comm_call.ParityCheck := true;
            comm_call.ReadIntervalTimeout := 200;
            comm_call.RtsControl := RtsDisable;
            comm_call.StopBits := _1;
之前网上查说有可能是由于数据缓存区什么的。
还有通讯协议是全双工还是半双工什么的。
通讯协议估计是手机制造商出厂的时候就弄好的,我不太清楚。

解决方案 »

  1.   

    针对1:编码 串口的基本设置都已经贴了代码。
    针对2:最常见到解决办法,就是在接受数据的时候进行误码判断。---------可惜我都不知道这个是否有正确的返回。因为我在Comm1myReceiveData这里面 加了日志的。
    除非我在spcomm的接受数据线程中加入日志???
    针对3:通讯协议我这里不知道,手机制造商估计才知道的。但是我们只是购买了他们的手机,具体的协议如何知道呢?
      

  2.   

    你这个很好的解决吧,应该是循环的问题,你一个串口创建一个spcomm不就可以了,这样基本就不会丢失数据了。