[应用相关] [stm32] SIM808模块之发短信\GPS\TCP\HTTP研究

[复制链接]
1269|17
 楼主| comparison 发表于 2020-1-5 16:51 | 显示全部楼层 |阅读模式
SIM8008是四频模块,全球可用。含有TTL电平接口等接口,能够实现发短信、打电话、GPRS传输数据、GPS等功能。[正版资料请找beautifulzzzz·博客园]
281122413139496.jpg
一些细节:
>>  5V供电1A以上(用USB转TTL模块上的电源可以驱动,亲试)
>> 上图黑色的线是VCC,白色线是GND,绿色线是TXD连接单片机或USB转TTL的RXD引脚,橙色的线类推。
>> 其中GPS的天线一般要放在室外,否则无法收到有效信号。
>> 三个LED指示灯: 一个是RING指示灯,一个是网络指示灯,一个PPS指示灯。注开机后,等待约2秒,首先RING指示灯常亮,然后网络指示灯快闪(1秒灭1秒亮),当模块注册到网络后,网络指示灯慢闪(1秒亮,3秒灭)。当GPS定位后,PPS灯会闪烁(1秒亮1秒灭)。

 楼主| comparison 发表于 2020-1-5 16:52 | 显示全部楼层
1、获得GPS的AT指令:

1 AT+CGPSPWR=1
2 AT+CGPSRST=1
3 AT+CGPSINF=32

454395e11a3e1e4809.png
 楼主| comparison 发表于 2020-1-5 16:53 | 显示全部楼层
其中:

>>  AT+CGPSPWR=1表示开启GPS的POWER
>>  AT+CGPSRST=1表示设置GPS启动模式(COLD\HOT\WARM),冷启动是第一次启动用。
>>  当前两个命令发送完毕,等表示GPS定位的灯闪烁后发送AT+CGPSINF=32来获取当前的GPS数据,此处的的32表示2^5为模式5,其收取的数据格式为GPRMC格式:(其中state位为A表示收到的是有效数据)

942405e11a3f9ddd23.png
 楼主| comparison 发表于 2020-1-5 16:53 | 显示全部楼层
2、获得电量的AT指令:

1 AT+CBC

777495e11a41b01e9c.png
返回指令的意义:(中间一个数据为百分比电量,最后一个数据位电压的mV数)
715985e11a42162ab2.png
 楼主| comparison 发表于 2020-1-5 16:54 | 显示全部楼层
3、发送短信的AT指令:

158975e11a44592691.png
我买的SIM卡是流量卡,所以发送短信的服务是没有的,因此发送上面的命令会不成功。但是,我将自己手机里的4G小卡插在上面后再执行上述命令是可以的!
 楼主| comparison 发表于 2020-1-5 16:55 | 显示全部楼层
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_**.gif"
  7. AT+HTTPACTION=0
  8. AT+HTTPREAD
  9. AT+HTTPTERM

82135e11a48016902.png
 楼主| comparison 发表于 2020-1-5 16:55 | 显示全部楼层
该一组命令实现用GET从百度下载一个图片:前4个命令是初始化设置,其中当:

AT+HTTPACTION=0            // 执行之后要等一段时间,然后等待返回
OK                                                    // 此时等待以下信息的返回,不要操作其它
+HTTPACTION:0,200,1489                    //  获取成功
AT+HTTPREAD                                    //  读取数据
+HTTPREAD:1489
 楼主| comparison 发表于 2020-1-5 16:56 | 显示全部楼层
