久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
發(fā)個GPRS打電話和GPS收衛(wèi)星的Arduino例程
[打印本頁]
作者:
冰冰潔潔
時間:
2018-11-27 23:04
標題:
發(fā)個GPRS打電話和GPS收衛(wèi)星的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
可不接的線(用于測試調(diào)試信息)
USB-TTL模塊 ARDUINO UNO
GND-----> GND
RXD-----> 11
TXD-----> 10
0.png
(48.09 KB, 下載次數(shù): 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數(shù)據(jù)
bool isParseData; //是否解析完成
char UTCTime[11]; //UTC時間
char latitude[11]; //緯度
char N_S[2]; //N/S
char longitude[12]; //經(jīng)度
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; //定時器計數(shù)器
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數(shù)據(jù)
parseGpsBuffer();//解析GPS數(shù)據(jù)
printGpsBuffer();//輸出解析后的數(shù)據(jù)
}
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));//發(fā)送一組數(shù)據(jù)翻轉(zhuǎn)一次
}
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, 下載次數(shù): 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); //輸出接收到的信息
軟串口的信息打印在串口監(jiān)控器上能看到嗎
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
亚洲一区二区在线
|
永久免费视频
|
一区二区播放
|
国产成人免费
|
国产一区二区观看
|
精品国产18久久久久久二百
|
亚洲在线一区二区
|
精品一区二区三区在线观看国产
|
久久国产区
|
81精品国产乱码久久久久久
|
中文一区二区
|
a级网站
|
日韩在线一区二区三区
|
香蕉av免费
|
成年免费大片黄在线观看一级
|
亚洲免费一区二区
|
中文字幕免费中文
|
免费在线精品视频
|
欧美激情 一区
|
国产成人在线视频
|
伊人免费视频二
|
九九视频网
|
国产精品中文在线
|
日韩中文在线
|
日韩中文字幕视频在线
|
欧洲精品久久久久毛片完整版
|
久久久精品国产
|
久热m3u8
|
天天操天天射综合
|
国产精品国产三级国产a
|
在线观看国产
|
精品久久久久久
|
日本精品视频在线
|
欧美日韩视频
|
日韩在线资源
|
久久亚洲一区二区三
|
亚洲人成一区二区三区性色
|
日韩在线电影
|
久久久新视频
|
九九热在线观看视频
|
日韩在线观看中文字幕
|