SIM900A模块使用小记

SIM900A模块使用小记

正常工作状态:

接线方法:

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

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