SIM900A模块使用笔记

更新2018-12-8

正常工作状态:

接线方法:

首先将 AT 写入字符串输入框,然后点击 发送。因为模块波特率默认是 9600,所以两条指令的显示都是没有问题的;如果将软件的波特率设置为其他,第一条 AT 指令会返回乱码,第二条指令才会显示正确。发送 AT 这条指令,SIM900A 模块返回 OK,说明此条指令执行正确,同时说明:电脑和模块通信正常。

发送 AT+CSQ 查询信号强度指令。模块返回如下图所示,其中 19 为信号强度值,此值在 0—31 之间,越大代表信号越强。0 代表无信号,一般此数要达到 10 以上,模块才能正确执行发短信等功能。

SIM状态:

发送 AT+CPIN?查询模块是否检测到手机卡指令。指令返回如下图。READY 说明模块检测到了手机卡。如果返回 ERROR,说明模块没有检测到手机卡,请检查手机卡是否为 2G 卡,并且非电信卡。

网络状态:

发送 AT+COPS?指令,查询模块是否注册到网络。模块返回如下图所示。CHINA MOBILE 代表中国移动,因为我用的移动 2G 卡。说明模块已经注册到中国移动网络。

当模块注册到网络后,我们才可以操作模块执行发短信等功能。 在用单片机控制模块时 , 推荐首先要检测模块是否注册到网络 , 如果没注册到 , 要等待一段时间 , 直至注册到网络。

生产厂商

设备类型

GPRS状态:

关闭移动场景。发送:AT+CIPSHUT,则可以关闭移动场景,关闭场景

后连接状态为:IPINITIAL,可以通过发送:AT+CIPSTATUS,查询。

是否注册到网络

AT+SAPBR=3,1,"CONTYPE","GPRS"

出错可能之前已经打开HTTP,需要关掉执行AT+HTTPTERM

承载操作

查询承载:

AT+SAPBR=4,1

设置参数:

AT+SAPBR=3,1,"CONTYPE","GPRS"//设置承载参数:已经连接,因特网连接类型,GPRS连接 AT+SAPBR=3,1,"APN","CMNET"//设置承载参数:接入点名称为中国移动 AT+SAPBR=1,1//请求承载,失败时证明已经打开

保存参数:

AT+SAPBR=5,1

关闭承载:

AT+SAPBR=0,1//失败时证明已经关闭

承载操作演示:

AT+SAPBR=4,1

+SAPBR:

CONTYPE: GPRS

APN: CMNET

PHONENUM:

USER:

PWD:

RATE: 2

OK

AT+SAPBR=3,1,"CONTYPE","GPRS"

OK

AT+SAPBR=3,1,"APN","CMNET"

OK

AT+SAPBR=1,1

OK

HTTP操作

必要条件:SIM900A模块的D5常亮,D6慢闪。(SIM900A模块已插入SIM卡且搜索到网络)

操作步骤

1.打开承载(详见承载操作)

2.HTTP初始化

AT+HTTPINIT//初始化HTTP,失败则已打开

3.设置HTTP参数

查询参数:

AT+HTTPPARA?

设置http参数:

AT+HTTPPARA="URL","http://119.29.132.199" //设置URL AT+HTTPPARA="CONTENT","application/x-www-form-urlencoded" //设置数据格式

保存参数:AT+HTTPSCONT(待验证)

4.获取数据

设置缓冲区大小:

AT+HTTPDATA=8,10000 //字节数,获取时间ms

HTTP访问

AT+HTTPACTION=1 //0表示get,1表示post,2表示head

读取内容

AT+HTTPREAD

5.关闭HTTP服务

AT+HTTPTERM//失败时则已关闭

6.关闭承载 AT+SAPBR=0,1

HTTP操作演示:

浏览器访问结果:

PC端串口调试SIM900A模块访问结果:

AT+HTTPINIT

OK

AT+HTTPPARA?

+HTTPPARA:

CID: 1

URL:

UA: SIMCOM_MODULE

PROIP: 0.0.0.0

PROPORT: 0

REDIR: 0

BREAK: 0

BREAKEND: 0

OK

AT+HTTPPARA="URL","http://119.29.132.199"

OK

AT+HTTPPARA="CONTENT","application/x-www-form-urlencoded"

OK

AT+HTTPDATA=8,10000

DOWNLOAD

ERROR

AT+HTTPACTION=1

OK

+HTTPACTION:1,200,36

AT+HTTPREAD

+HTTPREAD:36

hi word!

OK

遇到的问题:

