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
0.png (48.09 KB, 下載次數: 71)
下載附件
2018-11-28 01:26 上傳
單片機源程序如下:
- /*********************************************************************
- 作者:神秘藏寶室
- 店鋪:ILoveMCU
- 本例程僅適用于在本店購買模塊的用戶使用,鄙視其它店鋪的盜用行為
- 接線方式
- A7 ARDUINO MEGA2560
- GND ---> GND
- U_TXD ---> RX3
- U_RXD <--- TX3
- GPS_TXD ---> RX2
- *********************************************************************/
- #include <TimerOne.h>
- #define DebugSerial Serial
- #define GprsSerail Serial3
- #define GpsSerial Serial2
- struct
- {
- char GPS_Buffer[80];
- bool isGetData; //是否獲取到GPS數據
- bool isParseData; //是否解析完成
- char UTCTime[11]; //UTC時間
- char latitude[11]; //緯度
- char N_S[2]; //N/S
- char longitude[12]; //經度
- char E_W[2]; //E/W
- bool isUsefull; //定位信息是否有效
- } Save_Data;
- const unsigned int gpsRxBufferLength = 600;
- char gpsRxBuffer[gpsRxBufferLength];
- unsigned int gpsRxCount = 0;
- #define Success 1U
- #define Failure 0U
- int L = 13; //LED指示燈引腳
- unsigned long Time_Cont = 0; //定時器計數器
- const unsigned int gprsRxBufferLength = 500;
- char gprsRxBuffer[gprsRxBufferLength];
- unsigned int gprsBufferCount = 0;
- char messageBuffer[100] = {};
- char send_buf[100] = {0};
- const char TCPServer[] = "122.228.19.57"; //TCP服務器地址
- const char Port[] = "30396"; //端口
- unsigned int count = 0;
- void setup() {
- pinMode(L, OUTPUT);
- digitalWrite(L, LOW);
- DebugSerial.begin(9600);
- GprsSerail.begin(115200);
- GpsSerial.begin(9600); //定義波特率9600,和我們店鋪的GPS模塊輸出的波特率一致
- Timer1.initialize(1000);
- Timer1.attachInterrupt(Timer1_handler);
- initGprs(); //初始化模塊
- DebugSerial.println("\r\nsetup end!");
- clrGprsRxBuffer();
- }
- void loop() {
- gpsRead(); //獲取GPS數據
- parseGpsBuffer();//解析GPS數據
- printGpsBuffer();//輸出解析后的數據
- }
- void initGprs()
- {
- if (sendCommand("AT+RST\r\n", "OK\r\n", 3000, 10) == Success);
- else errorLog(1);
- if (sendCommand("AT\r\n", "OK\r\n", 3000, 10) == Success);
- else errorLog(2);
- delay(10);
- if (sendCommand("AT+GPS=1\r\n","OK\r\n", 1000, 10) == Success);
- else errorLog(3);
- delay(10);
- }
- void(* resetFunc) (void) = 0; //制造重啟命令
- void errorLog(int num)
- {
- DebugSerial.print("ERROR");
- DebugSerial.println(num);
- while (1)
- {
- digitalWrite(L, HIGH);
- delay(100);
- digitalWrite(L, LOW);
- delay(100);
- digitalWrite(L, HIGH);
- delay(100);
- digitalWrite(L, LOW);
- delay(300);
- if (sendCommand("AT\r\n", "OK", 100, 10) == Success)
- {
- DebugSerial.print("\r\nRESET!!!!!!\r\n");
- resetFunc();
- }
- }
- }
- void printGpsBuffer()
- {
- if (Save_Data.isParseData)
- {
- Save_Data.isParseData = false;
- DebugSerial.print("Save_Data.UTCTime = ");
- DebugSerial.println(Save_Data.UTCTime);
- if (Save_Data.isUsefull)
- {
- Save_Data.isUsefull = false;
- DebugSerial.print("Save_Data.latitude = ");
- DebugSerial.println(Save_Data.latitude);
- DebugSerial.print("Save_Data.N_S = ");
- DebugSerial.println(Save_Data.N_S);
- DebugSerial.print("Save_Data.longitude = ");
- DebugSerial.println(Save_Data.longitude);
- DebugSerial.print("Save_Data.E_W = ");
- DebugSerial.println(Save_Data.E_W);
- digitalWrite(L, !digitalRead(L));//發送一組數據翻轉一次
- }
- else
- {
- DebugSerial.println("GPS DATA is not usefull!");
- }
- }
- }
- void parseGpsBuffer()
- {
- char *subString;
- char *subStringNext;
- if (Save_Data.isGetData)
- {
- Save_Data.isGetData = false;
- DebugSerial.println("**************");
- DebugSerial.println(Save_Data.GPS_Buffer);
- for (int i = 0 ; i <= 6 ; i++)
- {
- if (i == 0)
- {
- if ((subString = strstr(Save_Data.GPS_Buffer, ",")) == NULL)
- errorLog(12); //解析錯誤
- }
- else
- {
- subString++;
- if ((subStringNext = strstr(subString, ",")) != NULL)
- {
- char usefullBuffer[2];
- switch (i)
- {
- case 1: memcpy(Save_Data.UTCTime, subString, subStringNext - subString); break; //獲取UTC時間
- case 2: memcpy(usefullBuffer, subString, subStringNext - subString); break; //獲取UTC時間
- case 3: memcpy(Save_Data.latitude, subString, subStringNext - subString); break; //獲取緯度信息
- case 4: memcpy(Save_Data.N_S, subString, subStringNext - subString); break; //獲取N/S
- case 5: memcpy(Save_Data.longitude, subString, subStringNext - subString); break; //獲取緯度信息
- case 6: memcpy(Save_Data.E_W, subString, subStringNext - subString); break; //獲取E/W
- default: break;
- }
- subString = subStringNext;
- Save_Data.isParseData = true;
- if (usefullBuffer[0] == 'A')
- Save_Data.isUsefull = true;
- else if (usefullBuffer[0] == 'V')
- Save_Data.isUsefull = false;
- }
- else
- {
- errorLog(13); //解析錯誤
- }
- }
- }
- }
- }
- void gpsRead() {
- while (GpsSerial.available())
- {
- gpsRxBuffer[gpsRxCount] = GpsSerial.read();
- if (gpsRxBuffer[gpsRxCount++] == '\n')
- {
- char* GPS_BufferHead;
- char* GPS_BufferTail;
- if ((GPS_BufferHead = strstr(gpsRxBuffer, "$GPRMC,")) != NULL || (GPS_BufferHead = strstr(gpsRxBuffer, "$GNRMC,")) != NULL )
- {
- if (((GPS_BufferTail = strstr(GPS_BufferHead, "\r\n")) != NULL) && (GPS_BufferTail > GPS_BufferHead))
- {
- memcpy(Save_Data.GPS_Buffer, GPS_BufferHead, GPS_BufferTail - GPS_BufferHead);
- Save_Data.isGetData = true;
- clrGpsRxBuffer();
- }
- }
- clrGpsRxBuffer();
- }
- if (gpsRxCount == gpsRxBufferLength)clrGpsRxBuffer();
- }
- }
- void clrGpsRxBuffer(void)
- {
- memset(gpsRxBuffer, 0, gpsRxBufferLength); //清空
- gpsRxCount = 0;
- }
- unsigned int sendCommand(char *Command, char *Response, unsigned long Timeout, unsigned char Retry)
- {
- clrGprsRxBuffer();
- for (unsigned char n = 0; n < Retry; n++)
- {
- DebugSerial.print("\r\n---------send AT Command:---------\r\n");
- DebugSerial.write(Command);
- GprsSerail.write(Command);
- Time_Cont = 0;
- while (Time_Cont < Timeout)
- {
- gprsReadBuffer();
- if (strstr(gprsRxBuffer, Response) != NULL)
- {
- DebugSerial.print("\r\n==========receive AT Command:==========\r\n");
- DebugSerial.print(gprsRxBuffer); //輸出接收到的信息
- clrGprsRxBuffer();
- return Success;
- }
- }
- Time_Cont = 0;
- }
- DebugSerial.print("\r\n==========receive AT Command:==========\r\n");
- DebugSerial.print(gprsRxBuffer);//輸出接收到的信息
- clrGprsRxBuffer();
- return Failure;
- }
- unsigned int sendCommandReceive2Keyword(char *Command, char *Response, char *Response2, unsigned long Timeout, unsigned char Retry)
- {
- clrGprsRxBuffer();
- for (unsigned char n = 0; n < Retry; n++)
- {
- DebugSerial.print("\r\n---------send AT Command:---------\r\n");
- DebugSerial.write(Command);
- GprsSerail.write(Command);
- Time_Cont = 0;
- while (Time_Cont < Timeout)
- {
- gprsReadBuffer();
- if (strstr(gprsRxBuffer, Response) != NULL && strstr(gprsRxBuffer, Response2) != NULL)
- {
- DebugSerial.print("\r\n==========receive AT Command:==========\r\n");
- DebugSerial.print(gprsRxBuffer); //輸出接收到的信息
- clrGprsRxBuffer();
- return Success;
- }
- }
- Time_Cont = 0;
- }
- DebugSerial.print("\r\n==========receive AT Command:==========\r\n");
- DebugSerial.print(gprsRxBuffer);//輸出接收到的信息
- clrGprsRxBuffer();
- return Failure;
- }
- void Timer1_handler(void)
- {
- Time_Cont++;
- }
- void gprsReadBuffer() {
- while (GprsSerail.available())
- {
- gprsRxBuffer[gprsBufferCount++] = GprsSerail.read();
- if (gprsBufferCount == gprsRxBufferLength)clrGprsRxBuffer();
- }
- }
- void clrGprsRxBuffer(void)
- {
- memset(gprsRxBuffer, 0, gprsRxBufferLength); //清空
- gprsBufferCount = 0;
- }
復制代碼
所有資料51hei提供下載:
ARDUINO例程GPRS&GPS.zip
(37.49 KB, 下載次數: 43)
2018-11-27 23:04 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|