i7456 发表于 2013-10-29 14:05:51

shenhaiyu 发表于 2013-10-29 12:11 static/image/common/back.gif
我用的就是Mega,测试编译用不着板子的,现在的问题是编译通不过,那个char换成String不行,这个我帮你测 ...

shenhaiyu 发表于 2013-10-29 16:03:25

i7456 发表于 2013-10-29 14:05 static/image/common/back.gif


我知道低版本的可以编译通过,但是高版本呢,我很多库都是高版本的,不能为了这一个重写全部的库吧~~

i7456 发表于 2013-10-31 14:41:26

shenhaiyu 发表于 2013-10-29 16:03 static/image/common/back.gif
我知道低版本的可以编译通过,但是高版本呢,我很多库都是高版本的,不能为了这一个重写全部的库吧~~

// 将2位的十进制数转换为十六进制,字符串格式
String Dec2Hex_String(int number_2bit) {

String number;

if(number_2bit < 16)
    number = "0";   

number += String(number_2bit, HEX);
number.toUpperCase();

return number;
}

shenhaiyu 发表于 2013-11-1 13:05:11

i7456 发表于 2013-10-31 14:41 static/image/common/back.gif


Cool!!!!这回转换的看起来正确多了,但是和别的工具还有一点点差别,比如:

你的程序:

AT+CMGS=26
0891683108100005F011000D91683108108300F00000000CC8329BFD06DDDF72363904

标准程序:
AT+CMGS=26
0891683108100005F011000D91683108108300F00000FF0CC8329BFD06DDDF72363904

i7456 发表于 2013-11-1 14:44:45

shenhaiyu 发表于 2013-11-1 13:05 static/image/common/back.gif
Cool!!!!这回转换的看起来正确多了,但是和别的工具还有一点点差别,比如:

你的程序:


// 处理短信内容
msgPDU += "000000";                         // “00” 协议标识(TP-PID)是普通GSM类型,点对点方式; “00”用户信息编码方式(TP-DCS) 7-bit编码; “00”有效期(TP-VP)固定字符而已

shenhaiyu 发表于 2013-11-1 17:29:27

i7456 发表于 2013-11-1 14:44 static/image/common/back.gif
固定字符而已

soga~~~~~~~~~~~~~ok,非常感谢。
程序要是也支持 8bit等等编码就完美了

i7456 发表于 2013-11-1 20:01:45

shenhaiyu 发表于 2013-11-1 17:29 static/image/common/back.gif
soga~~~~~~~~~~~~~ok,非常感谢。
程序要是也支持 8bit等等编码就完美了

有需要就自己写吧。

kevinzhang 发表于 2013-11-21 14:18:52

最近正在测试中文短信发送,谢谢宝贵经验。:)

shenhaiyu 发表于 2013-11-23 20:57:32

kevinzhang 发表于 2013-11-21 14:18 static/image/common/back.gif
最近正在测试中文短信发送,谢谢宝贵经验。

:)成功的话回来交流交流啊

kevinzhang 发表于 2013-11-23 21:00:49

已想前推进一步。英文短信可以发送了。不知道为哈Serial和SoftwareSerial不能同时出现?



kevinzhang 发表于 2013-11-23 21:02:17

本帖最后由 kevinzhang 于 2013-11-23 21:10 编辑

