用两条AT指令发中文短信

设置为PDU模式
AT+CMGF=0或1回车 //设置短信编码方式  0为PDU模式 1为TEXT模式 TEXT模式只支持字母或数字,要发中文短信,只能用PDU模式 C表达如下:
"AT+CMGF=0/r/n"

发送短信
"AT+CMGS="

pdu的编码格式
08 //短消息中心长度
91 //短消息中心有国家编码 没有为81
68 31 08 02 00 05 f0 //短消息中心
31 //需要状态报告//不需为11
00 //永远为00 //分割符
0D //目标号码的长度14位
91 //有国家编码//没有为81
68 31 36 32 64 49 F0 //目标号码 +8613632346940
00 //TP-PID.协议标识,一般为00 是普通 GSM  类型,点到点方式
08 //是否免提//是为18
A7 //有效期标志
04 //正文4字节
4F 60 59 7D //你好 短消息内容

若没有短消息中心,编码为:
00 //表示默认短消息中心
31 //需要状态报告//不需为11
00 //永远为00 //分割符
0D //目标号码的长度14位
91 //有国家编码//没有为81
68 31 36 32 64 49 F0 //目标号码 +8613632346940
00  //TP-PID.协议标识, 是普通 GSM  类型,点到点方式
08 //是否免提//是为18
A7 //有效期标志
04 //正文4字节
4F 60 59 7D //你好 短消息内容

以上是有位兄台博客上写的,简单说,短信的PDU编码包格式如下
短信中心号码 机器配置标志 目标电话号码 机器配置标志 短信内容

短信中心号码:
      短信中心号码长度:(连后面的91有没发送国家编码标示符一起算 字符总数除以2 的十六进制数的 ASCII码值)
      是否发送国家编码标示符(91为有发送 则电话号码前加86,81没有发送)
      短信中心号码:福州联通的为13010380500(各个地区不一样)如果前面的是否发送国家编码 标志
           为91则 号码前应加86(中国的国际编码) 即8613010380500  如果号码的字符个数为奇数则号码最后要补个 F 来凑成偶数 即8613010380500F 最后把字符奇偶位对调 短信中心号码就变成这样 683110300805F0
   是不是快晕了??幸运的是一般来说SIM卡出厂时会预先存好短信中心号码 用指令 AT+CSCA?回车 来获取短信中心号码看看就 知道了 如果看到返回如下 +CSCA: "+8613010380500",145 则已经存在  如果没有,也可以用指令 AT+CSCA="+8613010380500"回车 来设置短信中心号码  现在就可以用 00 代替上面那么麻烦的一串。
机器配置标志:3100 或 1100
目标电话号码:
     目标电话号码长度:目标电话号码(不包含 91哦!)的字符数 的十六进制数的ASCII码值
     是否发送国家编码标示符:91
     目标电话号码:打包方式和上面短信中心一样
   比如我我的电话13860619634 打包好就成了 0D91683168609163F4  目标电话号码是不能省的,当然如果你要发给自己的话,也可以用 00 代替上面这么麻烦的一串,呵呵。
机器配置标示:000800
短信内容:
     短信长度:短信内容的UNICODE编码(Big-Endian的哦)十六进制数 的ASCII字符长度 除以2(即短信字数乘于2 也就是短信占用的字节数 UNICODE编码一个字符占两个字节) 的十六进制数 的ASCII码值
     短信内容:你要说的话的UNICODE编码十六进制数 的ASCII字符  比如 我想你 621160F34F60

发送一条短信的过程大致如下:
AT指令  短信字节数   换行符 /r   短信的PDU编码包   十六进制数0x1A(就是Ctrl+Z的码值)
具体说 发送过程是这样的:
1.发AT指令 AT+CMGS= 的字符串(即ASCII码值)
2.发短信PDU编码包的长度(PDU编码包 除短信中心外 的字符个数除以2) 的BCD码 的ASCII码值
3.发'/r'
4.发上面打包好的短信PDU编码包
5.发0x1A
现在你可以试试了,接好手机打开串口调试助手选好串口 然后发送下面的
AT+CMGF=0
AT+CMGS=21
0011000D91683168609136F400080006621160F34F60
发给我,内容 我想你
啊!我会那么的受宠若惊。。。

