自己弄來玩一下,交流交流
IMG_20190114_161656.jpg (7.77 MB, 下載次數: 84)
下載附件
2019-3-12 16:39 上傳
單片機源程序如下:
- //此處為了兼容其他的多串口Arduino板子
- #define GpsSerial Serial
- #define DebugSerial Serial//用的是同一串口
- #include "U8glib.h"
- int L = 13; //LED指示燈引腳
- U8GLIB_SSD1306_128X64 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
- struct
- {
- char GPS_Buffer[80];
- bool isGetData; //是否獲取到GPS數據
- bool isParseData; //是否解析完成
- char UTCT[11]; //UTC時間
- char weidu[11]; //緯度
- char N_S[2]; //N/S
- char jingdu[12]; //經度
- char E_W[2]; //E/W
- bool isUsefull; //定位信息是否有效
- } Save_Data;
- const unsigned int gpsRxBufferLength = 600;
- char gpsRxBuffer[gpsRxBufferLength];
- unsigned int ii = 0;
- void setup() //初始化內容
- {
- GpsSerial.begin(9600); //定義波特率9600,和我們店鋪的GPS模塊輸出的波特率一致
- DebugSerial.begin(9600);
- DebugSerial.println("GPS information");
- DebugSerial.println("Please wating...");
- Save_Data.isGetData = false;
- Save_Data.isParseData = false;
- Save_Data.isUsefull = false;
- }
- void loop() //主循環
- {
- gpsRead(); //獲取GPS數據
- parseGpsBuffer();//解析GPS數據
- printGpsBuffer();//輸出解析后的數據
- // DebugSerial.println("\r\n\r\nloop\r\n\r\n");
- // picture loop
- u8g.firstPage();
- do {
- draw();
- } while( u8g.nextPage() );
-
- // rebuild the picture after some delay
- delay(5000);
- }
- void draw(void) {
- // graphic commands to redraw the complete screen should be placed here
- // u8g.setFont(u8g_font_unifont);
- //u8g.setPrintPos(0, 20);
- // call procedure from base class, http://arduino.cc/en/Serial/Print
- //u8g.print("Hello World!");
- u8g.setFont(u8g_font_unifont);
- u8g.setPrintPos(0, 10);
- u8g.print("UTCT = ");
- u8g.setPrintPos(50, 10);
- u8g.print(Save_Data.UTCT);
-
- u8g.setFont(u8g_font_unifont);
- u8g.setPrintPos(0, 20);
- u8g.print("weidu = ");
- u8g.setPrintPos(65, 20);
- u8g.print(Save_Data.weidu);
-
- u8g.setFont(u8g_font_unifont);
- u8g.setPrintPos(0, 30);
- u8g.print("N_S = ");
- u8g.setPrintPos(45, 30);
- u8g.print(Save_Data.N_S);
-
- u8g.setFont(u8g_font_unifont);
- u8g.setPrintPos(0, 40);
- u8g.print("jingdu = ");
- u8g.setPrintPos(65, 40);
- u8g.print(Save_Data.jingdu);
-
- u8g.setFont(u8g_font_unifont);
- u8g.setPrintPos(0, 50);
- u8g.print("E_W = ");
- u8g.setPrintPos(45, 50);
- u8g.print(Save_Data.E_W);
- u8g.setFont(u8g_font_unifont);
- u8g.setPrintPos(5, 60);
- u8g.print("GPS Information ");
-
- }
- void errorLog(int num)
- {
- DebugSerial.print("ERROR");
- DebugSerial.println(num);
- while (1)
- {
- digitalWrite(L, HIGH);
- delay(300);
- digitalWrite(L, LOW);
- delay(300);
- }
- }
- void printGpsBuffer()//輸出解析后的數據
- {
- if (Save_Data.isParseData)
- {
- Save_Data.isParseData = false;
-
- DebugSerial.print("Save_Data.UTCT = ");
- DebugSerial.println(Save_Data.UTCT);
-
-
-
-
-
- if(Save_Data.isUsefull)
- {
- Save_Data.isUsefull = false;
-
-
- DebugSerial.print("Save_Data.weidu = ");
- DebugSerial.println(Save_Data.weidu);
- DebugSerial.print("Save_Data.N_S = ");
- DebugSerial.println(Save_Data.N_S);
- DebugSerial.print("Save_Data.jingdu = ");
- DebugSerial.println(Save_Data.jingdu);
- DebugSerial.print("Save_Data.E_W = ");
- DebugSerial.println(Save_Data.E_W);
-
- }
- else
- {
- DebugSerial.println("data is wrong");
-
-
-
- }
- }
- }
- void parseGpsBuffer()//解析GPS數據
- {
- 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(1); //解析錯誤
- }
- else
- {
- subString++;
- if ((subStringNext = strstr(subString, ",")) != NULL)
- {
- char usefullBuffer[2];
- switch(i)
- {
- case 1:memcpy(Save_Data.UTCT, subString, subStringNext - subString);break; //獲取UTC時間
- case 2:memcpy(usefullBuffer, subString, subStringNext - subString);break; //獲取UTC時間
- case 3:memcpy(Save_Data.weidu, subString, subStringNext - subString);break; //獲取緯度信息
- case 4:memcpy(Save_Data.N_S, subString, subStringNext - subString);break; //獲取N/S
- case 5:memcpy(Save_Data.jingdu, 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(2); //解析錯誤
- }
- }
- }
- }
- }
- void gpsRead() //獲取GPS數據
- {
- while (GpsSerial.available())
- {
- gpsRxBuffer[ii++] = GpsSerial.read();
- if (ii == gpsRxBufferLength)clrGpsRxBuffer();
- }
- 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))//"\r\n"回車換行的符號
- {
- memcpy(Save_Data.GPS_Buffer, GPS_BufferHead, GPS_BufferTail - GPS_BufferHead);
- Save_Data.isGetData = true;
- clrGpsRxBuffer();
- }
- }
- }
- void clrGpsRxBuffer(void)
- {
- memset(gpsRxBuffer, 0, gpsRxBufferLength); //清空
- ii = 0;
- }
復制代碼
所有資料51hei提供下載:
程序.rar
(2.26 KB, 下載次數: 36)
2019-3-12 16:39 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|