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