打印
[ZLG-ARM]

嵌入式Linux平台的GPS数据采集研究

[复制链接]
1693|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
diny|  楼主 | 2011-1-20 16:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
GPS数据的采集  嵌入式Linux平台下的GPS数据采集涉及到Linux串口编程技术,因此首先介绍Linux串口编程的相关知识,再给出一个简单的代码段,实现GPS定位信息的获取.
  1 Linux串口通信
  在Linux操作系统中,所有的设备都是被当作文件来进行操作的,所有的设备以设备文件的形式存储在目录/dev/下,串口的设备文件为/dev/ttyS*,其中,ttyS0为串口一,ttyS1为串口二,以此类推.
  Linux下定义了一个查询和操纵终端的标准接口,该接口被称为termios,在系统头文件<termios.h>中定义.它包括一个数据 结构和一系列操纵这些数据结构的函数组成.有关串口的所有参数配置都保存在接口termios的结构STruct termios中,该结构定义如下:
  struet termios
  {
  unsigned short c_iflag; /*输入模式标志*/
  unsigned short c_oflag; /*输出模式标志*/
  unsigned short c_cflag; /*控制模式标志*/
  unsigned short c_lflag; /本地模式标志/
  unsigned char c_line; /*控制协议*/
  unsigned char c_cc[NCCS] /*控制字符*/
  }
  其中的c_flag成员是用来控制输入处理选项的,它将影响到终端驱动程序在把输入发送给程序前是否对其进行处理,及怎样对其进行处理.c_oflag成 员是用来控制输出数据的处理,并决定在发送输出数据到显示屏和其他输出设备之前,终端驱动程序是否以及如何来处理它们.c_oflag用于存放各种决定终 端设备硬件特性的控制标志.存放在c_lflag中的本地模式标志用来操纵这样的一些终端特性,比如是否将输入字符显示到显示屏上.c_cc包含了特殊字 符序列的值,比如^(退出)和^H(删除),以及它们所代表的操作.除了上面的这个包含串口参数配置的数据结构之外,termios中还包含许多控制串口 特性的函数.其中基本的函数如:tcgetattr()和tcsetattr().tcgetattr()用来初始化一个termios数据结构,之后可 使用其它的函数来操纵由tcgetattr()返回的数据结构.完成这些操作后,使用tcsetattr()来更新串口的设置.
  其它对串口的打开、关闭、读取功能与其它的文件操作一致,使用open()、close()、read()函数完成.
  在采集GPS数据的过程中,需对所读取的数据进行鉴别区分,只选取其中有用的信息进行处理而忽略其余的信息,这需要根据NMEA0183协议中规定的语句格式来进行筛选.
  2 GPs中定位信息的获取举例
  在嵌入式Linux系统中进行串口编程,读取GPS数据的定位信息.
  /*包含必要的头文件*/
  #include <termios.h>
  #include <stdio.h>
  #include <unistd.h>
  #include <fcntl.h>
  /*打开串口设备*/
  int fd=open("/dev/ttyS0",O_RDWR|O_NOCTTY)/* O_RDWR表示以读写方式打开,O_NOCTTY表示串口不是控制终端*/
  struet termios old_opTIONs,new_options
  /*定义两个termios结构,其中,old_options用于保存原有的设备工作方式,new_options用于设置新的设备工作方式 */
  tcgetattr(fd,&old_options) /*获取当前设备方式*/
  /*设置结构体new_options中的c_jflag、c_oflag、c_cflag、c_lflag和c_cc,再用cfsetispeed()和cfsetospeed()函数设置波特率 */
  new_options.c_cflag &= PARENB; /*无奇偶校验位*/
  new_options.c_cflag &= CSIZE; /*不隐藏数据位*/
  new_options.c_cflag &= CSTOPB; /*无停止位*/
  new_options.c_cflag |=CS8; /*8位数据位*/
  new_options.c_oflag=ICRNL; /*将输出的CR转换成NL*/
  new_options.c_lflag=(ICANON | ECHO | ECHOE | SIG); /*选择原始输入模式,使输入字符与接收到的字符相同*/
  new_options.c_cc[VTIME]=10; /*设置超时计时器为10x0.1=1秒*/
  new_options.c_ce[VMIN]=76; /*设置读取的最小字符数为76个*/
  cfsetispeed(&new_options,B4800); /*设置输入波特率为4800*/
  cfsetospeed(&new_options,B4800); /*设置输出波特率为4800*/
  tcflush(fd,TCIOFLUSH); /*丢弃队列中尚未传送或接收的数据*/
  tcsetattr(fd,TCSANOW,&new_options); /*设置新的设备方式*/
  /*完成终端的设置后,处理串口设备的GPS数据输入,从中选取有用的定位信息*/
  int nByteRead =read(fd,buf,LENGTH);
  if((buf[O]==$)&&(buf[3]==R)&&(buf[4]==M)&&(buf[5]==C))
  /*检查语句串头若为RMC则表示此语句为定位语句,选取此语句内容,其余忽略*/
  {
  /*检验校验和,如果校验和正确继续,否则返回*/
  if(buf= ,){/*提取并分解各逗号间的数据并进行处理或发送至其它应用程序*/}
  }
  以上代码只是GPS输出数据中定位信息提取的关键代码,要完成进一步的完整功能还需编写大量的代码,这里就不一一列出.
  3 结束语
  GPS设备与嵌入式Linux平台之间的数据是实现嵌入式GIS定位功能的基础,随着基于嵌入式Linux的嵌入式GIS的应用日益广泛,GPS数据的采 集方法成为一项基础性工作,本文针对GPS数据的采集,详细分析了目前普遍采用的NMEA0183协议,并在此基础上对嵌入式Linux环境下的GPS数 据采集进行举例分析.

相关帖子

沙发
coco11| | 2011-2-16 22:45 | 只看该作者
看得我眼睛累死了。

使用特权

评论回复
板凳
bit6019| | 2011-2-17 12:55 | 只看该作者
实际开发远不止这些内容

使用特权

评论回复
地板
七叶一枝花| | 2011-2-17 22:39 | 只看该作者
确实,这只是皮毛而已,不过还是谢谢楼主的分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

482

帖子

2

粉丝