短信控件开发总结——Delphi+SPcomm 短信猫型号:ETPro309 支持CDMA

rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml">

短信控件开发总结——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

就可以,究竟为什么我有点不懂,他们说 SPCOMMInx_XonXofflowOutx_XonXofflow是硬件流控制方面的选项,设置控制字符的

可以参考:

http://topic.csdn.net/u/20080918/15/072298db-f8eb-4c70-a332-fe21a866bb72.html

如果大家还关于这方面的问题,可以跟我发邮件:china_zhli@163.com

我将尽力解决。同时也可交流,提到意见。呵呵

如要转载请注明出处和联系作者


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GSM MODEM 动态链接库 (DLL) 二次开发接口 适用范围: 本短信二次开发接口适用于WAVECOM、西门子、诺基亚、摩托罗拉等支持标准AT指令的GSM短信终端 使用方式: 将sms.dll文件拷贝到系统安装目录中的system32文件夹中,然后再根据以下接口函数说明和提供的例程源码开发 接口函数: 1、Sms_Connection(Com_Port As Integer,Com_BaudRate As Integer, Mobile_Type As String) As Integer Sms_Connection函数说明如下: 功能描述:用于初始化终端与串口的连接 Com_Port:串口号(0为红外接口,1,2,3,...为串口) Com_BaudRate:波特率 Mobile_Type:返回终端型号 Sms_Connection:返回值(0:连接终端失败;1:连接终端成功) 2、Sms_Send(Sms_TelNum As String, Sms_Text As String) As Integer Sms_Send函数说明如下: 功能描述:发送短信 Sms_TelNum:发送给的终端号码 Sms_Text:发送的短信内容 Sms_Send:返回值(0:发送短信失败;1:发送短信成功) 3、Sms_Receive(Sms_Type As String, Sms_Text As String) As Integer Sms_Receive函数说明如下: 功能描述:接收指定类型的短信 Sms_Type:短信类型(0:未读短信;1:已读短信;2:待发短信;3:已发短信;4:全部短信) Sms_Text:返回指定类型的短信内容字符串(短信内容字符串说明:短信短信之前用"|"符号作为分隔符,每条短信中间的各字段用"#"符号作为分隔符) 4、Sms_Delete(ByVal Sms_Index As String) As Integer Sms_Delete函数说明如下: 功能描述:删除指定的短信 Sms_Index:短信的索引号 5、Sms_AutoFlag()As Integer Sms_AutoFlag函数说明如下: 功能描述:检测连接的终端是否支持自动收发短信功能 Sms_AutoFlag:返回值(0:不支持;1:支持) 6、Sms_NewFlag() As Integer Sms_NewFlag函数说明如下: 功能描述:查询是否收到新的短信息 Sms_AutoFlag:返回值(0:未收到;1:收到) 7、Sms_Disconnection() As Integer Sms_Disconnection函数说明如下: 功能描述:断开终端与串口的连接
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值