下面是短信发送的C程序
//打包目标电话号码
void GSM_PackPhone(uchar *str)
{
 uchar count=0,i=0,j=0,tmp;

strcpy_f(gsm.set,Gsm_Phpre);
 if(*str=='1')//手机号码前加“86”
  {
   gsm.phone[0]='8';
   gsm.phone[1]='6';
   count=2;
  }
 while(*str)
 {
  gsm.phone[count]=*str++;
  count++;
 }

gsm.phonelen[0]=pgm_read_byte(ASC_NUM+(count>>4));//电话号码长度的ASC码值
 gsm.phonelen[1]=pgm_read_byte(ASC_NUM+(count&0x0F));

if(count%2)//个数为奇 补一个'F'
  gsm.phone[count]='F';
 for(i=0;i<count;i+=2)//奇偶位对调
 {
  tmp=gsm.phone[i];
  gsm.phone[i]=gsm.phone[i+1];
  gsm.phone[i+1]=tmp;
 }
 gsm.phone[count+1]=0;
}
void GSM_PackMess(uchar *mess)
{

//因为项目是做短信报警,内容相对固定,所以短信内容已经转换打包好做为常数变量

}
//设置为PDU模式
void GSM_SetPDUmode(void)
{
 uchar atcmd[]={"AT+CMGF=0/r/n"};
 U1_TxOpen(0);
 U1_SendStr(atcmd);
}
//判断是否返回OK
uchar GSM_IsOK(void)
{
 uchar i=0;
 while(U1_Buf[i])
 {
  if(U1_Buf[i]=='O'&&U1_Buf[i+1]=='K')
  {
   cldata(U1_Buf,sizeof(U1_Buf));
   return OK;
  }
  i++;
  if(i>sizeof(U1_Buf))
   break;
 }
 return ERROR;
}

//发信息
void GSM_SendMess(uchar *phone,uchar *mess)
{
 uchar strl;
 uchar atcmd[]={"AT+CMGS="};
 uchar mspre[]={"000800"};
 uchar *str="AT+CMGS=15";
 GSM_PackPhone(phone);
 strl=(strlen(gsm.set)+strlen_f(Gsm_Mspre)+strlen(mess)-2);
// strl=(strlen(gsm.set)+strlen_f(Gsm_Mspre)+strlen_f(mess)-2);//除短信中心外的短信长度 16进制数
 strl /=2;
 strl=tobcd(strl);//转换为bcd码10进制数
 gsm.messlen[0]=pgm_read_byte(ASC_NUM+(strl>>4));
 gsm.messlen[1]=pgm_read_byte(ASC_NUM+(strl&0x0F));
 U1_TxOpen(0);
 U1_SendStr(atcmd);//发CMGS 指令
 U1_SendData_C(gsm.messlen,sizeof(gsm.messlen));//发 短信总长度
 U1_SendByte('/r');//发0x0D
 U1_SendStr(gsm.set);//发短信中心及目标电话号码
 U1_SendStr(mspre);//发信息前缀
 U1_SendStr(mess);//发短信内容
 U1_SendByte(0x1A);//发Ctrl+Z

GsmState.GSM_SED=1;//短信已经发送
}