1.D5常亮,D6间歇性快闪:5V供电电压不足。

2.指令无回复,USB-TTL通信问题,换一个;必须共地

3.HTTPget访问返回601,原因未打开承载。

其他资料:

//下面的测试指令是可选的,用于确定当前是否可以连接 AT+CSQ AT+CREG? AT+CGATT? //下面的配置指令是必须的 AT+SAPBR=3,1,"CONTYPE","GPRS" AT+SAPBR=3,1,"APN","CMNET" AT+SAPBR=1,1 //操作HTTP AT+HTTPINIT //初始化Http AT+HTTPPARA="URL","http://IP:port/Phase/station/test" //设置URL AT+HTTPPARA="CONTENT","application/x-www-form-urlencoded" //设置数据格式 AT+HTTPPARA? //查看配置 //缓冲区的长度计算 AT+HTTPDATA=0,10000 AT+HTTPDATA=8,10000 //这里的8是总的数据长度,根据需要进行变更 //如果需要http头部的话,需要计入总长度 POST Phase/station/test HTTP/1.1 Host: 120.26.55.29 Accept: / Authorization: Basic c2VhbnByaWRkeTpvOWk4dTd5RVQk Content-Type: application/x-www-form-urlencoded;charset=utf-8 data=132 AT+HTTPACTION=1 //0表示get,1表示post,2表示head //读结果和关闭连接是可选的 AT+HTTPREAD //读取内容 AT_HTTPTERM //终止HTTP服务 AT+SAPBR=0,1: //最后别忘记关闭承载

参考链接:

https://www.cnblogs.com/makexu/articles/6502194.html

