找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4664|回复: 3
打印 上一主题 下一主题
收起左侧

发个GPRS打电话和GPS收卫星的Arduino例程

[复制链接]
跳转到指定楼层
楼主
1.A6A7模块需要按照供电说明供电
2.A6A7模块需要手动开机,或者将PWR_KEY引脚和V_BAT引脚短路自启动
3.先下载好程序,再接线,否则arduino UNO会下载不进去程序,因为下载程序和A6A7模块复用D0和D1
注意:代码记得安装库才能编译通过


必须接的线:
A6A7模块                ARDUINO UNO
GND------>                GND
U_TXD---->                0
U_RXD---->                1


可不接的线(用于测试调试信息)
USB-TTL模块                        ARDUINO UNO
GND----->                        GND
RXD----->                        11
TXD----->                        10


单片机源程序如下:
  1. /*********************************************************************
  2.                  作者:神秘藏宝室
  3.                  店铺:ILoveMCU
  4.         本例程仅适用于在本店购买模块的用户使用,鄙视其它店铺的盗用行为
  5.         接线方式
  6.         A7                                ARDUINO MEGA2560
  7.         GND          --->                GND
  8.         U_TXD        --->                RX3
  9.         U_RXD        <---                TX3

  10.         GPS_TXD        --->                RX2
  11. *********************************************************************/
  12. #include <TimerOne.h>



  13. #define DebugSerial Serial
  14. #define GprsSerail Serial3
  15. #define GpsSerial  Serial2

  16. struct
  17. {
  18.         char GPS_Buffer[80];
  19.         bool isGetData;   //是否获取到GPS数据
  20.         bool isParseData; //是否解析完成
  21.         char UTCTime[11];   //UTC时间
  22.         char latitude[11];    //纬度
  23.         char N_S[2];    //N/S
  24.         char longitude[12];   //经度
  25.         char E_W[2];    //E/W
  26.         bool isUsefull;   //定位信息是否有效
  27. } Save_Data;

  28. const unsigned int gpsRxBufferLength = 600;
  29. char gpsRxBuffer[gpsRxBufferLength];
  30. unsigned int gpsRxCount = 0;

  31. #define Success 1U
  32. #define Failure 0U

  33. int L = 13; //LED指示灯引脚

  34. unsigned long  Time_Cont = 0;       //定时器计数器

  35. const unsigned int gprsRxBufferLength = 500;
  36. char gprsRxBuffer[gprsRxBufferLength];
  37. unsigned int gprsBufferCount = 0;

  38. char messageBuffer[100] = {};

  39. char send_buf[100] = {0};

  40. const char TCPServer[] = "122.228.19.57";                //TCP服务器地址
  41. const char Port[] = "30396";                                                //端口

  42. unsigned int count = 0;


  43. void setup() {
  44.         pinMode(L, OUTPUT);
  45.         digitalWrite(L, LOW);

  46.         DebugSerial.begin(9600);
  47.         GprsSerail.begin(115200);
  48.         GpsSerial.begin(9600);      //定义波特率9600,和我们店铺的GPS模块输出的波特率一致

  49.         Timer1.initialize(1000);
  50.         Timer1.attachInterrupt(Timer1_handler);

  51.         initGprs();                //初始化模块


  52.         DebugSerial.println("\r\nsetup end!");
  53.         clrGprsRxBuffer();
  54. }

  55. void loop() {
  56.         gpsRead();  //获取GPS数据
  57.         parseGpsBuffer();//解析GPS数据
  58.         printGpsBuffer();//输出解析后的数据
  59. }


  60. void initGprs()
  61. {
  62.         if (sendCommand("AT+RST\r\n", "OK\r\n", 3000, 10) == Success);
  63.         else errorLog(1);

  64.         if (sendCommand("AT\r\n", "OK\r\n", 3000, 10) == Success);
  65.         else errorLog(2);

  66.         delay(10);

  67.         if (sendCommand("AT+GPS=1\r\n","OK\r\n", 1000, 10) == Success);
  68.         else errorLog(3);
  69.         delay(10);

  70. }

  71. void(* resetFunc) (void) = 0; //制造重启命令

  72. void errorLog(int num)
  73. {
  74.         DebugSerial.print("ERROR");
  75.         DebugSerial.println(num);
  76.         while (1)
  77.         {
  78.                 digitalWrite(L, HIGH);
  79.                 delay(100);
  80.                 digitalWrite(L, LOW);
  81.                 delay(100);
  82.                 digitalWrite(L, HIGH);
  83.                 delay(100);
  84.                 digitalWrite(L, LOW);
  85.                 delay(300);

  86.                 if (sendCommand("AT\r\n", "OK", 100, 10) == Success)
  87.                 {
  88.                         DebugSerial.print("\r\nRESET!!!!!!\r\n");
  89.                         resetFunc();
  90.                 }
  91.         }
  92. }

  93. void printGpsBuffer()
  94. {
  95.         if (Save_Data.isParseData)
  96.         {
  97.                 Save_Data.isParseData = false;

  98.                 DebugSerial.print("Save_Data.UTCTime = ");
  99.                 DebugSerial.println(Save_Data.UTCTime);

  100.                 if (Save_Data.isUsefull)
  101.                 {
  102.                         Save_Data.isUsefull = false;
  103.                         DebugSerial.print("Save_Data.latitude = ");
  104.                         DebugSerial.println(Save_Data.latitude);
  105.                         DebugSerial.print("Save_Data.N_S = ");
  106.                         DebugSerial.println(Save_Data.N_S);
  107.                         DebugSerial.print("Save_Data.longitude = ");
  108.                         DebugSerial.println(Save_Data.longitude);
  109.                         DebugSerial.print("Save_Data.E_W = ");
  110.                         DebugSerial.println(Save_Data.E_W);

  111.                         digitalWrite(L, !digitalRead(L));//发送一组数据翻转一次
  112.                 }
  113.                 else
  114.                 {
  115.                         DebugSerial.println("GPS DATA is not usefull!");
  116.                 }

  117.         }
  118. }

  119. void parseGpsBuffer()
  120. {
  121.         char *subString;
  122.         char *subStringNext;
  123.         if (Save_Data.isGetData)
  124.         {
  125.                 Save_Data.isGetData = false;
  126.                 DebugSerial.println("**************");
  127.                 DebugSerial.println(Save_Data.GPS_Buffer);


  128.                 for (int i = 0 ; i <= 6 ; i++)
  129.                 {
  130.                         if (i == 0)
  131.                         {
  132.                                 if ((subString = strstr(Save_Data.GPS_Buffer, ",")) == NULL)
  133.                                         errorLog(12);  //解析错误
  134.                         }
  135.                         else
  136.                         {
  137.                                 subString++;
  138.                                 if ((subStringNext = strstr(subString, ",")) != NULL)
  139.                                 {
  140.                                         char usefullBuffer[2];
  141.                                         switch (i)
  142.                                         {
  143.                                         case 1: memcpy(Save_Data.UTCTime, subString, subStringNext - subString); break; //获取UTC时间
  144.                                         case 2: memcpy(usefullBuffer, subString, subStringNext - subString); break; //获取UTC时间
  145.                                         case 3: memcpy(Save_Data.latitude, subString, subStringNext - subString); break; //获取纬度信息
  146.                                         case 4: memcpy(Save_Data.N_S, subString, subStringNext - subString); break; //获取N/S
  147.                                         case 5: memcpy(Save_Data.longitude, subString, subStringNext - subString); break; //获取纬度信息
  148.                                         case 6: memcpy(Save_Data.E_W, subString, subStringNext - subString); break; //获取E/W

  149.                                         default: break;
  150.                                         }

  151.                                         subString = subStringNext;
  152.                                         Save_Data.isParseData = true;
  153.                                         if (usefullBuffer[0] == 'A')
  154.                                                 Save_Data.isUsefull = true;
  155.                                         else if (usefullBuffer[0] == 'V')
  156.                                                 Save_Data.isUsefull = false;

  157.                                 }
  158.                                 else
  159.                                 {
  160.                                         errorLog(13);  //解析错误
  161.                                 }
  162.                         }


  163.                 }
  164.         }
  165. }


  166. void gpsRead() {
  167.         while (GpsSerial.available())
  168.         {
  169.                 gpsRxBuffer[gpsRxCount] = GpsSerial.read();
  170.                 if (gpsRxBuffer[gpsRxCount++] == '\n')
  171.                 {
  172.                         char* GPS_BufferHead;
  173.                         char* GPS_BufferTail;
  174.                         if ((GPS_BufferHead = strstr(gpsRxBuffer, "$GPRMC,")) != NULL || (GPS_BufferHead = strstr(gpsRxBuffer, "$GNRMC,")) != NULL )
  175.                         {
  176.                                 if (((GPS_BufferTail = strstr(GPS_BufferHead, "\r\n")) != NULL) && (GPS_BufferTail > GPS_BufferHead))
  177.                                 {
  178.                                         memcpy(Save_Data.GPS_Buffer, GPS_BufferHead, GPS_BufferTail - GPS_BufferHead);
  179.                                         Save_Data.isGetData = true;

  180.                                         clrGpsRxBuffer();
  181.                                 }
  182.                         }
  183.                         clrGpsRxBuffer();
  184.                 }
  185.                 if (gpsRxCount == gpsRxBufferLength)clrGpsRxBuffer();
  186.         }


  187. }

  188. void clrGpsRxBuffer(void)
  189. {
  190.         memset(gpsRxBuffer, 0, gpsRxBufferLength);      //清空
  191.         gpsRxCount = 0;
  192. }



  193. unsigned int sendCommand(char *Command, char *Response, unsigned long Timeout, unsigned char Retry)
  194. {
  195.         clrGprsRxBuffer();
  196.         for (unsigned char n = 0; n < Retry; n++)
  197.         {
  198.                 DebugSerial.print("\r\n---------send AT Command:---------\r\n");
  199.                 DebugSerial.write(Command);

  200.                 GprsSerail.write(Command);

  201.                 Time_Cont = 0;
  202.                 while (Time_Cont < Timeout)
  203.                 {
  204.                         gprsReadBuffer();
  205.                         if (strstr(gprsRxBuffer, Response) != NULL)
  206.                         {
  207.                                 DebugSerial.print("\r\n==========receive AT Command:==========\r\n");
  208.                                 DebugSerial.print(gprsRxBuffer); //输出接收到的信息
  209.                                 clrGprsRxBuffer();
  210.                                 return Success;
  211.                         }
  212.                 }
  213.                 Time_Cont = 0;
  214.         }
  215.         DebugSerial.print("\r\n==========receive AT Command:==========\r\n");
  216.         DebugSerial.print(gprsRxBuffer);//输出接收到的信息
  217.         clrGprsRxBuffer();
  218.         return Failure;
  219. }

  220. unsigned int sendCommandReceive2Keyword(char *Command, char *Response, char *Response2, unsigned long Timeout, unsigned char Retry)
  221. {
  222.         clrGprsRxBuffer();
  223.         for (unsigned char n = 0; n < Retry; n++)
  224.         {
  225.                 DebugSerial.print("\r\n---------send AT Command:---------\r\n");
  226.                 DebugSerial.write(Command);

  227.                 GprsSerail.write(Command);

  228.                 Time_Cont = 0;
  229.                 while (Time_Cont < Timeout)
  230.                 {
  231.                         gprsReadBuffer();
  232.                         if (strstr(gprsRxBuffer, Response) != NULL && strstr(gprsRxBuffer, Response2) != NULL)
  233.                         {
  234.                                 DebugSerial.print("\r\n==========receive AT Command:==========\r\n");
  235.                                 DebugSerial.print(gprsRxBuffer); //输出接收到的信息
  236.                                 clrGprsRxBuffer();
  237.                                 return Success;
  238.                         }
  239.                 }
  240.                 Time_Cont = 0;
  241.         }
  242.         DebugSerial.print("\r\n==========receive AT Command:==========\r\n");
  243.         DebugSerial.print(gprsRxBuffer);//输出接收到的信息
  244.         clrGprsRxBuffer();
  245.         return Failure;
  246. }




  247. void Timer1_handler(void)
  248. {
  249.         Time_Cont++;
  250. }



  251. void gprsReadBuffer() {
  252.         while (GprsSerail.available())
  253.         {
  254.                 gprsRxBuffer[gprsBufferCount++] = GprsSerail.read();
  255.                 if (gprsBufferCount == gprsRxBufferLength)clrGprsRxBuffer();
  256.         }
  257. }

  258. void clrGprsRxBuffer(void)
  259. {
  260.         memset(gprsRxBuffer, 0, gprsRxBufferLength);      //清空
  261.         gprsBufferCount = 0;
  262. }
复制代码

所有资料51hei提供下载:
ARDUINO例程GPRS&amp;GPS.zip (37.49 KB, 下载次数: 41)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:550724 发表于 2019-6-4 13:08 | 只看该作者
感谢分享!
回复

使用道具 举报

板凳
ID:550724 发表于 2019-6-4 13:09 | 只看该作者
非常好的实例,谢谢分享!
回复

使用道具 举报

地板
ID:53031 发表于 2019-12-27 09:43 | 只看该作者
DebugSerial.print("\r\n==========receive AT Command:==========\r\n");
                                DebugSerial.print(gprsRxBuffer); //输出接收到的信息
软串口的信息打印在串口监控器上能看到吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表