gsm模块发中文短信相关推荐

  1. Wavecom gsm 模块发送中文短信

    Wavecom gsm 模块发送中文短信 这今天被wavecom 模块发送中文短信的事搞的头大,不过最后还是成功了. 说一说整个事的过程吧! 首先说一下这个事情的背景: 我们公司有条产品线是嵌入式计算 ...

  2. 基于STM32与GSM模块发送中英文短信

    基于STM32与GSM模块发送中英文短信 最近在做毕业设计有用到GSM模块进行短信报警,模块的功能比较多这里就不介绍了,一般的拨打电话都很简单就只需要一条指令即可,发送英文短信也很简单也只要几条命令也 ...

  3. GSM PDU模式发中文短信

    http://blog.csdn.net/dlutxie/article/details/7848623 GSM PDU模式发中文短信 网上的资料也有很多,但参考了这么多天才最终搞定,所以还是把自己的 ...

  4. python GSM模块-电脑接收短信

    文章目录 一.GSM模块: 1. 产品介绍 2.前言:最近做了一个需求,需要接收手机短信验证码.因此我这里考虑到了 GSM 模块 一.GSM模块: 1. 产品介绍 ① 一种具有独立的操作系统的功能模块 ...

  5. RPA解决:python GSM 模块 - 电脑接收短信

    学Python,用RPA 艺赛旗RPA2020.1版本 正在免费下载使用中,欢迎下载使用 www.i-search.com.cn/index.html?from=line1 前言: 最近做了一个需求, ...

  6. STM32使用GSM模块发送中英文短信(TEXT模式到PDU模式的转换)

    STM32使用GSM模块发送中英文短信(TEXT模式到PDU模式的转换) 目的是按下按键,短信发送 PDU转换网站 链接: PDU转换网站. 使用硬件: ··· 开发板:正点原子战舰V3 GSM模块: ...

  7. 51单片机控制SMI800Cgsm模块发送中文短信

    使用AT89C51单片机控制SMI800Cgsm模块发送中文短信.使用STM32发送短信敬请等待... #include "config.h" #include "str ...

  8. Iphone5 语言设置成英文后如何发中文短信

    老革命遇到新问题: 由于工作环境关系, 我的手机语言一直设置成英文. 之前用过的iphone和其他手机,在需要发送短信时可以直接选择所要输入的语言. 看似很平常的要求,在Iphone5上却遇到了新情况 ...

  9. 通过STC15F2K60S2控制SIM900A发中英文短信,打电话

    本文通过串口通信,使用STC15系列单片机实现发短信打电话功能. 一. 注意事项 1. 首先要确定手机卡已经注册到网络,具备打电话发短信功能 2. 正确的硬件连接: P3.0-----STXD或者5V ...

最新文章

  1. 5分钟图解Hbase列式存储
  2. 【已解决】图灵机模型(模拟二进制非负整数加1)
  3. android m权限工具类,android M权限适配,简单工具类
  4. @Test 运行 Method xxx should be void、Method xxx should have no parameters
  5. 论文浅尝 \ 联合知识图谱实例和本体概念的通用表示学习
  6. linux文件移出目录命令_linux命令大全_文件目录操作命令
  7. 彻底火了!这份Python学习贴,90%程序员用的上!
  8. [Ogre][地形][原创]基于OgreTerrain的地形实现
  9. Kali Linux 暴力破解学校办公室WiFi 总结
  10. python课程的中期报告范文_毕业论文中期报告范文(毕业论文中期检查范文8篇)...
  11. Dzzoffice 部署
  12. SELECT command denied to user ‘‘@‘%‘ for column ‘c_code‘ in table ‘sys_data_dictionary‘
  13. 证券业数据大集中及其风险控制分析
  14. 前端面试题之计算机网络篇
  15. android studio的旅游APP的开发和设计
  16. VUE 爬坑之旅 -- vue 项目中将简体转换为繁体
  17. 给定三角形三边,如何判断该三角形的形状
  18. 软工1816 · 作业(九)团队现场编程实战
  19. 1090 Highest Price in Supply Chain
  20. 《百面机器学习》试读 | AI热门应用之游戏中的人工智能

热门文章

  1. MySQL中的哥哥表、妹妹字段,是什么鬼?
  2. 四川途志传媒:抖音直播带货靠谱吗?
  3. 计算机考研400分以上,考研400分无缘复试,有人321分却捡漏985大学,选择比努力更重要...
  4. 万维网的信息检索系统【计算机网络】
  5. 【MySQL】TIMESTAMPDIFF函数
  6. 微信小程序 IOS中new Date()时间格式不兼容问题
  7. Ubuntu 通过无线 连PPPOE的 上网
  8. Discuz! X3.2 二次开发基本流程
  9. FFMPEG在Windows下使用Movie滤镜读取文件失败问题
  10. html更改textbox的id,NET开发-WebForm中TextBox控件ID、Text、TextModel等属性的使用