下面是C语言实现51单片机和sim900A模块全双工异步通信,主要完成模块的初始化以及网络检测等操作,通过led的指示灯可以观察现象

  1. /************************************************************
  2. 程序说明:
  3. 本程序运行后如果gprs模块找到服务商信号可实现接打电话发送短信等功能
  4. *************************************************************/
  5. #include <REG51.H>
  6. #include <string.H>
  7. #define uchar unsigned char
  8. #define uint unsigned int
  9. //以下是板子上LED的配置,把Px_x改成自己对应的脚。
  10. sbit P20=P2^0;
  11. sbit P21=P2^1;
  12. sbit P22=P2^2;
  13. sbit P23=P2^3;
  14. sbit P24=P2^4;
  15. sbit P25=P2^5;
  16. //以下是你的51单片机的晶振大小
  17. //#define FOSC_110592M
  18. #define FOSC_12M
  19. //以下是开机后拨打的手机号,改成自己想要大的号码即可。
  20. uchar num[] = "ATD10086;\r\n";
  21. //以下是GSM模块返回数据
  22. uchar rec_data[50];
  23. uchar rec_num;
  24. //注意,无论接收到信号还是发送完信号,都会进中断服务程序的
  25. /*初始化程序(必须使用,否则无法收发),次程序将会使用定时器1*/
  26. void SerialInti() //初始化程序(必须使用,否则无法收发)
  27. {
  28. TMOD=0x20; //定时器1操作模式2:8位自动重载定时器
  29. #ifdef FOSC_12M //在这里根据晶振大小设置不同的数值初始化串口
  30. TH1=0xf3; //装入初值,波特率2400
  31. TL1=0xf3;
  32. #else
  33. TH1=0xfd; //装入初值,波特率9600
  34. TL1=0xfd;
  35. #endif //end of SOC_12M
  36. TR1=1; //开定时器
  37. SM0=0; //设置串行通讯工作模式,(10为一部发送,波特率可变,由定时器1的溢出率控制)
  38. SM1=1; //(同上)在此模式下,定时器溢出一次就发送一个位的数据
  39. PCON=0x80; //波特率加倍,波特率4800,波特率误差 0.16% ?????不能位寻址???
  40. REN=1; //串行接收允许位(要先设置sm0sm1再开串行允许)
  41. EA=1; //开总中断
  42. ES=1; //开串行口中断
  43. }
  44. /*串行通讯中断,收发完成将进入该中断*///如:+CMTI:"SM",2
  45. void Serial_interrupt() interrupt 4
  46. {
  47. uchar temp;
  48. temp=SBUF;
  49. rec_data[rec_num++]=temp;
  50. if(rec_num>=50) rec_num=0;
  51. else ;
  52. RI=0; //接收中断信号清零,表示将继续接收
  53. }
  54. //串行口连续发送char型数组,遇到终止号/0将停止
  55. void Uart1Sends(uchar *str)
  56. {
  57. while(*str!='\0')
  58. {
  59. P20=~P20;
  60. SBUF=*str;
  61. while(!TI);//TI=0,原地等待;等待发送完成信号(TI=1)出现
  62. TI=0;
  63. str++;
  64. }
  65. }
  66. /*
  67. void Uart1BYTE(uchar temp)
  68. {
  69. SBUF=temp;
  70. while(!TI);//等待发送完成信号(TI=1)出现
  71. TI=0;
  72. }
  73. */
  74. uchar hand(uchar *ptr)
  75. {
  76. if(strstr(rec_data,ptr)!=NULL) return 1;
  77. else return 0;
  78. }
  79. void clear_rec_data()
  80. {
  81. uint i;
  82. for(i=0;i<strlen(rec_data);i++)
  83. {
  84. rec_data[i]='0';
  85. }
  86. rec_num=0;
  87. }
  88. //延时函数大概是1s钟,不过延时大的话不准...
  89. void DelaySec(int sec)
  90. {
  91. uint i , j= 0;
  92. for(i=0; i<sec; i++)
  93. {
  94. for(j=0; j<40000; j++)
  95. {
  96. }
  97. }
  98. }
  99. void main()
  100. {
  101. uint i = 0;
  102. SerialInti();
  103. P20=0;
  104. DelaySec(1);//延时
  105. P20=1;
  106. DelaySec(1);//延时
  107. P20=0;
  108. DelaySec(1);//延时
  109. P20=1;
  110. //Uart1Sends(num);
  111. //建议在单片机控制GSM模块前,加上两条 AT 指令,用来同步模块与单片机的波特率
  112. Uart1Sends("ATI\r\n"); //握手
  113. while(!hand("OK"))
  114. {
  115. clear_rec_data();
  116. i++;
  117. Uart1Sends("ATI\r\n");//
  118. DelaySec(1);//延时
  119. if(i>=5)
  120. {
  121. break;
  122. //return;
  123. }
  124. else ;
  125. }
  126. P20=0;//同步波特率完成指示灯
  127. P21=0;
  128. DelaySec(1);//延时
  129. P21=1;
  130. DelaySec(1);//延时
  131. P21=0;
  132. DelaySec(1);//延时
  133. P21=1;
  134. clear_rec_data();//删除存储的GSM模块返回的数据,以便于以后继续判断
  135. DelaySec(1);//延时
  136. Uart1Sends("AT+CSQ\r\n");//信号质量
  137. DelaySec(1);//延时
  138. i=0;
  139. while(!hand("OK")) //检测此条指令GSM模块是否执行OK
  140. {
  141. clear_rec_data();
  142. i++;
  143. Uart1Sends("AT+CSQ\r\n");//
  144. DelaySec(1);//延时
  145. if(i>=5)
  146. {
  147. break;
  148. //return;
  149. }
  150. else
  151. ;
  152. }
  153. P21=0;//GSM模块检测完成指示灯
  154. P22=0;
  155. DelaySec(1);//延时
  156. P22=1;
  157. DelaySec(1);//延时
  158. P22=0;
  159. DelaySec(1);//延时
  160. P22=1;
  161. clear_rec_data();
  162. DelaySec(1);//延时
  163. Uart1Sends("AT+CPIN?\r\n");//查看是否读到手机卡
  164. DelaySec(1);//延时
  165. i=0;
  166. while(!hand("READY")) //检测SIM模块是否收到SIM卡READY
  167. {
  168. clear_rec_data();
  169. i++;
  170. Uart1Sends("AT+CPIN?\r\n");//是否注册到网络
  171. DelaySec(1);//延时
  172. if(i>=5)
  173. {
  174. break;
  175. //return;
  176. }
  177. else
  178. ;
  179. }
  180. P22=0;//手机卡检测完成指示灯
  181. P24=0;
  182. DelaySec(1);//延时
  183. P24=1;
  184. DelaySec(1);//延时
  185. P24=0;
  186. DelaySec(1);//延时
  187. P24=1;
  188. Uart1Sends("AT+COPS?\r\n");//是否注册到网络
  189. DelaySec(1);//延时
  190. i=0;
  191. while(!hand("CHINA")) //检测是否收到模块返回的CHINA
  192. {
  193. clear_rec_data();
  194. i++;
  195. Uart1Sends("AT+COPS?\r\n");//是否注册到网络
  196. DelaySec(1);//延时
  197. if(i>=5)
  198. {
  199. break;
  200. //return;
  201. }
  202. else
  203. ;
  204. }
  205. P24=0;//网络状态检测完成
  206. clear_rec_data();
  207. DelaySec(1);//延时
  208. /*
  209. //以下是发送英文短信短信
  210. Uart1Sends("AT+CMMI=2,1\r\n"); //开回显
  211. DelaySec(1);//延时
  212. Uart1Sends("AT+CMGF=1\r\n"); //方式1
  213. DelaySec(1);//延时
  214. Uart1Sends("AT+CMGS=\"10086\"\r\n"); //此处修改短信接收方电话号
  215. DelaySec(1);//延时
  216. Uart1Sends("ye"); //此处修改短信内容
  217. DelaySec(1);//延时
  218. Uart1BYTE(0X1A);
  219. DelaySec(1);//延时
  220. DelaySec(1);//延时
  221. DelaySec(1);//延时
  222. DelaySec(1);//延时
  223. P14=0;
  224. //发送英文短信结束
  225. Uart1Sends("AT+CMGD=1\r\n");//删除SIM卡中的内容
  226. DelaySec(1);//延时
  227. //以下是拨打10086代码
  228. Uart1Sends(num); //拨打10086
  229. DelaySec(1);//延时
  230. DelaySec(1);//延时
  231. DelaySec(1);//延时
  232. DelaySec(1);//延时
  233. //拨打电话代码结束
  234. //以下内容没有实际测试,仅供参考
  235. */
  236. while(1)
  237. {
  238. P25= ~P25;
  239. DelaySec(1);
  240. /*
  241. if(hand("CMTI"))
  242. {
  243. P13=0;
  244. clear_rec_data();
  245. DelaySec(1);//延时
  246. Uart1Sends("AT+CMGR=1\r\n");//
  247. DelaySec(1);//延时
  248. i=0;
  249. while(!hand("OK"))
  250. {
  251. clear_rec_data();
  252. i++;
  253. Uart1Sends("AT+CMGR=1\r\n");//
  254. DelaySec(1);//延时
  255. if(i>=2) //chucuo
  256. {
  257. break;
  258. //return;
  259. }
  260. else
  261. ;
  262. }
  263. clear_rec_data();
  264. DelaySec(1);//延时
  265. if(hand("relay on"))
  266. {
  267. P14=0;
  268. //break;
  269. }
  270. else if(hand("relay off"))
  271. {
  272. P15=0;
  273. //break;
  274. }
  275. else
  276. {
  277. //break;
  278. }
  279. Uart1Sends("AT+CMGD=1\r\n");//
  280. DelaySec(1);//延时
  281. }
  282. else if(hand("ring")) //电话进来 挂断电话
  283. {
  284. Uart1Sends("ATH\r\n");//
  285. DelaySec(1);//延时
  286. i=0;
  287. while(!hand("OK"))
  288. {
  289. clear_rec_data();
  290. i++;
  291. Uart1Sends("ATH\r\n");//
  292. DelaySec(1);//延时
  293. if(i>=2)
  294. {
  295. break;
  296. //return;
  297. }
  298. else
  299. ;
  300. }
  301. clear_rec_data();
  302. DelaySec(1);//延时
  303. }
  304. else
  305. {
  306. ;
  307. }
  308. */
  309. }
  310. }

