短信控件开发总结——Delphi+SPcomm 短信猫型号:ETPro309 支持CDMA
rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"> rel="Edit-Time-Data" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_editdata.mso">
公司打算将原有的短信控件升级,使其支持CDMA。我花了将近三个星期的时间才完成这个任务。在开发过程,遇到了一些问题。
首先,发送中文短信时,收到的短信是乱码。开始在超级终端里按照如下操作:
但是失败了。
后来咨询了设备的技术人员,他们告诉我可能在AT$HSMSSD=13633208834,4,1,2后加入了回车,造成了乱码。同时也明白 在超级终端没有办法发送中文短信成功。在设备的技术人员的指点下,下载了一款软件sscom32,可以很好的发送中文短信
终于发送中文短信成功。
当然,在delphi如何来实现呢?
第一步就是 把要发的内容变成Unicode 编码--Unicode 编码是16进制的
但是我还是发现收到的是乱码。想了蛮久,才恍然大悟。Unicode 编码是16进制的,但是计算机它并不知道,也就是要把16进制的字符串转换成计算机能识别的二进制。
function h2s(s: String): String; { unicode -->16进串 }
var
i: integer;
h: String;
r: String;
begin
r := '';
for i := 1 to Length(s) div 2 do
begin
h := '0x' + string(s[i * 2 - 1]) + string(s[i * 2]); // '0x'应该也可用'$'在delphi 表示16进制
r := r + string(chr(StrToInt(h)));
end;
h2s := r;
end;
终于成功了
收短信时也到了问题.收到的短信出现丢失数据,后仔细跟踪发现
procedure TForm1.ModemReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
Var MsBuffer : Pchar;
mBuffer : String;
Begin
MsBuffer := Buffer;
mBuffer := StrPas(MsBuffer); //在pchar转成String 会出现数据的丢失。
end;
PChar简图:
-------------------------
| L | I | K | E | #0 |
-------------------------
也就是PChar 串是以 Null 结束的, 或者说是以 "空字节" 结束的;
PChar 串见到 "空字节" 就认作结束了;
这样如果MsBuffer有#0 就会截断,所以造成数据丢失。
如果不懂的话可以参考:http://www.newasp.net/tech/program/19732.html
所以就写了两个函数:
function GetString(s:PChar;BufferLength: Word): String;
var
i: integer;
c: integer;
h: String;
begin
h := '';
for i := 0 to BufferLength-1 do
begin
c := ord(s[i]);
h := h + IntToHex(c, 2);
end;
s2h := h;
end;
function h2s(s: String): String; { 16进串-->串 }
var
i: integer;
h: String;
r: String;
begin
r := '';
for i := 1 to Length(s) div 2 do
begin
h := '0x' + String(s[i * 2 - 1]) + string(s[i * 2]);
r := r + String(chr(StrToInt(h)));
end;
h2s := r;
end;
procedure TForm1.ModemReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
Var MsBuffer : Pchar;
mBuffer : String;
Begin
MsBuffer := Buffer;
mBuffer := GetString (MsBuffer);
mBuffer := h2s(mBuffer);
end;
第三个问题就是 关于中文汉字里头的“向”字,只要有它就会出现乱码。
查看了“向”字unicode 为:5411。仔细跟踪发现后面的 11 变成00
查了一些资料才知道:
Outx_XonXoffFlow属性置False
Inx_XonXoffFlow属性置False
就可以,究竟为什么我有点不懂,他们说 SPCOMM的Inx_XonXofflow和Outx_XonXofflow是硬件流控制方面的选项,设置控制字符的
可以参考:
http://topic.csdn.net/u/20080918/15/072298db-f8eb-4c70-a332-fe21a866bb72.html
如果大家还关于这方面的问题,可以跟我发邮件:china_zhli@163.com
我将尽力解决。同时也可交流,提到意见。呵呵
如要转载请注明出处和联系作者