感谢支持
我们一直在努力

Linux串口读取GPS数据

‍一、相关概念


1.GPS(Global Positioning System):全球卫星定位系统
美国的24颗卫星不停地给地面发GPS信号,只要有一台GPS接收设备,就能定位出你所在的位置高度和速度了,它与电子地图的结合就是通常所说的GPS功能


二、连接方式


1.串口:计算机通常通过串口读取gps数据(蓝牙的gps也使用虚拟串口)


2.步骤:


1)普通串口设备
打开串口->设置串口->读取数据->恢复串口->关闭串口


2)蓝牙设备
开启蓝牙->与gps设备连接->打开串口->读取数据->关闭串口->与gps设备断开->关闭蓝牙


3)注意
连接gps蓝牙设备如需要连接密码,设置为0000(蓝牙默认密码)
用蓝牙gps设备一般不用对串口进行设置


三、gps数据格式


1.从串口中读出的是文本数据,每次读出一行,一般情况下,一秒种能收到多行数据


2.有效数据以$GP开头,分为$GPGGA、$GPGSA、$GPGSV、$GPRMC…


3. $GPGGA 是GPS定位的主要数据,通过解析它得到经度、纬度、海拔高度、时间、卫星使用情况等基本信息,其中每项用逗号分隔,共十四个逗号,举例如下:
$GPGGA,064746.000,4925.4895,N,00103.9255,E,1,05,2.1,-68.0,M,47.1,M,,0000*4F
$GPGGA(语句标识头),064746.000(UTC时间),4925.4895(纬度),N(纬度半球),00103.9255(经度),E(经度半球),1(定位质量指示),05(使用卫星数量),2.1(水平精确度),-68.0(海拔高度),M(高度单位),47.1(大地水准面高度),M(高度单位),(差分 GPS数据期限),0000(差分参考基站标号)*4F(校验)(结束标记回车换行)


四、例程


1.功能描述
假设蓝牙模块与gps已连接成功,蓝牙的虚拟串口设备是ttyB2
实现从蓝牙设备连接读取100条数据,解析后(经度/纬度/海拔/卫星个数)显示出来


2.代码


#include


#include


#include


#include


#include


#include


 


void parseData(char *buf)


{


int ret, nQ, nN, nB, nC;


char cX, cY, cM1, cM2;


float fTime, fX, fY, fP, fH, fB, fD;


 


if (buf == NULL)


return;


ret = sscanf(buf,


“$GPGGA,%f,%f,%c,%f,%c,%d,%02d,%f,%f,%c,%f,%c,%f,%04d%02x”,


&fTime, &fX, &cX, &fY, &cY, &nQ, &nN, &fP, &fH, &cM1, &fB,


&cM2, &fD, &nB, &nC);


printf(“x: %c %f, y: %c %f, h %f, satellite: %d\n”,


cX, fX, cY, fY, fH, nN);


}


 


int main(int argc, char **argv)


{


int fd, i, ret;


char buf[1024] =


“$GPGGA,064746.000,4925.4895,N,00103.99255,E,1,05,2.1,-68.0,M,47.1,M,,0000*4F\r\n”; // 此处赋值用于测试


 


if ((fd = open(“/dev/ttyB2”, O_RDWR)) == -1)


return -1;


// set fd: tcsetattr… 直接连接串口的设备需要在此设置波特率


for (i = 0; i < 100; i++)


{


ret = read(fd, buf, 1024);


if (ret > 1)


{


if (strstr(buf, “GPGGA”) != NULL)


parseData(buf);


}


}


// restore fd: tcsetattr… 直接连接串口的设备需要在此恢复波特率


close(fd);


}

赞(0) 打赏
转载请注明出处:服务器评测 » Linux串口读取GPS数据
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