AT

OK

AT+SAPBR=3,1,"CONTYPE","GPRS"

OK

AT+SAPBR=3,1,"APN","CMNET"

OK

AT+SAPBR=1,1

OK

AT+HTTPINIT

OK

AT+HTTPPARA="URL","http://product.scrazy.cn/adore"

OK

AT+HTTPPARA="CONTENT","application/x-www-form-urlencoded"

OK

AT+HTTPDATA=8,10000

DOWNLOAD

ERROR

AT+HTTPACTION=0

OK

+HTTPACTION:0,200,4

AT+HTTPREAD

+HTTPREAD:4

send

OK

AT+HTTPTERM

OK

AT+SAPBR=0,1

OK

SIM900A模块HTTP相关调试笔记的更多相关文章

  1. Micropython TPYBoard v102 温湿度短信通知器(基于SIM900A模块)

    前言 前段时间看了追龙2,感受就是如果你是冲着追龙1来看追龙2的话,劝你还是不要看了,因为追龙2跟追龙1压根没什么联系,给我的感觉就像是看拆弹专家似的,估计追龙2这个名字就是随便蹭蹭追龙1的热度来的. ...

  2. USB wifi调试笔记

    本文以realtek 8192CU WiFi模块为例,介绍USB wifi在Jelly Bean 4.1的调试笔记. 1.WIFI打不开现象概述 WiFi打不开是指您在UI的settings下选中Wi ...

  3. Tomcat调试笔记

    调试笔记 在使用Tomcat过程中经常碰到问题,导致tomcat启动失败.如下↓ 由于报错太过笼统,我根本无法找出错误.后来我切换到Console视图下,看到了如下错误信息. 根据报错信息,错误原因是 ...

  4. linux设备驱动归纳总结(二):模块的相关基础概念【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-59415.html linux设备驱动归纳总结(二):模块的相关基础概念 系统平台:Ubuntu 10 ...

  5. Monkey相关参数 笔记

    Monkey相关参数  笔记 Monkey是Android系统自带的一个命令行工具,可运行在模拟器里或实际设备中. Monkey可以向被测试的应用程序发送伪随机的用户事件流(如按键.触屏.手势等),实 ...

  6. adb相关指令 笔记

      adb相关指令 笔记 1.adb devices 查看物理测试设备或模拟器的相关信息,有三个状态: (1)device 设备已连接到adb服务器上,但该状态并不代表设备已启动完毕可以进行操作: ( ...

  7. 孤荷凌寒自学python第三十五天python的文件操作之针对文件操作的os模块的相关内容

     孤荷凌寒自学python第三十五天python的文件操作之针对文件操作的os模块的相关内容 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.打开文件后,要务必记得关闭,所以一般的写法应当 ...

  8. ida动态调试笔记

    ida动态调试笔记 目标文件:阿里安全挑战赛的第二题 点击打开链接 使用环境:ida6.8点击打开链接,adt bundle点击打开链接 首先打开avd安卓模拟器,界面如下: 在dos下运行adb命令 ...

  9. 【Linux开发】linux设备驱动归纳总结(二):模块的相关基础概念

    linux设备驱动归纳总结(二):模块的相关基础概念 系统平台:Ubuntu 10.04 开发平台:S3C2440开发板 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

随机推荐

  1. .Net Actor 服务端开发框架,Newbe.Claptrap 项目周报 1 - 还没轮影,先用轮跑

    Newbe.Claptrap 项目周报 1,第一周代码写了一点.但主要还是考虑理论可行性. 第一次接触本框架的读者,可以先点击此处阅读本框架相关的基础理论和工作原理. 周报是啥? 成功的开源作品,离不 ...

  2. Socket编程 - API

    基础知识部分:http://www.cnblogs.com/Jimmy1988/p/7839940.html 1. 基本流程 Process Client Server Comment socket( ...

  3. Linux 命令 "cp" 代码实现简介

    本blog主要是模仿Linux的cp命令的功能,未实现参数,只是基础功能部分. 本文的主要目的在于练习 文件流 和 目录流 中的函数的使用. 主要功能包括两种: 源文件属性为文件,拷贝到其它文件(内容 ...

  4. springboot 源码笔记

    1.springAppication构造器 基于getSpringFactoriesInstances方法构造如下类(获取文件内容在META-INF/spring.factories文件中) 1.1 ...

  5. 基于Ionic的移动框架搭建

  6. PHP彻底解决mysql中文乱码

    彻底解决mysql中文乱码 mysql是我们项目中非经常常使用的数据型数据库. 可是由于我们须要在数据库保存中文字符,所以经常遇到数据库乱码情况.以下就来介绍一下怎样彻底解决数据库中文乱码情况. 数据 ...

  7. JavaScript push()函数追加数组数据

    将数据追加到一个数组末尾的最简单的方法是通过 push() 函数. .push() 允许有一个或多个参数,并把它“push”到数组的末尾. var arr = [1,2,3];arr.push(4); ...

  8. python 历险记(五)— python 中的模块

    目录 前言 基础 模块化程序设计 模块化有哪些好处? 什么是 python 中的模块? 引入模块有几种方式? 模块的查找顺序 模块中包含执行语句的情况 用 dir() 函数来窥探模块 python 的 ...

  9. gRPC的通讯过程

    在 HTTP2 协议正式开始工作前, 如果已经知道服务器是 HTTP2 的服务器, 通讯流程如下: 客户端必须首先发送一个连接序言,其逻辑结构: PRI * HTTP/2.0\r\n\r\nSM\r\ ...

  10. Java并发基础知识你知道多少?

    并发 https://blog.csdn.net/justloveyou_/article/details/53672005 并发的三个特性是什么? 什么是指令重排序? 单线程的指令重排序靠什么保证正 ...