关于MSCOMM发送短信的问题(100分)

  • 主题发起人 icelotus
  • 开始时间
I

icelotus

Unregistered / Unconfirmed
GUEST, unregistred user!
无论是文本模式还是PDU模式,发送AT指令设置信息中心号和模式时都返回OK,但发送消息就返回ERROR,不知道是哪里的问题
如用PDU模式发送短信:
之前在FORMCREATE的时候设置MSCOMM属性如下:
mymscomm.CommPort:=1;
mymscomm.Settings:='9600,n,8,1';
mymscomm.InBufferCount:=0; //清空接收缓冲区
mymscomm.InputLen:=0;
mymscomm.InBufferSize:=1024;
mymscomm.RThreshold:=1;
mymscomm.OutBufferCount:=0; //清空发送缓冲区
mymscomm.OutBufferSize:=1024;
mymscomm.SThreshold:=1;

发送短信过程如下:
procedure TFrm_main.Btn_sendmsgClick(Sender: TObject);
var
sMsg:string;
begin
MSComm1.Output := 'AT'+char(13);
sleep(100);
MSComm1.Output := 'AT+CSCA="+8613800220500"'+CHAR(13); //信息中心号
sleep(100);
MSComm1.Output := 'AT+CMGF=0'+char(13); //设置为PDU格式
sleep(500);
sMsg := '0891683108200205F011000D91683157121468F0000800324F7F752800540065007800746A215F0F653653D177ED4FE14EE378017B805355FF0C5B9E73B08D776765534152065BB96613';
//转换方法略
MSComm1.Output := 'AT+CMGS=65'+ char(13); //消息长度
MSComm1.Output := sMsg+chr(26); //发送内容+CTRL+Z
sleep(2000);
end;
用MEMO显示每次向缓冲区发送与返回的内容如下:
AT

OK
AT+CSCA="+8613800220500"

OK
AT+CMGF=0

OK
AT+CMGS=65

> 1683108200205F011000D91683157121468F0000800324F7F752800540065007800746A215F0F653653D177ED4FE14EE378017B805355FF0C5B9E73B08D776765534152065BB96613
ERROR

为什么总是返回ERROR呢
 
MSComm1.Output := 'AT+CMGS=65'+ char(13); //消息长度
sleep(200);//这里是故意不加的?
MSComm1.Output := sMsg+chr(26); //发送内容+CTRL+Z
sleep(2000);
 
to zywcd:
那个地方忘了加延时,刚才改为
MSComm1.Output := 'AT+CMGS=65'+ char(13); //消息长度
sleep(3000);
MSComm1.Output := sMsg+chr(26); //发送内容+CTRL+Z
sleep(3000);

返回结果是:
AT

OK
AT+CSCA="+8613800220500"

OK
AT+CMGF=0

OK
AT+CMGS=65

> 0891683108200205F011000D91683157121468F0000800324F7F752800540065007800746A215F0F653653D177ED4FE14EE378017B805355FF0C5B9E73B08D776765534152065BB96613


ERROR

但是还是ERROR
 
你这样测试,把这里
MSComm1.Output := sMsg+chr(26); //发送内容+CTRL+Z
sleep(3000);
smsg随便输出一组字符,短一点,看看是什么结果?
 
sMsg :='0891683108200205F011000D91683157121468F00008000A5DE54F5C61095FEBFF01';

MSComm1.Output := 'AT+CMGS=25'+ char(13);
sleep(3000);
MSComm1.Output := sMsg+char(26);
sleep(3000);

还是这样:(
AT

OK
AT+CSCA="+8613800220500"

OK
AT+CMGF=0

OK
AT+CMGS=25

> 0891683108200205F011000D91683157121468F00008000A5DE54F5C61095FEBFF01
ERROR
 
测试
MSComm1.Output := '1213'+chr(26); //发送内容+CTRL+Z
或者
MSComm1.Output := 'AAA'+chr(26); //发送内容+CTRL+Z
或者
MSComm1.Output := '1213'; //发送内容+CTRL+Z
或者
MSComm1.Output := '1683108200205F011000D91683157121468F0000800324F7F752800540065007800746A215F0F653653D177ED4FE14EE378017B805355FF0C5B9E73B08D776765534152065BB96613 '
我怀疑是不是+chr(26);出问题。
 
要把发送的字符串转成Unicode码的,在PDU模式下不能直接像 MSComm1.Output := 'AAA'+char(26);这样发
+chr(26)是我写错了,应该是char(26),少写了个a,用AT+CMGS发送短信是以CTRL+Z为结束标志,CTRL+Z是char(26)吧``
发送的时候屏幕有闪,说明短信设备在执行发送短信操作,但是没有发送成功
 
明白了,这个error是设备返回的信息。那你可能不应该从delphi找原因了。
我觉得不属于通讯的原因,而应该考虑是不是短信设备需要的和你发送的命令不一致,造成短信设备返回error信息。
已经不是mscomm的范围了。
 
http://www.delphibbs.com/keylife/iblog_show.asp?xid=13241
 
现在的硬件还有这么低的波特率吗?
mymscomm.Settings:='9600,n,8,1';//现在应该都是19600了
 
接受答案了.
 
顶部