Linkit ONE开发板实验03-串口打印GPS数据
来源:互联网 发布:java安装在d盘教程 编辑:程序博客网 时间:2024/05/22 00:35
Linkit ONE开发板GPS相关的API官方文档请自行查阅,这里只是简单解析下GPRMC中的数据。
读取GPS并进行简易解析的代码如下所示:
#include <string.h>#include <LGPS.h>#define LED_GPIO_PIN 13struct gps_info { long longitude; long latitude; int moveDirection; int speed; int satNum;};void setup() { // initialize LED pin as an output. pinMode(LED_GPIO_PIN, OUTPUT); //Setup Serial Port. Serial.begin(9600); Serial.println("Linkit ONE Board"); //print with line change. gpsPowerOn();}void ledOn() { digitalWrite(LED_GPIO_PIN, HIGH); // turn the LED on (HIGH is the voltage level)}void ledOff() { digitalWrite(LED_GPIO_PIN, LOW); // turn the LED off by making the voltage LOW}void gpsPowerOn() { LGPS.powerOn();}void gpsPowerOff() { LGPS.powerOff();}void gpsGetData() { gpsSentenceInfoStruct info; LGPS.getData(&info); Serial.print((char*)info.GPGGA); Serial.print((char*)info.GPGSA); Serial.print((char*)info.GPRMC); Serial.print((char*)info.GPVTG); Serial.print((char*)info.GPGSV); Serial.print((char*)info.GLGSV); Serial.print((char*)info.BDGSV); Serial.print((char*)info.BDGSA); Serial.println(" "); parseGPRMC((char*)info.GPRMC);}/*RPRMC(Recommended Minimum Specific GPS/TRANSIT Data) Format:$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh<CR><LF> 字段 0:$GPRMC,语句ID,表明该语句为Recommended Minimum Specific GPS/TRANSIT Data(RMC)推荐最小定位信息 字段 1:UTC时间,hhmmss.sss格式 字段 2:状态,A=定位,V=未定位 字段 3:纬度ddmm.mmmm,度分格式(前导位数不足则补0) 字段 4:纬度N(北纬)或S(南纬) 字段 5:经度dddmm.mmmm,度分格式(前导位数不足则补0) 字段 6:经度E(东经)或W(西经) 字段 7:速度,节,Knots(一节也是1.852千米/小时) 字段 8:方位角,度(二维方向指向,相当于二维罗盘) 字段 9:UTC日期,DDMMYY格式 字段10:磁偏角,(000 - 180)度(前导位数不足则补0) 字段11:磁偏角方向,E=东,W=西 字段12:模式,A=自动,D=差分,E=估测,N=数据无效(3.0协议内容) 字段13:校验值*/void parseGPRMC(char* gprmcStr) { char* p = NULL; char* pData = gprmcStr; char* spliter = ","; int spliterPos[12]; char* headStr = "$GPRMC"; // p = strstr(gprmcStr, headStr); if (NULL == p) { Serial.println("No $GPRMC"); return; } // int i = 0; for( i = 0; i < 12; i++) { p = strstr(pData, spliter); spliterPos[i] = p - gprmcStr; pData = p + 1; //Serial.println(p); } //01.UTC Time. char utcTime[16] = {0}; memcpy(utcTime, gprmcStr + 1 + spliterPos[0], spliterPos[1] - spliterPos[0] - 1); Serial.print("utctime:"); Serial.println(utcTime); //02.Locate Status char gpsAvailable = 'V'; if (0 == strncmp(gprmcStr + 1 + spliterPos[1], "A", 1)) { gpsAvailable = 'A'; } Serial.print("gpsAvailable:"); Serial.println(gpsAvailable); //03~04. GPS Latitude char gpsLat[16] = {0}; memcpy(gpsLat, gprmcStr + 1 + spliterPos[2], spliterPos[3] - spliterPos[2] - 1); if (0 == strncmp(gprmcStr + 1 + spliterPos[3], "N", 1)) { Serial.println("N"); } else { Serial.println("S"); } Serial.print("Latitude:"); Serial.println(gpsLat); //05~06. GPS Longitude char gpsLon[16] = {0}; memcpy(gpsLon, gprmcStr + 1 + spliterPos[4], spliterPos[5] - spliterPos[4] - 1); if (0 == strncmp(gprmcStr + 1 + spliterPos[5], "E", 1)) { Serial.println("E"); } else { Serial.println("W"); } Serial.print("Longitude:"); Serial.println(gpsLon); //07. Speed char gpsSpd[16] = {0}; memcpy(gpsSpd, gprmcStr + 1 + spliterPos[6], spliterPos[7] - spliterPos[6] - 1); Serial.print("Speed:"); Serial.println(gpsSpd); //08. Direction char gpsDir[16] = {0}; memcpy(gpsDir, gprmcStr + 1 + spliterPos[7], spliterPos[8] - spliterPos[7] - 1); Serial.print("Direction:"); Serial.println(gpsDir); //09. UTC date char gpsDate[16] = {0}; memcpy(gpsDate, gprmcStr + 1 + spliterPos[8], spliterPos[9] - spliterPos[8] - 1); Serial.print("UTC Date:"); Serial.println(gpsDate); Serial.println(" ");}void loop() { gpsGetData(); delay(200); ledOn(); delay(800); ledOff();}
其中GPS模块的开启和关闭由函数gpsPowerOn()和函数gpsPowerOff()控制。
一旦开启了GPS,则可以通过gpsGetDate()函数来获取GPS数据了。Linkit ONE SDK自己定义了一个GPS袁术数据的数据结构:
typedef struct { unsigned char GPGGA[GPS_MAX_GPGGA_SENTENCE_LENGTH+1]; unsigned char GPGSA[GPS_MAX_GPGSA_SENTENCE_LENGTH+1]; unsigned char GPRMC[GPS_MAX_GPRMC_SENTENCE_LENGTH+1]; unsigned char GPVTG[GPS_MAX_GPVTG_SENTENCE_LENGTH+1]; unsigned char GPGSV[GPS_MAX_GPGSV_SENTENCE_LENGTH+1]; unsigned char GLGSV[GPS_MAX_GLGSV_SENTENCE_LENGTH+1]; unsigned char GLGSA[GPS_MAX_GLGSA_SENTENCE_LENGTH+1]; unsigned char BDGSV[GPS_MAX_BDGSV_SENTENCE_LENGTH+1]; unsigned char BDGSA[GPS_MAX_BDGSA_SENTENCE_LENGTH+1];} gpsSentenceInfoStruct;
我们通过API函数LGPS.getData()函数获取到的GPS数据则为上面的结构体。
获取到这个结构体后我们就可以通过解析其中的数据来获取我们需要的GPS信息了,上面的例子以解析GPRMC数据为例。解析的思路为:找出字符串中的所有分隔符(',')的位置,然后根据NMEA-0183文档的定义来把其中的各个字段读出来。根据自己定义个GPS的数据结构可能要对获取到的字符串做一些数据类型转换。
最后这里给出本例子的一个运行结果:
Linkit ONE Board No $GPRMC No $GPRMC$GPGGA,093351.319,2232.3497,N,11354.7916,E,0,0,,316.4,M,-2.7,M,,*5E$GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,1.00*01$GPRMC,093351.319,V,2232.3497,N,11354.7916,E,0.000,0.00,221017,,,N*44$GPVTG,0.00,T,,M,0.000,N,0.000,K,N*32$GPGSV,2,1,5,21,57,235,,18,56,343,,32,18,275,,14,07,262,*48$GPGSV,2,2,5,193,,,*77$GLGSV,1,1,1*54 utctime:093351.319gpsAvailable:VNLatitude:2232.3497ELongitude:11354.7916Speed:0.000Direction:0.00UTC Date:221017
阅读全文
0 0
- Linkit ONE开发板实验03-串口打印GPS数据
- Linkit ONE开发板实验02-串口打印时间
- Linkit ONE开发板实验05-SD卡存储GPS数据
- Linkit ONE开发板实验00-开发板简介
- Linkit ONE开发板实验01-闪灯程序
- Linkit ONE开发板实验04-SD卡操作
- linkit one学习笔记-开发板简介
- STM32开发板实现Pixhawk无人机GPS跟踪
- H9200M开发板实验文档
- MSP430F149小系统开发板实现RS232串口通信
- ARM9开发板实验笔记(1)
- contiki移植开发板实验框架
- Linux打印串口数据
- 串口打印数据输出
- MSP430F149小系统开发板实现USART数据接收中断
- GPS ONE
- Android模拟器读取GPS串口模拟器GPS数据
- GPS串口数据接收程序实例
- 基于java的设计模式(1)------策略模式
- 组合模式(Composite Pattern)——管理良好的集合
- Java并发性和多线程介绍、优缺点
- Java基础部分总结
- 导入Liferay项目
- Linkit ONE开发板实验03-串口打印GPS数据
- 20171022java学习iterator java 迭代遍历
- 网络通信模型之BIO与NIO、AIO的区别
- 打开安卓项目报错Failed to load E:\android\android-sdk-windows\build-tools\26.0.2\lib\dx.ja Unable to build:
- 数据结构:职工信息的综合运算
- [BZOJ2456]Mode-栈思想
- 前端基础 JavaScript Function、BOM对象 笔记
- ajax冲突
- 编译并裁剪boost1.65