标题:
发个GPRS打电话和GPS收卫星的Arduino例程
[打印本页]
作者:
冰冰洁洁
时间:
2018-11-27 23:04
标题:
发个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
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
作者:
qq420345437
时间:
2019-6-4 13:08
感谢分享!
作者:
qq420345437
时间:
2019-6-4 13:09
非常好的实例,谢谢分享!
作者:
cml1264611
时间:
2019-12-27 09:43
DebugSerial.print("\r\n==========receive AT Command:==========\r\n");
DebugSerial.print(gprsRxBuffer); //输出接收到的信息
软串口的信息打印在串口监控器上能看到吗
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1