一个关于发送短信的问题 ( 积分: 50 )

  • 主题发起人 主题发起人 sad_sand
  • 开始时间 开始时间
S

sad_sand

Unregistered / Unconfirmed
GUEST, unregistred user!
请教一个问题。
我用spcomm控件向手机发送短信,在一个线程中对多个用户顺序发送,想在第一条短信收到回执‘OK’以后再开始发送第二条短信,通过CommReceiveData接收数据。请问怎样做?怎么同步?谢谢大家!
我原来不管CommReceiveData是否接收到了'OK',每发一条短信就sleep一段时间,可是后来发现会有乱码和发不出去的现象。所以只好改了。:(
 
请教一个问题。
我用spcomm控件向手机发送短信,在一个线程中对多个用户顺序发送,想在第一条短信收到回执‘OK’以后再开始发送第二条短信,通过CommReceiveData接收数据。请问怎样做?怎么同步?谢谢大家!
我原来不管CommReceiveData是否接收到了'OK',每发一条短信就sleep一段时间,可是后来发现会有乱码和发不出去的现象。所以只好改了。:(
 
//ASC发送
procedure TForm1.BitBtn1Click(Sender: TObject);
var s:string;
begin
s:='1st sms';
Comm1.WriteCommData(PAnsiChar(s),Length(s));
end;

//串口接收
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var i:integer;
rxbuf:array of byte;
s,rxinfo:string;
begin
setlength(s,bufferlength);
move(buffer^,s[1],bufferlength);
if s=('ok'+#13#10) then Comm1.WriteCommData(PAnsiChar(next sms),Length(next sms))
else showmessage('error!'+s);
end;
 
谢谢maxim88,但我的发送用的是个线程,源码如下:
setlength(str,length(Send_addr)*2); //Send_addr是个地址组,对应多个用户
i:=0;
j:=0;
while i<length(Send_addr)*2-1 do //str 是AT指令信息
begin
str:='AT+CMGS=&quot;'+Send_addr[j]+'&quot;,'+inttostr(strlen)+#13;
setlength(ch,length(str));
CopyMemory(@ch[0], @str[1], Length(str));
if not CDMAcomm.WriteCommData(pchar(ch),Length(str)) then
begin
application.MessageBox(PChar('Send' + SendStr+ 'error!'),'失败',MB_OK);
exit;
end;
Application.ProcessMessages;
sleep(500);

str[i+1]:=data+divhex(#13+#26); //data是具体发送的信息 divhex是转换格式
setlength(ch,length(str[i+1]));
CopyMemory(@ch[0], @str[i+1][1], Length(str[i+1]));
if not CDMAcomm.WriteCommData(pchar(ch),Length(str[i+1])) then
begin
application.MessageBox(PChar('Send' + SendStr+ 'error!'),'失败',MB_OK);
exit;
end;
Application.ProcessMessages;
sleep(1000);

i:=i+2;
j:=j+1;
end;

这段代码是写在一个线程里的,如果按照你的写法,该如何改啊?能有别的法子,改动小点吗?
 
用接口锁定读写(阻塞方式)
 
我是觉得没必要用多线程来控制串口,除非你同时使用多个串口设备。我一直使用单线程来对串口编程,开个时钟来控制要发的AT指令(AT指令存在一个数组中),统一处理收到的指令回应就可以了。
 
在Comm1.WriteCommData之前把数据帧整理好就可以了
 
to rjiajia:
呵呵,我因为是要CDMA和GSM同时发短信,因此各起了一个线程,若只用一个,就没想用线程了。我觉得乱码问题可能是因为还没有收到回执‘OK’,就又发送数据造成的,不知道对不对?
to chengangsir,能给个简单例子吗?我还不太明白怎样锁定读写,多谢了!:)
to maxim88:我的数据就是放在字符串组中的啊,还需要怎样整理?请指点。谢谢!:)
 
一个CDMA,一个GSM,那就是开两个串口,用两个线程应该没问题,乱码的问题有可能是PDU编码的问题,先用手动方式把你的PDU码发现来看看会不会乱码。
 
嗯,PDU编码没有问题的,这个程序我已经做过试验了。但是有时候能发出去,有时候乱码。
 
可以采用队列的方法,如果只有一个串口的话,把CDMA,GSM的号码及内容依次放入队列,用一个线程负责发送,一个线程负责管理队列。如果是多个串口,可以用多个线程负责发送。发一条短信大约需要3s时间,如果超过3s没有收到错误信息,就认为已提交到短信中心,可以发送下一条了。另外要注意定时清理SIM卡的信息。
 
谢谢!我是CDMA、GSM各用一个串口,用的就是队列的方式,主要发送两条短信的时间不好控制,可能是手机模块性能的问题。有时发送能行,有时可能上一条的'OK'还没有返回,就开始发送下一条了,于是就出现了乱码。
 

Similar threads

D
回复
0
查看
867
DelphiTeacher的专栏
D
D
回复
0
查看
836
DelphiTeacher的专栏
D
D
回复
0
查看
911
DelphiTeacher的专栏
D
D
回复
0
查看
868
DelphiTeacher的专栏
D
后退
顶部