八锅借用大神代码发送pdu模式短信,木有啥反应,好像没有发送。:( 跪求大神再搭救一哈啦子。{:soso_e183:}


==

#include<SoftwareSerial.h>

SoftwareSerial mySerial(2,3);
String phoneNumber = "+86138177XXXXX";               // 接收方号码
String messageCenterNumber = "+8613800210500"; // 短信中心号码
String message_text = "PDU mode test.";                  // 短信内容

void setup()
{
mySerial.begin(19200);
SevenBitPduSms(messageCenterNumber, phoneNumber, message_text);
}

void loop()
{
}

// 函数作用:AT指令发送7-bit编码的PDU短信。SMSCNumber:短信中心号码;
// ReceiverNumber:接收方号码;message:短信内容
void SevenBitPduSms(String SMSCNumber, String ReceiverNumber, String message)
{
String PDUSMSCNumber;   // 经过处理的短信服务中心号码
String _SMSCNumber;   // 中间变量,处理短信服务中心号码时使用
String msgPDU;          // 经过处理的接收方号码和短信内容
String _ReceiverNumber; // 中间变量,处理接收方号码时使用

// 处理短息服务中心号码
_SMSCNumber = SMSCNumber;
if(_SMSCNumber.charAt(0) == '+')                            // 如果首位是‘+’,除掉它
    _SMSCNumber = _SMSCNumber.substring(1,_SMSCNumber.length());
if(_SMSCNumber.length()%2 == 1)                           // 如果号码的长度是奇数,在后面加上一个‘F’
    _SMSCNumber += "F";
PDUSMSCNumber = Dec2Hex_String(_SMSCNumber.length()/2 + 1);
// 短信服务中心号码的长度,包括后面的“91”,两位、十六进制
PDUSMSCNumber += String(91);                              // SMSC 地址类型,“91” 国际格式
for(int i = 0; i < _SMSCNumber.length()/2; i++)
{         // 短信中心号码,十进制数值,将奇偶位互换
    PDUSMSCNumber += _SMSCNumber.charAt(i*2+1);
    PDUSMSCNumber += _SMSCNumber.charAt(i*2);
}

//处理接收方号码
_ReceiverNumber = ReceiverNumber;
if(_ReceiverNumber.charAt(0) == '+')                        // 如果首位是‘+’,除掉它
   _ReceiverNumber = _ReceiverNumber.substring(1,_ReceiverNumber.length());
msgPDU = "1100";                                          // “11” TP_MTI/VFP; “00” TP-MR
msgPDU += Dec2Hex_String(_ReceiverNumber.length());         
// 接收方号码的长度,不包括后面的“91”和“F”,两位、十六进制
msgPDU +="91";                                              // SMSC 地址类型,“91” 国际格式
if(_ReceiverNumber.length()%2 == 1)
    _ReceiverNumber += 'F'; // 如果号码的长度是奇数,在后面加上一个‘F’
for(int i = 0; i < _ReceiverNumber.length() / 2; i++)
{   // 接收方号码,十进制数值,将奇偶位互换
    msgPDU += _ReceiverNumber.charAt(i*2+1);
    msgPDU += _ReceiverNumber.charAt(i*2);
}

// 处理短信内容
msgPDU += "000000";                        
// “00” 协议标识(TP-PID)是普通GSM类型,点对点方式;
// “00”用户信息编码方式(TP-DCS) 7-bit编码; “00”有效期(TP-VP)
msgPDU += Dec2Hex_String(message.length()); // 所发送的信息的长度,两位、十六进制
msgPDU += gsmEncode7bit(message);         // 所发送的信息,7位编码

// 发送短信
mySerial.print("AT+CMGS=");            // 发送AT指令“AT+CMGS=”
mySerial.println(msgPDU.length() / 2); // 经过处理接收方号码和信息内容的长度,十进制,字节数
delay(50);                           // 延时 50ms
mySerial.print(PDUSMSCNumber);         // 发送经过处理的短信服务中心号码
mySerial.print(msgPDU);                // 发送经过处理的接收方号码和短信内容
mySerial.println(char(26));            // 结束标志 Ctrl^Z,ASCII码值为 26
}

// 将2位的十进制数转换为十六进制,字符串格式
String Dec2Hex_String(int number_2bit)
{
String number;
if(number_2bit < 16)
    number = "0";
number += String(number_2bit, HEX);
number.toUpperCase();
return number;
}

// 7-bit编码
String gsmEncode7bit(String pSrc)
{
int nSrc = 0;                   // 源字符串的计数值
String pDst ;                   // 转换完的结果
String nStr ;                   // 中间变量,将源字符串的每8位作为一组
int nSrcLength = pSrc.length(); // 源字符串的长度

for(int byteSrc = 0; byteSrc <= nSrcLength/8; byteSrc++)
{ // 将源字符串的每8位作为一组
    nStr = pSrc.substring(byteSrc*8,(byteSrc+1)*8);
    for(int index = 0; index < 7; index ++)
    {
      int nChar;
      nChar = (nStr.charAt(index) >> index) | ((nStr.charAt(index + 1) & (0xFF >> (7 - index))) << (7 - index));
      // 将8位编码转换为7位编码
      pDst += Dec2Hex_String(nChar); // 将2位的十进制数转换为十六进制,字符串格式
      nSrc ++;                     // 已经转换完的源字符数,如果已经转换完,退出程序
      if(nSrc >= nSrcLength-1) break;
    }
}
return pDst;
}

kevinzhang 发表于 2013-11-23 21:41:09

本帖最后由 kevinzhang 于 2013-11-23 22:02 编辑

加上这个,可以发送了。不过,中文不行。好像中文的7-bit编码不对啊。求大神指导unicode。

i7456 发表于 2013-11-24 10:06:05

kevinzhang 发表于 2013-11-23 21:41 static/image/common/back.gif
加上这个,可以发送了。不过,中文不行。好像中文的7-bit编码不对啊。求大神指导unicode。

中文你发送的是什么内容?

kevinzhang 发表于 2013-11-24 10:27:33

{:soso_e100:}

kevinzhang 发表于 2013-11-24 10:28:02

i7456 发表于 2013-11-24 10:06 static/image/common/back.gif
中文你发送的是什么内容?

在message_text里改成中文的内容。

页: 1 [2] 3 4 5
查看完整版本: 通过串口收发短消息(PDU方式的具体实现)