5、下面是一个简单的SIM808的封装驱动代码:

  1. #include <stddef.h>
  2. #include <stdlib.h>


  3. #include "SIM800L.h"



  4. unsigned char hd[];//头
  5. unsigned char id[];//id
  6. unsigned char tp[];//??
  7. unsigned char lat[];//纬度
  8. unsigned char lng[];//经度
  9. unsigned char cbc[];//电量
  10. unsigned char end[];//结尾
  11. unsigned char ip[];//ip
  12. unsigned char pt[];//port

  13. u8 Ub[500];


  14. int Sim_ini(void)
  15. {   
  16.     USART2_DMASS("ATE1\r\n",500,100);//将当前的配置信息存储在非易失的存储里,当板重新启动,初始化从上次的开始   
  17.     Delay_MS(500);
  18.     USART2_DMASS("AT+IFC=0,0\r\n",500,100);    //非流控制
  19.     Delay_MS(500);
  20.     USART2_DMASS("AT+CSCLK=0\r\n",500,100);//不进入休眠状态   
  21.     Delay_MS(500);
  22.     USART2_DMASS("AT+CFUN=1\r\n",500,1000);    //打开全部功能
  23.     Delay_MS(500);
  24.     USART2_DMASS("AT+CBC\r\n",500,100);//可以充电   
  25.     Delay_MS(500);
  26.     USART2_DMASS("AT+CPIN?\r\n",500,100);//查询(有些是否需要密码)
  27.     Delay_MS(500);
  28.     USART2_DMASS("AT+CSQ\r\n",500,100);//信号量查询(RSSI)
  29.     Delay_MS(500);
  30.     USART2_DMASS("AT+CMGF=1\r\n",500,100);//选择SMS信息的模式(text模式)
  31.     Delay_MS(500);
  32.     USART2_DMASS("AT+CFGRI=0\r\n",500,100);//表明RI当启动URC(关闭)
  33.     Delay_MS(500);
  34.     USART2_DMASS("AT+CIPRXGET=0\r\n",500,100); //自动从NetWork获得数据
  35.     Delay_MS(500);
  36.    
  37.     Delay_MS(10000);
  38.     USART2_DMASS("AT+CGATT=1\r\n",5000,1000); //连接GPRS服务器
  39.     Delay_MS(500);
  40.     USART2_DMASS("AT+CGREG?\r\n",5000,100);//查询
  41.     Delay_MS(500);
  42.     USART2_DMASS("AT+CGATT?\r\n",5000,100);    //查询
  43.     Delay_MS(500);
  44.     USART2_DMASS("AT+CIPSHUT\r\n",1000,2000); //关闭IP连接
  45.     Delay_MS(500);
  46.     USART2_DMASS("AT+CSTT="CMNET"\r\n",500,100);//设置名字和密码
  47.     Delay_MS(500);
  48.     USART2_DMASS("AT+CIICR\r\n",500,1000); //bring up wireless connection with GPRS or CSD
  49.     Delay_MS(500);
  50.     USART2_DMASS("AT+CIFSR\r\n",500,1000); //get local IP Address
  51.     Delay_MS(500);
  52.     USART2_DMASS("AT+CIPSTATUS\r\n",500,100);//query current connection status
  53.     Delay_MS(500);
  54.     USART2_DMASS("AT+CIPQSEND=0\r\n",500,100);//select data transmitting mode(0模式,服务器收到数据返回Send OK)
  55.     Delay_MS(500);
  56.     USART2_DMASS("AT+CIPSTART="TCP","beautifulzzzz.iask.in",10000\r\n",500,100);//start up TCP or UDP Connection
  57.     Delay_MS(500);
  58.     USART2_DMASS(NULL,5000,100);//发送一个NULL,用于读取USART2数据
  59.     Delay_MS(500);
  60.     //
  61.    
  62.     return 0;
  63. }


  64. void USART2_DMAS(u8* Data)
  65. {
  66.     while(*Data)
  67.     {
  68.         USART2_SendByte(*Data++);
  69.     }
  70. }

  71. int USART2_DMASS(u8* Data,uint16_t BeTime,uint16_t AfTime)
  72. {
  73.     int RecLen=0;
  74.     u8 Ubyte=0;
  75.     u8 i;
  76.    
  77.     USART2_RX_Buffer_Clear();
  78.     if(Data!=NULL){
  79.         USART2_DMASendString(Data,strlen((const char *)Data));
  80.     }
  81.     //等待BeTime   
  82.     do{
  83.         BeTime=BeTime-1;
  84.         Delay_MS(1);
  85.     }while(!(LookUSART2_GetBuffCount()) && BeTime>0);
  86.     //检测串口数据   
  87.     do{
  88.         
  89.         AfTime=AfTime-1;
  90.         while(LookUSART2_GetBuffCount()){
  91.             USART2_GetByte(&Ubyte);
  92.             Ub[RecLen]=Ubyte;
  93.             RecLen=RecLen+1;            
  94.         }
  95.         
  96.         Delay_MS(1);
  97.         
  98.     }while(LookUSART2_GetBuffCount() || AfTime>0);
  99.    
  100.     USART2_RX_Buffer_Clear();
  101.    
  102.     //通过串口1显示

  103.     DebugPf("################################\r\n");               
  104.     DebugPf("####SIM800L Back Data=%d\r\n",RecLen);
  105.     for(i=0;i<RecLen;i++){
  106.         DebugPf("%c",Ub[i]);
  107.     }
  108.     DebugPf("\r\n");
  109.     DebugPf("####SIM800L Back Data End\r\n");
  110.     DebugPf("################################\r\n");

  111.     return RecLen;   
  112.    
  113. }

  114. unsigned char GPSVLD(void)
  115. {
  116.     char *gps;   
  117.     gps=strstr((const char *)Ub,"+CGPSINF:");   
  118.     gps+=24;   
  119.     return gps[0];
  120. }

  121. void GPSDATA(void)
  122. {
  123.     char *gps;
  124.     unsigned char i;
  125.    
  126.     gps=strstr((const char *)Ub,"+CGPSINF:");
  127.    
  128.     gps+=26;
  129.     for(i=0;i<9;i++)
  130.     {
  131.         lat[i]=gps[i];
  132.     }
  133.     //    DebugPf(lat);
  134.    
  135.     gps+=12;
  136.     for(i=0;i<10;i++)
  137.     {
  138.         lng[i]=gps[i];
  139.     }
  140.     //    DebugPf(lng);
  141.    
  142.     tp[0]='A';
  143. }

  144. //获取电量,存入cbc[]
  145. void CBCDATA()
  146. {
  147.     char *bc;
  148.     unsigned char i;
  149.    
  150.     bc=strstr((const char *)Ub,"+CBC:");
  151.    
  152.     bc+=8;
  153.    
  154.     i=0;
  155.     do{        
  156.         i++;
  157.     }while(bc[i]!=',');
  158.    
  159.     switch (i){
  160.     case 3:
  161.         cbc[0]=bc[0];
  162.         cbc[1]=bc[1];
  163.         cbc[2]=bc[2];   
  164.         break;
  165.         
  166.     case 2:
  167.         cbc[0]=0x30;
  168.         cbc[1]=bc[0];
  169.         cbc[2]=bc[1];   
  170.         break;
  171.         
  172.     case 1:
  173.         cbc[0]=0x30;
  174.         cbc[1]=0x30;
  175.         cbc[2]=bc[0];   
  176.         break;
  177.         
  178.     default:
  179.         break;
  180.     }
  181.         
  182.     //    DebugPf(cbc);   
  183. }
 楼主| comparison 发表于 2020-1-5 16:56 | 显示全部楼层
