• ARDUINO解析GPS数据,读取出来GPRMC帧数据


    测试板子使用ARDUINO MEGA2560

    #include <TimerOne.h>
    
    #define GPSSerial Serial1
    #define DebugSerial Serial
    
    const unsigned int bufferLength = 600;
    char RxBuffer[bufferLength];
    unsigned int ii = 0;
    
    char EER_GPS_Buffer[24] = {"$GPRMC,,V,,,,,,,,,,N*7F"};
    
    struct
    {
    	unsigned char CMD;
    	unsigned int LengthA;
    	char fixed[20];
    	unsigned char id_length;
    	char id[20];
    	unsigned char LengthB1;
    	unsigned char LengthB2;
    	char api_key[50];
    } login;
    
    struct
    {
    	unsigned char CMD;
    	unsigned char LengthA;
    	unsigned char mark;
    	unsigned char type;
    	unsigned char LengthB1;
    	unsigned char LengthB2;
    	char streamA[24];
    	char id[20];
    	char streamB[27];
    	char GPS_Buffer[150];
    	char streamC[7];
    } Save_Data;
    
    void setup(){
    	GPSSerial.begin(9600);
    	DebugSerial.begin(9600);
    
    
    	Timer1.initialize(1000);
    	Timer1.attachInterrupt(Timer1_handler);
    
    	DebugSerial.println("setup end!");
    }
    
    void loop(){
    	DebugSerial.println("loop start!");
    	getGPSData();
    	DebugSerial.println("loop end!");
    }
    
    unsigned long  Time_Cont = 0;
    void Timer1_handler(void)
    {
    	Time_Cont++;
    }
    
    void getGPSData(){
    	char *GPS_BufferHead, *GPS_BufferTail;
    
    	clrRxBuffer();
    
    	Time_Cont = 0;
    	while (Time_Cont < 2000)
    	{
    		readBuffer();
    
    		if ((GPS_BufferHead = strstr(RxBuffer, "$GPRMC,")) != NULL)
    		{
    			if ((GPS_BufferTail = strstr(GPS_BufferHead, "
    ")) != NULL)
    			{
    				if(GPS_BufferTail > GPS_BufferHead)
    				{
    					memcpy(Save_Data.GPS_Buffer, GPS_BufferHead, GPS_BufferTail - GPS_BufferHead);
    
    					DebugSerial.println("-----1------");
    					DebugSerial.println(Save_Data.GPS_Buffer);
    					break;
    					clrRxBuffer();
    				}
    			}
    
    		}		
    	}
    	if(Time_Cont >= 2000)
    	{
    		memcpy(Save_Data.GPS_Buffer, EER_GPS_Buffer, 24);	//输出错误信息	
    	}
    	DebugSerial.println("-----2------");
    	DebugSerial.println(Save_Data.GPS_Buffer);
    
    	memset(Save_Data.GPS_Buffer, 0, sizeof Save_Data.GPS_Buffer);	//使用后清空数据
    	DebugSerial.println("-----3------");
    	DebugSerial.println(Save_Data.GPS_Buffer);
    	clrRxBuffer();
    }
    
    void readBuffer(){
    	while (GPSSerial.available())
    	{
    		RxBuffer[ii++] = GPSSerial.read();
    		if (ii == bufferLength)clrRxBuffer();
    	}
    }
    
    void clrRxBuffer(void)
    {
    	memset(RxBuffer, 0, bufferLength);		//清空
    	ii = 0;
    }
    
  • 相关阅读:
    spring
    23种设计模式
    get getline
    ping
    Android四大组件
    C++数据结构
    玩转windows便签
    [JavaScript]再谈 this
    [JavaScript]面向对象编程浅析之XJB讲
    [JavaScript]MVC浅析
  • 原文地址:https://www.cnblogs.com/Mysterious/p/5724220.html
Copyright © 2020-2023  润新知