[stm32] SIM808模块之发短信\GPS\TCP\HTTP研究
SIM8008是四频模块,全球可用。含有TTL电平接口等接口,能够实现发短信、打电话、GPRS传输数据、GPS等功能。[正版资料请找beautifulzzzz·博客园]
一些细节:
>> 5V供电1A以上(用USB转TTL模块上的电源可以驱动,亲试)
>> 上图黑色的线是VCC,白色线是GND,绿色线是TXD连接单片机或USB转TTL的RXD引脚,橙色的线类推。
>> 其中GPS的天线一般要放在室外,否则无法收到有效信号。
>> 三个LED指示灯: 一个是RING指示灯,一个是网络指示灯,一个PPS指示灯。注开机后,等待约2秒,首先RING指示灯常亮,然后网络指示灯快闪(1秒灭1秒亮),当模块注册到网络后,网络指示灯慢闪(1秒亮,3秒灭)。当GPS定位后,PPS灯会闪烁(1秒亮1秒灭)。
1、获得GPS的AT指令:
1 AT+CGPSPWR=1 2 AT+CGPSRST=1 3 AT+CGPSINF=32
其中:
>> AT+CGPSPWR=1表示开启GPS的POWER
>> AT+CGPSRST=1表示设置GPS启动模式(COLD\HOT\WARM),冷启动是第一次启动用。
>> 当前两个命令发送完毕,等表示GPS定位的灯闪烁后发送AT+CGPSINF=32来获取当前的GPS数据,此处的的32表示2^5为模式5,其收取的数据格式为GPRMC格式:(其中state位为A表示收到的是有效数据)
2、获得电量的AT指令:
1 AT+CBC
返回指令的意义:(中间一个数据为百分比电量,最后一个数据位电压的mV数)
3、发送短信的AT指令:
我买的SIM卡是流量卡,所以发送短信的服务是没有的,因此发送上面的命令会不成功。但是,我将自己手机里的4G小卡插在上面后再执行上述命令是可以的!
4、发送HTTP的AT指令:
1 AT+CGATT? 2 AT+SAPBR=3,1,"CONTYPE","GPRS" 3 AT+SAPBR=3,1,"APN","CMNET" 4 AT+SAPBR=1,1 5 AT+HTTPINIT 6 AT+HTTPPARA="URL","www.baidu.com/img/baidu_logo.gif" 7 AT+HTTPACTION=0 8 AT+HTTPREAD 9 AT+HTTPTERM
该一组命令实现用GET从百度下载一个图片:前4个命令是初始化设置,其中当:
AT+HTTPACTION=0 // 执行之后要等一段时间,然后等待返回
OK // 此时等待以下信息的返回,不要操作其它
+HTTPACTION:0,200,1489 // 获取成功
AT+HTTPREAD // 读取数据
+HTTPREAD:1489
5、下面是一个简单的SIM808的封装驱动代码:
1 #include <stddef.h> 2 #include <stdlib.h> 3 4 5 #include "SIM800L.h" 6 7 8 9 unsigned char hd[];//头 10 unsigned char id[];//id 11 unsigned char tp[];//?? 12 unsigned char lat[];//纬度 13 unsigned char lng[];//经度 14 unsigned char cbc[];//电量 15 unsigned char end[];//结尾 16 unsigned char ip[];//ip 17 unsigned char pt[];//port 18 19 u8 Ub[500]; 20 21 22 int Sim_ini(void) 23 { 24 USART2_DMASS("ATE1\r\n",500,100);//将当前的配置信息存储在非易失的存储里,当板重新启动,初始化从上次的开始 25 Delay_MS(500); 26 USART2_DMASS("AT+IFC=0,0\r\n",500,100); //非流控制 27 Delay_MS(500); 28 USART2_DMASS("AT+CSCLK=0\r\n",500,100);//不进入休眠状态 29 Delay_MS(500); 30 USART2_DMASS("AT+CFUN=1\r\n",500,1000); //打开全部功能 31 Delay_MS(500); 32 USART2_DMASS("AT+CBC\r\n",500,100);//可以充电 33 Delay_MS(500); 34 USART2_DMASS("AT+CPIN?\r\n",500,100);//查询(有些是否需要密码) 35 Delay_MS(500); 36 USART2_DMASS("AT+CSQ\r\n",500,100);//信号量查询(RSSI) 37 Delay_MS(500); 38 USART2_DMASS("AT+CMGF=1\r\n",500,100);//选择SMS信息的模式(text模式) 39 Delay_MS(500); 40 USART2_DMASS("AT+CFGRI=0\r\n",500,100);//表明RI当启动URC(关闭) 41 Delay_MS(500); 42 USART2_DMASS("AT+CIPRXGET=0\r\n",500,100); //自动从NetWork获得数据 43 Delay_MS(500); 44 45 Delay_MS(10000); 46 USART2_DMASS("AT+CGATT=1\r\n",5000,1000); //连接GPRS服务器 47 Delay_MS(500); 48 USART2_DMASS("AT+CGREG?\r\n",5000,100);//查询 49 Delay_MS(500); 50 USART2_DMASS("AT+CGATT?\r\n",5000,100); //查询 51 Delay_MS(500); 52 USART2_DMASS("AT+CIPSHUT\r\n",1000,2000); //关闭IP连接 53 Delay_MS(500); 54 USART2_DMASS("AT+CSTT=\"CMNET\"\r\n",500,100);//设置名字和密码 55 Delay_MS(500); 56 USART2_DMASS("AT+CIICR\r\n",500,1000); //bring up wireless connection with GPRS or CSD 57 Delay_MS(500); 58 USART2_DMASS("AT+CIFSR\r\n",500,1000); //get local IP Address 59 Delay_MS(500); 60 USART2_DMASS("AT+CIPSTATUS\r\n",500,100);//query current connection status 61 Delay_MS(500); 62 USART2_DMASS("AT+CIPQSEND=0\r\n",500,100);//select data transmitting mode(0模式,服务器收到数据返回Send OK) 63 Delay_MS(500); 64 USART2_DMASS("AT+CIPSTART=\"TCP\",\"beautifulzzzz.iask.in\",10000\r\n",500,100);//start up TCP or UDP Connection 65 Delay_MS(500); 66 USART2_DMASS(NULL,5000,100);//发送一个NULL,用于读取USART2数据 67 Delay_MS(500); 68 // 69 70 return 0; 71 } 72 73 74 void USART2_DMAS(u8* Data) 75 { 76 while(*Data) 77 { 78 USART2_SendByte(*Data++); 79 } 80 } 81 82 int USART2_DMASS(u8* Data,uint16_t BeTime,uint16_t AfTime) 83 { 84 int RecLen=0; 85 u8 Ubyte=0; 86 u8 i; 87 88 USART2_RX_Buffer_Clear(); 89 if(Data!=NULL){ 90 USART2_DMASendString(Data,strlen((const char *)Data)); 91 } 92 //等待BeTime 93 do{ 94 BeTime=BeTime-1; 95 Delay_MS(1); 96 }while(!(LookUSART2_GetBuffCount()) && BeTime>0); 97 //检测串口数据 98 do{ 99 100 AfTime=AfTime-1; 101 while(LookUSART2_GetBuffCount()){ 102 USART2_GetByte(&Ubyte); 103 Ub[RecLen]=Ubyte; 104 RecLen=RecLen+1; 105 } 106 107 Delay_MS(1); 108 109 }while(LookUSART2_GetBuffCount() || AfTime>0); 110 111 USART2_RX_Buffer_Clear(); 112 113 //通过串口1显示 114 115 DebugPf("################################\r\n"); 116 DebugPf("####SIM800L Back Data=%d\r\n",RecLen); 117 for(i=0;i<RecLen;i++){ 118 DebugPf("%c",Ub[i]); 119 } 120 DebugPf("\r\n"); 121 DebugPf("####SIM800L Back Data End\r\n"); 122 DebugPf("################################\r\n"); 123 124 return RecLen; 125 126 } 127 128 unsigned char GPSVLD(void) 129 { 130 char *gps; 131 gps=strstr((const char *)Ub,"+CGPSINF:"); 132 gps+=24; 133 return gps[0]; 134 } 135 136 void GPSDATA(void) 137 { 138 char *gps; 139 unsigned char i; 140 141 gps=strstr((const char *)Ub,"+CGPSINF:"); 142 143 gps+=26; 144 for(i=0;i<9;i++) 145 { 146 lat[i]=gps[i]; 147 } 148 // DebugPf(lat); 149 150 gps+=12; 151 for(i=0;i<10;i++) 152 { 153 lng[i]=gps[i]; 154 } 155 // DebugPf(lng); 156 157 tp[0]='A'; 158 } 159 160 //获取电量,存入cbc[] 161 void CBCDATA() 162 { 163 char *bc; 164 unsigned char i; 165 166 bc=strstr((const char *)Ub,"+CBC:"); 167 168 bc+=8; 169 170 i=0; 171 do{ 172 i++; 173 }while(bc[i]!=','); 174 175 switch (i){ 176 case 3: 177 cbc[0]=bc[0]; 178 cbc[1]=bc[1]; 179 cbc[2]=bc[2]; 180 break; 181 182 case 2: 183 cbc[0]=0x30; 184 cbc[1]=bc[0]; 185 cbc[2]=bc[1]; 186 break; 187 188 case 1: 189 cbc[0]=0x30; 190 cbc[1]=0x30; 191 cbc[2]=bc[0]; 192 break; 193 194 default: 195 break; 196 } 197 198 // DebugPf(cbc); 199 }
当想要获取GPS数据时,首先启动GPS:
1 USART2_DMASS("AT+CGPSPWR=1\r\n",500,100);//开GPS启 2 Delay_MS(2500); 3 USART2_DMASS("AT+CGPSRST=1\r\n",500,100);//GPS启动模
这里的USART2_DMASS函数是基于STM32上的USART2封装的函数,专门用来向SIM808发送指令,后两个参数是控制数据发送和接收数据的时间(因为大多数AT指令发送后直接可以获取返回,因此该函数包含发送和返回接收)
此外要注意每个命令后面还要加"\r\n".
这样因为有了该函数,用单片机发送AT指令就比较方便了:同用串口助手发送AT指令获得GPS数据,当GPS启动并定位成功后执行下面的语句则可以获得实时的GPS数据~
1 USART2_DMASS("AT+CGPSINF=32\n",100,100);//查询GPRMC数据(当前GPS手数据)[应该在GPS定位成功后执行]
资料链接:
总资料:http://pan.baidu.com/s/1sjTg5q9
比较有用的几个:
1、原理图(打板、连线必备、SIM808最小系统啦):http://pan.baidu.com/s/1kTRWJpd
2、用户手册(注意事项、大致了解):http://pan.baidu.com/s/1nuh1Fi5
3、AT指令(虽然不是SIM808但是基本通用):http://pan.baidu.com/s/1pJW8uPd