久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5439|回復: 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, 下載次數: 43)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品欧美一区二区三区久久久 | 亚洲免费在线 | 亚洲精品视频免费看 | 超碰超碰 | 欧洲一区二区三区 | 午夜影院视频在线观看 | 国产精品免费在线 | 亚洲深夜福利 | 国产精品一区二区三区久久久 | 中文字幕一级毛片视频 | 中文字幕一区二区三区精彩视频 | 91视频久久久久 | 亚洲国产精品一区二区三区 | 最近中文字幕免费 | 日本在线视 | 一区中文字幕 | 久久国产精品一区 | 欧美激情在线精品一区二区三区 | 黄色国产大片 | 亚洲精品视频一区二区三区 | 91操操操 | av一级在线观看 | 国产精品久久久久久久久久免费 | 国产精品国产成人国产三级 | 亚洲精品久久久一区二区三区 | 欧美日韩国产一区二区三区 | 亚洲一区二区三区免费视频 | 日本成人三级电影 | 久久天堂网 | 免费观看成人av | 99热在线免费 | 亚洲精品电影网在线观看 | 夜久久| 亚洲欧洲成人av每日更新 | 国产高清在线精品一区二区三区 | 女同videos另类 | 亚洲精品91 | heyzo在线| 欧美一级一 | 伊人免费在线观看高清 | 国产一区二区不卡 |