例如短信息中心号码为深圳 +8613800755500
对方手机号码为 +8613612345678
要发送的信息为“中”
算法步骤:
一、地址部分,用字符串 addr 表示
1、将短信息中心号码去掉+号,看看长度是否为偶数,如果不是,最后添加F
即 addr = "+8613800755500"
=> addr = "8613800755500F"
2、将奇数位和偶数位交换。
=> addr = "683108705505F0"
3、将短信息中心号码前面加上字符91,91是国际化的意思
=> addr = "91683108705505F0"
4、算出 addr 长度,结果除2,格式化成2位的16进制字符串,16 / 2 = 8 => "08"
=> addr = "0891683108705505F0"
二、手机号码部分,用字符串 phone
1、将手机号码去掉+号,看看长度是否为偶数,如果不是,最后添加F
即 phone = "+8613612345678"
=> phone = "8613612345678F"
2、将手机号码奇数位和偶数位交换。
=> phone = "683116325476F8"
三、短信息部分,用字符串 msg 表示
1、转字符串转换为Unicode代码,例如“中”的unicode代码为 4E2D,
(好像是将中字的ASCII码分开,分别转成16进制)。因为我用DELPHI,
请vb朋友自己找例子,网上应该许多
function TfrmMain.str_Gb2UniCode( text: string ): String;
var
i,j,len:Integer;
cur:Integer;
t:String;
ws:WideString;
begin
Result:='';
ws := text;
len := Length(ws);
i := 1;
j := 0;
while i <= len do
begin
cur := ord(ws);
FmtStr(t,'%4.4X',[cur]); //BCD转换
Result := Result+t;
inc(i);
//移位计数达到7位的特别处理
j := (j+1) mod 7;
end;
end;
即 msg = "中"
即 msg = str_Gb2UniCode( msg )
=> msg = "4E2D"
2、将 msg 长度除2,保留两位16进制数,即 4E2D = 4 / 2 => "02",再加上 msg
=> msg = "024E2D"
四、组合
1、手机号码前加上字符串 11000D91,这是一些PDU代码,写死就行了,感兴趣可以参考相关PDU格式说明
即 phone = "11000D91" + phone
=> 11000D9168683116325476F8
2、手机号码后加上 000800 和刚才的短信息内容,000800也写死就可以了
即 phone = phone + "000800" + msg
即 11000D9168683116325476F8 + 000800 + 024E2D
=> phone = 11000D9168683116325476F8000800024E2D
3、phone 长度除以2,格式化成2位的十进制数
即 11000D9168683116325476F8000800024E2D => 36位 / 2 => 18
五、所以要发送的内容为
AT+CMGS=18<回车,ASCII为13>
addr+phone+<^Z>+换行回车<13和10>
即AT+CMGS=18<回车>0891683108705505F011000D91683116325476F8000800024E2D^Z换行回车
你先用AT指令试是 然后在用程序实现
function Encode7bit(Src:String):String;
var Dst:String;
i:Integer;
CurS,NextS:Byte;
TStr:String;
begin
for i:=1 to Length(Src) do begin
//当前是字符按8位分组的第8位,无需编码(8个字符已缩短为7个)
if (i mod 8 )=0 then Continue;
//取当前位为数字
TStr:=Copy(Src,i,1);
CurS:=Ord(TStr[1]);
//当前右移位组中的第一个字符不移位
if ( i mod 8 )>1 then
CurS:=(CurS shr ((i mod 8 )-1) );
//取后一位为数字如果到了字符的结束,不取
if i
TStr:=Copy(Src,i+1,1);
NextS:=Ord(TStr[1]);
end else
NextS:=0;
//后一位移位 左移
NextS:=(NextS shl ( 8-(i mod 8 )));
//当前移位后加后一位移位后 转换成为十六进制
Dst:=Dst+IntToHex(CurS+NextS,2);
end;
Result:=Dst;
end;
function Decode7bit(Src:String):String;
var Dst:String;
i:Integer;
CurS,ProiS:Byte;
begin
for i:=1 to (Length(Src) div 2) do begin
//将当前位的十六进制转换为十进制
CurS:=StrToInt('$'+Copy(Src,(i-1)*2+1,2)); //32->50
//取前一位十六进制转换为十进制
if (i mod 7)<>1 then
ProiS:=StrToInt('$'+Copy(Src,(i-2)*2+1,2)) //C8->200
else
ProiS:=0;
//前一位右移,即将当前字符前移的位取出来
if (i mod 7)>0 then
ProiS:=(ProiS shr (9-(i mod 7)))
else
ProiS:=(ProiS shr 2);
//当前位左移除掉高位
if (i mod 7)>0 then
CurS:=(CurS shl (i mod 7) )
else
CurS:=(CurS shl 7 );
//将第八位设置为0
CurS:=(CurS shr 1);
Dst:=Dst+Chr(CurS+ProiS);
//第七个十六进制内已包含有一个完整的字符
if (i mod 7)=0 then begin
CurS:=StrToInt('$'+Copy(Src,(i-1)*2+1,2)); //32->50
CurS:=(CurS shr 1);
Dst:=Dst+Chr(CurS);
end;
end;//en for
Result:=Dst;
end
转自http://bbs.sendsms.com.cn/
分享到:
相关推荐
以下是对AT编程中常见问题的详细解释: 1. **建立通信联系**:通过使用终端仿真软件(如Windows的超级终端或Pcomm),将计算机串口与GSM MODEM的串口直接连接,确保物理连接正确。 2. **通信异常或乱码**:检查...
AT编程指令是用于控制GSM模块,如WAVECOM的TC35T,进行通信的一种标准命令集。这些指令主要用于短信服务(SMS)的操作,包括发送、接收、删除和管理短信。以下是一些重要的AT指令及其功能: 1. **AT+CMG**:发送SMS...
3. **编程模式**:常见的编程模式有汇编语言编程和C语言编程。汇编语言直接对应硬件操作,效率高但学习曲线较陡峭;C语言编程则提供高级抽象,方便移植,但可能不如汇编语言效率高。 4. **I/O操作**:AT89S51的32个...
本资料主要探讨的是如何使用C语言进行AT89C51的编程及其在实际中的应用。 C语言是一种强大的、结构化的编程语言,适用于编写复杂的程序,并且在嵌入式系统中广泛应用,因为它的代码可移植性好,易于理解和调试。在...
1.8 How can I look at process in the system like ps does? 1.9 Given a pid, how can I tell if it's a running program? 1.10 What's the return value of system/pclose/waitpid? 1.11 How do I find out ...
"AT89C2051AT89C4051编程器"可能是指一个专门针对这两种型号微控制器的编程工具。这个编程器可能支持多种编程协议,如JTAG、ISP(In-System Programming)或并行编程方式,以实现对芯片的编程和调试。 "AT89C2051/...
AT89C2051是一款常见的8位微控制器,由Atmel公司生产,它集成了8KB的EPROM,适用于各种嵌入式控制系统。在没有专业开发环境和编程器的情况下,爱好者可以通过简单的编程电路实现对其的编程。下面,我们将详细讨论...
ProgISP是常见的单片机ISP编程软件,支持多种类型的单片机,包括AT89S51系列。版本号1.66表明这是一个较旧但稳定版的软件。驱动程序则是为了让计算机识别并正确运行USB设备所必需的,它确保了硬件和软件之间的通信。...
同时,编程前应确保软件和硬件环境匹配,避免出现兼容性问题。 通过以上分析,我们可以看到这段源代码不仅展示了如何使用C语言实现AT89C2051编程器的编程逻辑,还涉及了Intel hex文件解析、并行通信接口控制等多个...
新版的EP51编程器软件可能还增加了如仿真、在线调试等功能,使得开发者可以更方便地进行程序测试和问题定位。此外,良好的用户界面和详细的使用指南也是衡量一款编程器软件优劣的重要标准。 总的来说,EP51单片机...
由于硬件设计的原因,前16K的编程速度通常会快于后16K,这是需要注意的一个实际问题,可能会影响到整体的编程效率。 校验是确保编程过程正确无误的重要环节。在单片机编程中,常见的校验方法有CRC(Cyclic ...
16MHz的晶振是AT89C51RC常见的工作频率,它可以提供较高的运行速度,使得单片机在处理复杂任务时有更高的性能。不过,不同的应用可能需要不同频率的晶振,如低功耗应用可能选择更低频的晶振。 五、编程和校验函数 ...
Java Comm API编程指南.doc Javax.comm简介.doc KEIL中如何用虚拟串口调试串口程序.doc Message PDU编码规则.doc QHDQ-29DDDAD3A0.LOG SMSLib串口通信.doc 串口常用参数.doc 关于java使用javacomm20.doc 常见的进制...
AT24C16是一款常见的I²C接口的电可擦可编程只读存储器(EEPROM),通常用于在嵌入式系统中存储小量非易失性数据。STM32则是由意法半导体(STMicroelectronics)生产的基于ARM Cortex-M内核的微控制器系列,广泛应用...
因此,本文介绍了一种自制的AT89C2051单片机编程器,该编程器基于常见的计算机打印口(Parallel Port)设计,通过简单的硬件接口即可实现单片机的编程。 #### 知识点二:AT89C2051单片机编程时序 AT89C2051单片机...
UART(通用异步收发传输器)是一种常见的串行通信接口,它允许STM32与GPRS模块之间以异步方式交换数据。在配置UART时,我们需要设定波特率、数据位、停止位和校验位等参数,以确保双方能正确接收和发送数据。STM32的...