当想要获取GPS数据时,首先启动GPS:

USART2_DMASS("AT+CGPSPWR=1\r\n",500,100);//开GPS启
Delay_MS(2500);
USART2_DMASS("AT+CGPSRST=1\r\n",500,100);//GPS启动模

这里的USART2_DMASS函数是基于STM32上的USART2封装的函数,专门用来向SIM808发送指令,后两个参数是控制数据发送和接收数据的时间(因为大多数AT指令发送后直接可以获取返回,因此该函数包含发送和返回接收)

此外要注意每个命令后面还要加"\r\n".

这样因为有了该函数,用单片机发送AT指令就比较方便了:同用串口助手发送AT指令获得GPS数据,当GPS启动并定位成功后执行下面的语句则可以获得实时的GPS数据~

USART2_DMASS("AT+CGPSINF=32\n",100,100);//查询GPRMC数据(当前GPS手数据)[应该在GPS定位成功后执行]
 楼主| comparison 发表于 2020-1-5 16:57 | 显示全部楼层
资料链接:

总资料:http://pan.baidu.com/s/1sjTg5q9
689855e11a4f1095c3.png

比较有用的几个:

1、原理图(打板、连线必备、SIM808最小系统啦):http://pan.baidu.com/s/1kTRWJpd
2、用户手册(注意事项、大致了解):http://pan.baidu.com/s/1nuh1Fi5
3、AT指令(虽然不是SIM808但是基本通用):http://pan.baidu.com/s/1pJW8uPd
paotangsan 发表于 2020-2-3 11:26 | 显示全部楼层
非常感谢楼主分享
renzheshengui 发表于 2020-2-3 11:29 | 显示全部楼层
非常感谢楼主分享
wakayi 发表于 2020-2-3 11:32 | 显示全部楼层
非常感谢楼主分享
wowu 发表于 2020-2-3 11:45 | 显示全部楼层
非常感谢楼主分享
xiaoqizi 发表于 2020-2-3 12:02 | 显示全部楼层
非常感谢楼主分享
木木guainv 发表于 2020-2-3 12:19 | 显示全部楼层
非常感谢楼主分享
磨砂 发表于 2020-2-3 16:33 | 显示全部楼层
非常感谢楼主分享
晓伍 发表于 2020-2-3 16:34 | 显示全部楼层
非常感谢楼主分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

417

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部