我用PC串口COM1连接手机模块(BenQ M22),通过MSComm控件进行串口操作发AT命令来发送短信,发送的消息前面部分总被截断,百思不得其解,请各位大侠帮忙看看,下面是AT命令和程序代码:文本模式的AT命令:
<-----------------------------
AT
AT+CSCA="+8613800280500" //设置短信中心号,成都
AT+CMGF=1
AT+CMGS="要发送的手机号"  //双引号部分用真实手机号代替
>How are you
----------------------------->
手机上得到的结果:e you 
PDU模式下的AT命令:
<-----------------------------
AT
AT+CSCA="+8613800280500" //设置短信中心号,成都
AT+CMGF=0
AT+CMGS=65
>0891683108200805F011000D91683106089259F7000800324F7F752800540065007800746A215F0F6536
53D177ED4FE14EE378017B805355FF0C5B9E73B08D776765534152065BB96613
----------------------------->上面的代码放到超级终端执行则发送正确,在程序中运行完后,打开超级终端,看到如下结果:
<--------------------------------
AT+CMGS=65
>1000D91683106089259F7000800324F7F752800540065007800746A215F0F653653D177ED4FE14EE378
017B805355FF0C5B9E73B08D776765534152065BB96613
ERROR
-------------------------------->显然数据头部的“0891683108200805F01”被截断了。奇怪的是下面附的程序代码如果在设置断
点调的状态则可以发送竟然成功,直接运行则被截断。是不是Delphi中变量运用的问题呀?我用的是Delphi7.附:以下是PDU模式下的Delphi程序代码(文本模式仅是AT命令不同),麻烦那位高手帮忙指正一下,
在下先谢过:<==============================================================>
procedure TManuGetInfoForm.btnSendClick(Sender: TObject);
var
  sMsg: String;
begin
  //-----------配置组件----------------------
  MSComm1.CommPort := 1; //使用COM1
  MSComm1.Settings := '115200,N,8,1'; //设置波特率
  MSComm1.InputLen := 0;       //设置该属性为0表示Input读取整个缓冲区的内容。
  MSComm1.InBufferCount := 0;   //清空接收缓冲区
  MSComm1.OutBufferCount := 0;  //清空发送缓冲区  try
    MSComm1.PortOpen := true;    //打开端口
  except
    MessageDlg('打开端口时发生错误,请确认端口是否被其它程序占用',mtError,[mbOk],0);
    exit;
  end;
  //-----------发送 AT命令----------------------
  MSComm1.Output := 'AT'+char(13);  //发送 AT
  sleep(100); //延时0.1秒  MSComm1.Output := 'AT+CSCA="+8613800280500"'+CHAR(13);//成都移动短信中心号:+8613800280500
  sleep(100); //延时0.1秒  
  MSComm1.Output := 'AT+CMGF=0'+char(13); //发送'AT+CMGF=0'设置为PDU方式
  sleep(500); //延时0.5秒  sMsg := '0891683108200805F011000D91683106089259F7000800324F7F752800540065007800746A215F0F
          653653D177ED4FE14EE378017B805355FF0C5B9E73B08D776765534152065BB96613';
  MSComm1.Output := 'AT+CMGS=65'+ char(13);//发送 AT+CMGS=消息长度
  MSComm1.Output := sMsg+chr(26); //这里是发送的消息,char(26是Ctrl+Z)
  sleep(1000); //延时1秒  //---------------------------------------
  MSComm1.PortOpen := false; //关闭端口
end;

解决方案 »

  1.   

    1、短信中心号码不用每次都写,设置一次之后就行了。
    2、如果每次都用pdu方式发送,打开串口时设置'AT+CMGF=0'就可以了。
    3、发送pdu字符串的长度,我不知道你怎么计算的,应该是这样:
        SendLen := (Length(PduStr)-2) div 2;
    4、
      MSComm1.Output := 'AT+CMGS=65'+ char(13);//发送 AT+CMGS=消息长度  sleep(700);//这里最好加个延时******  MSComm1.Output := sMsg+chr(26); //这里是发送的消息,char(26是Ctrl+Z)
    5、检查你的pdu字符串组合的是否正确。其实前面是中心号码,不要也罢
      

  2.   

    To cjf1009(农民程序员) :1.短信中心号和发送方式即使每次都设置应该也不会出现那样的错误吧?2.发送pdu字符串的长度,我是这样算的
       sLen := 15 + (length(MsgStr)) div 2 //MsgStr是发送消息的Unicode字符串
    这样对吗?3.pdu字符串组合的是否正确。因为在超级终端可以正确发送出去。
    前面是中心号码不要也行吗?好像在超级终端发不出去的吧?而且我的程序里截断的比中心号好像多了一位?
      

  3.   

    procedure TmainForm.FormCreate(Sender: TObject);
    begin
       configport;
       configcom;
       //callcount:=0;
      pagecontrol1.ActivePage:=TabSheet2;
      memo1.Clear;
      memo2.Clear;
      memo3.Clear;
      memo4.Clear;
      commconnect:=false;
      netconnect:=false;
      receiveconnect:=false;  N8.Enabled:=true;
      N3.Enabled:=false;
      N2.Enabled:=true;
      clearbutton.Enabled:=true;
      N5.Enabled:=false;
      N6.Enabled:=true; with Tinifile.create('proj2000.ini') do
      try
      ClientName:=ReadString('select',  'ClientName', 'SELECT');
      finally
      end;  showenable1:=true;
      showenable2:=true;
      showenable3:=true;
      showenable4:=true;
      try
      startclient.Click ;  comm1.StartComm;
      finally
      commdisplay;
      end;
      receivedisplay;
    end;有谁可以帮我看一下上面的程序阿。我做的是一个串口通讯的程序。可是当程序执行到comm1.StartComm;就出现死机现象了。我如果把这个语句给注释掉就不会再死机了。不知道是什么原因。有谁可以帮我一下吗。非常谢谢!!!!
      

  4.   

    不要用MSCOMM控件,它没有使用缓冲,建议使用SPCOMM控件,它是使用缓冲的,数据一般不会被截断.如果需要可以告诉我你的EMAIL地址,发给你一个.或者自己上网上搜一下,有许多的.
      

  5.   

    TO yuti() 
     谢谢你!!!我用的就是SPCOMM阿。对了,忘了告诉你,我程序运行时,服务器端程序没有运行。要不我把程序给你发过去你看一下好吗?我看了很久的,可是看不出来是什么问题。或者你给我说一下,可能是什么原因造成的呢?
      

  6.   

    原因我已经找出来了,感谢各位参与,正如yuti() 所说,MSComm没有缓冲,在发送数据量大时要给予足够的延时,1秒是不够的,如果改成2秒以上就没有问题,希望我的问题能抛砖引玉:  MSComm1.Output := 'AT+CMGS=65'+ char(13);
      MSComm1.Output := sMsg+chr(26); 
      sleep(2000);  <---- 这里要给2秒左右的延时才行  //---------------------------------------
      MSComm1.PortOpen := false; //关闭端口
      

  7.   

    结贴!lyqili只要麻烦你另起一贴讨论了,你先不try,看看系统给你什么错误,这样对你调试程序有帮助,调好了以后再try吧!
      

  8.   

    怎么我结贴都结不了,分配的数学老是分不起啊????另外,使用SPComm控件如果延时不够一样有问题,我都试过了!