标题:
安信可A6A7模块资料及ARDUINO MEGA2560 GPS解析程序
[打印本页]
作者:
chenshao
时间:
2017-12-17 19:11
标题:
安信可A6A7模块资料及ARDUINO MEGA2560 GPS解析程序
0.jpg
(85.22 KB, 下载次数: 107)
下载附件
2017-12-17 20:43 上传
0.jpg
(31.88 KB, 下载次数: 88)
下载附件
2017-12-17 20:44 上传
全部资料51hei下载地址:
A7模块原理图.pdf
(315.26 KB, 下载次数: 17)
2017-12-17 19:08 上传
点击文件名下载附件
下载积分: 黑币 -5
A6模块原理图.pdf
(308.72 KB, 下载次数: 10)
2017-12-17 19:08 上传
点击文件名下载附件
下载积分: 黑币 -5
sscom33串口调试助手.zip
(341.93 KB, 下载次数: 9)
2017-12-17 19:08 上传
点击文件名下载附件
下载积分: 黑币 -5
A6A7用户手册 V1.2.pdf
(2.46 MB, 下载次数: 17)
2017-12-17 19:08 上传
点击文件名下载附件
下载积分: 黑币 -5
04.ARDUINO MEGA2560 GPS解析.zip
(2.93 KB, 下载次数: 30)
2017-12-17 19:09 上传
点击文件名下载附件
下载积分: 黑币 -5
ARDUINO源程序如下:
/*********************************************************************
作者:神秘藏宝室
本例程仅适用于在本店购买模块的用户使用,鄙视其它店铺的盗用行为
版权所有,盗版必究!!!
A6模块链接:
A6 GSM/GPRS模块:
接线方式
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)
{
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
作者:
stvea
时间:
2018-7-13 00:02
终于找到可以用的了
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1