热烈祝贺台州朗动科技的站长论坛隆重上线!(2012-05-28)    热烈庆祝伟大的祖国60周年生日 点击进来我们一起为她祝福吧(2009-09-26)    站长论坛禁止发布广告,一经发现立即删除。谢谢各位合作!.(2009-08-08)    热烈祝贺台州网址导航全面升级,全新版本上线!希望各位一如既往地支持台州网址导航的发展.(2009-03-28)    台州站长论坛恭祝各位新年快乐,牛年行大运!(2009-01-24)    台州Link正式更名为台州网址导航,专业做以台州网址为主的网址导航!(2008-05-23)    热烈祝贺台州Link资讯改名为中国站长资讯!希望在以后日子里得到大家的大力支持和帮助!(2008-04-10)    热烈祝贺台州Link论坛改名为台州站长论坛!希望大家继续支持和鼓励!(2008-04-10)    台州站长论坛原[社会琐碎]版块更名为[生活百科]版块!(2007-09-05)    特此通知:新台州站长论坛的数据信息全部升级成功!">特此通知:新台州站长论坛的数据信息全部升级成功!(2007-09-01)    台州站长论坛对未通过验证的会员进行合理的清除,请您谅解(2007-08-30)    台州网址导航|上网导航诚邀世界各地的网站友情链接和友谊联盟,共同引领网站导航、前进!(2007-08-30)    禁止发广告之类的帖,已发现立即删除!(2007-08-30)    希望各位上传与下载有用资源和最新信息(2007-08-30)    热烈祝贺台州站长论坛全面升级成功,全新上线!(2007-08-30)    
便民网址导航,轻松网上冲浪。
台州维博网络专业开发网站门户平台系统
您当前的位置: 首页 » Linux编程开发 » Linux串口读取GPS数据

Linux串口读取GPS数据

论坛链接
  • Linux串口读取GPS数据
  • 发布时间:2008-08-24 17:07:24    浏览数:7791    发布者:dingjianping    设置字体【   
一、相关概念

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);

}

五、相关资料

1.GPGGA详解
http://hi.baidu.com/xydjh/blog/item/b0caa1433902ab1073f05dc8.html

2.可参考的代码
http://bbs.tongji.net/viewthread.php?tid=562733
娱乐休闲专区A 影视预告B 音乐咖啡C 英语阶梯D 生活百科
网页编程专区E AMPZF HTMLG CSSH JSI ASPJ PHPK JSPL MySQLM AJAX
Linux技术区 N 系统管理O 服务器架设P 网络/硬件Q 编程序开发R 内核/嵌入
管理中心专区S 发布网址T 版主议事U 事务处理