极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: shenhaiyu

通过串口收发短消息(PDU方式的具体实现)

[复制链接]
发表于 2013-10-29 14:05:51 | 显示全部楼层
shenhaiyu 发表于 2013-10-29 12:11
我用的就是Mega,测试编译用不着板子的,现在的问题是编译通不过,那个char换成String不行,这个我帮你测 ...

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-29 16:03:25 | 显示全部楼层
i7456 发表于 2013-10-29 14:05

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

使用道具 举报

发表于 2013-10-31 14:41:26 | 显示全部楼层
shenhaiyu 发表于 2013-10-29 16:03
我知道低版本的可以编译通过,但是高版本呢,我很多库都是高版本的,不能为了这一个重写全部的库吧~~
  1. // 将2位的十进制数转换为十六进制,字符串格式
  2. String Dec2Hex_String(int number_2bit) {

  3.   String number;

  4.   if(number_2bit < 16)
  5.     number = "0";   

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

  8.   return number;
  9. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-1 13:05:11 | 显示全部楼层
i7456 发表于 2013-10-31 14:41


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

你的程序:

AT+CMGS=26
0891683108100005F011000D91683108108300F00000000CC8329BFD06DDDF72363904

标准程序:
AT+CMGS=26
0891683108100005F011000D91683108108300F00000FF0CC8329BFD06DDDF72363904
回复 支持 反对

使用道具 举报

发表于 2013-11-1 14:44:45 | 显示全部楼层
shenhaiyu 发表于 2013-11-1 13:05
Cool!!!!这回转换的看起来正确多了,但是和别的工具还有一点点差别,比如:

你的程序:
  1. // 处理短信内容
  2.   msgPDU += "000000";                         // “00” 协议标识(TP-PID)是普通GSM类型,点对点方式; “00”用户信息编码方式(TP-DCS) 7-bit编码; “00”有效期(TP-VP)
复制代码
固定字符而已
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-1 17:29:27 | 显示全部楼层
i7456 发表于 2013-11-1 14:44
固定字符而已

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

使用道具 举报

发表于 2013-11-1 20:01:45 | 显示全部楼层
shenhaiyu 发表于 2013-11-1 17:29
soga~~~~~~~~~~~~~ok,非常感谢。
程序要是也支持 8bit等等编码就完美了

有需要就自己写吧。
回复 支持 反对

使用道具 举报

发表于 2013-11-21 14:18:52 | 显示全部楼层
最近正在测试中文短信发送,谢谢宝贵经验。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-23 20:57:32 | 显示全部楼层
kevinzhang 发表于 2013-11-21 14:18
最近正在测试中文短信发送,谢谢宝贵经验。

成功的话回来交流交流啊
回复 支持 反对

使用道具 举报

发表于 2013-11-23 21:00:49 | 显示全部楼层
已想前推进一步。英文短信可以发送了。不知道为哈Serial和SoftwareSerial不能同时出现?



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 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 = "DU 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;
}
回复 支持 反对

使用道具 举报

发表于 2013-11-23 21:41:09 | 显示全部楼层
本帖最后由 kevinzhang 于 2013-11-23 22:02 编辑

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2013-11-24 10:06:05 | 显示全部楼层
kevinzhang 发表于 2013-11-23 21:41
加上这个,可以发送了。不过,中文不行。好像中文的7-bit编码不对啊。求大神指导unicode。

中文你发送的是什么内容?
回复 支持 反对

使用道具 举报

发表于 2013-11-24 10:27:33 | 显示全部楼层
{:soso_e100:}
回复 支持 反对

使用道具 举报

发表于 2013-11-24 10:28:02 | 显示全部楼层
i7456 发表于 2013-11-24 10:06
中文你发送的是什么内容?


在message_text里改成中文的内容。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-28 23:46 , Processed in 0.059760 second(s), 17 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表