基于uClinux的GPSOne/GPS双定位信息接收

发布者:chuyifei最新更新时间:2007-01-16 来源: eNet关键字:ARM7  芯片  I/O 手机看文章 扫描二维码
随时随地手机看文章
GPS是当前在导航系统中应用最广泛的定位技术之一,但GPS也有其自身的不足。例如,当GPS终端在建筑密集的地方或在高架桥底下等恶劣的地理位置时,定位信号比较容易丢失,往往难以获取有效的定位信息。由美国高通公司开发的GPSOne定位模块,提供的定位信号是基于网络与蜂窝的定位技术。即使在卫星信号不好的情况下,只要存在联通的网络信号,利用蜂窝定位技术,就可以较容易地获得定位信号。此信号可作为GPS信号丢失情况下的一种补偿信号。

GPSOne是传统GPS定位技术与CDMA网络技术巧妙结合的混合型定位技术,即GPSOne=AGPS+AFLT+CellID。它是第一种可以在室内稳定工作的基于GPS技术的解决方案,是唯一商用的GPS定位解决方案,同时也是目前世界上最经济有效的集成型无线GPS解决方案。利用GPSOne能够弥补GPS自身不足的这一特点,本导航系统的定位信息获取模块采用GPS和GPSOne双定位方案,以实现更精确、可靠的定位。该定位信息获取模块的硬件架构是ARM+GPS+GPSOne;CPU采用Philips公司LP系列的LPC2210的ARM7芯片,操作系统采用uClinux。本系统获取定位信息的关键,在于编写好串口通信程序,从而更好地实时接收和处理当前的位置信息。由于系统功能较为复杂,需要实现GUI界面交互、定位、报警、数据库查询、语音提示等多项功能,故对串口数据的接收,利用I/O复用机制进行处理更利于系统实现和管理。

1 uClinux串口编程操作方法

在Linux中,设备分为3类:字符设备、块设备和网络设备。uClinux用设备文件表示大部分I/O设备。文件系统提供了统一的接口来访问一般意义上的文件和设备文件。

系统串口COM1与COM2,分别对应uClinux系统的/dev/ttyS0、/dev/ttyS1两个串口设备文件。串口属于字符型设备,对串口的编程也就是对相应文件进行读/写、控制等操作。串口编程的基本步骤是:先打开串口,设置串口属性,然后进行收发数据,最后关闭串口。

(1) 打开串口
  通过使用标准的文件打开函数open,达到访问串口设备驱动的目的。例如,以读写的方式打开串口1,可用下面的方法实现:
  
  fd = open("/dev/ttyS0", O_RDWR);

(2)设置串口属性
  主要是设定结构体termios各成员的值。基本设置包括:波特率、数据位、校验位、停止位、输入和输出模式等。一般在设置时,先获取系统已有的串口属性,并在它的基础上进行修改。另外,设置时要用到系统预定义的宏。

(3) 收发数据
  uClinux下串口发送和接收数据,通过使用文件操作中的read和write的方法来实现。例如:

  write(fd, buffer ,Length);
  read(fd, buffer ,Length);

(4) 关闭串口
  关闭串口只须关闭已打开的串口文件描述符,如close(fd) ;

2 常用的几种I/O模型

通常在操作I/O时,会用到下面几种模型之一:阻塞型I/O、非阻塞型I/O和复用型I/O。下面以读取串口数据为例,简要说明它们的基本工作原理和特点。

2.1 阻塞型I/O

顾名思义,它以阻塞方式操作I/O,如图1所示。若一个进程以阻塞方式调用read函数读取串口数据,则该进程会一直睡眠在read系统调用上。此时系统内核会一直等待数据,直到串口有数据到达为止。当串口数据准备好后,内核就把数据从内核拷贝至用户空间;而当数据拷贝完成后,才唤醒串口读取进程,通知它读取数据报。


图1 阻塞I/O模型

2.2 非阻塞I/O

图2中,在非阻塞I/O模型下,I/O操作是即时完成的。当进程调用read函数时,设置了O_NONBLOCK标志,那么即使串口没有数据可读,read函数也会立即返回。此时其返回值为EAGAIN,表明串口数据未就绪。如果串口有数据可读,则read函数会读取该数据,并返回所读数据的长度。通常轮询I/O的方法就是采用这种模型来读取串口数据的,此时进程必须通过反复调用来检测是否有数据可读。如果轮询频率过低,则容易丢失数据;轮询频率过高,则占用太多处理器的处理周期。


图2 非阻塞I/O模型

2.3 I/O复用

上述两种I/O模型,是最常用的两种操作I/O的方式;但在面向较复杂、需要处理多个I/O的系统时,这两种模型存在着不足之处。例如:在应用进程中需要对多个I/O设备进行监听,当某个设备可读或可写时,进程能马上得知,并进行相关处理。这时若采用阻塞方式操作I/O,则进程会阻塞在某个设备的I/O读写操作上而不能适用于这种情况;若采用非阻塞方式,则往往需要定时或循环地探测所有设备,才作相应处理,这种作法相当耗费系统中央处理器的执行周期。可见,上述的两个I/O模型都不能满足这类应用,故此需要引入一种特别的I/O处理机制,即I/O复用。

所谓I/O复用,是指当一个或多个I/O条件(可读、能写或出现异常)满足时,进程能立即知道,从而正确并高效地对它们进行处理。

在uClinux下,系统提供select函数和poll函数,用来支持I/O复用的实现。如图3所示,若使用select的系统调用来查询是否有数据可读时,进程是在等待多个I/O描述接口的任一个变为可读,但此期间并不阻塞进程。当有数据报已准备好时,返回可读条件,并通知进程再次进行系统调用准备读取相应的I/O数据。此时内核就开始拷贝准备好的数据至用户空间,并返回指示进程处理数据报。


图3 I/O复用模型

与上面提及的两种I/O模型不同的是:在这个处理过程中,使用了两次系统调用来达到读取数据的目的。虽然两次系统调用的开销似乎更大,但它的最大好处在于能同时等待多个描述符准备好。因此select调用功能更多地是借助了内核来监听I/O设备描述符的。下面具体介绍select函数的功能及应用。

3 uClinux中基于select的I/O复用机制和工作原理

在系统存在多个输入或输出流但不希望其中任一个流被阻塞的场合,经常使用复用I/O的方法解决。uClinux中,用户程序多使用select机制实现I/O复用控制,select函数允许进程对一个或多个设备文件进行非阻塞的读或写操作。

select的函数定义于中,原型如下:

  int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

该函数允许进程指示内核等待多个事件中的任一个发生,并仅在一个或多个事件发生或经过某指定的时间后才唤醒进程。该函数的第1个参数n表示文件描述符集合中最大值再加1;第2个参数readfds,表示可读的文件描述符集合,用于查看是否有可读取数据;第3个参数writefds表示可写的文件描述符集合,用于查看是否能写入数据;第4个参数exceptfds用于异常控制;最后一个参数timeout决定了select将会阻塞多久才把控制权移交给调用它的进程。调用select之前,必须对此参数进行初始化。若timeout值为0,则select直接返回0。此时I/O操作没有等待就立即返回,相当于一种非阻塞I/O的调用。

在应用中,通常先调用select查看哪个I/O设备可读/写。如果没有可读/写的设备,并且没有设置超时返回功能,那么进程将阻塞在select调用上;如果有,则select函数返回,紧接着可通过测试参数readfds和writefds来确定哪个I/O设备可读或能写,而后以非阻塞方式操作该I/O设备,从而实现期望功能。

在实现select应用的过程中,还会使用到这些select相关接口:

  void FD_ZERO(fd_set *fdset);
  void FD_SET(int fd, fd_set *fdset);
  void FD_CLR(int fd, fd_set *fdset);
  int FD_ISSET(int fd, fd_set *fdset);

其中,fd_set表示设备文件描述符集合,fd表示设备文件描述符。FD_ZERO函数用于清除设备文件描述符集合所有元素;FD_SET函数用于把某个文件描述符添加至文件描述符集合;FD_CLR函数用于从文件描述符集合中删除某个文件描述符;而FD_ISSET用于检测设备文件描述符集合的某个文件描述符是否有效,有效则表示该位对应的设备有数据可读或可写。

4 轮询检测方法与select方法的比较

4.1 轮询检测方法

轮询检测方法是指对串口进行非阻塞的读写操作。当操作未成功时,让进程或线程挂起一段时间,然后再使用非阻塞调用来重新查询串口是否有可读/写数据。用此方法,相当于系统不断地对接收或者发送操作的执行结果进行探测,直到把数据发出去或者接收完成定量的数据,才退出此轮询循环。而对于接收与发送不确定哪个时刻会到达的情况,即随机性比较高的读/写操作,采用轮询方法会造成CPU资源浪费。如果轮询频率过低,则会使系统少接收一部分数据或接收过慢;反之,则接收方会因为等待太久而不能接收更多新的数据。轮询频率过高的情况,会让CPU过度频繁地查询串口状态,造成过多的耗用CPU执行周期,降低其利用率。

4.2 select机制能充分利用系统时间的原因

与频繁调用非阻塞读写函数来轮询监听I/O的方法相比, select调用允许用户把进程本身挂起来,同时使系统内核监听所要求的一组文件描述符的任何活动。只要确认在任何被监控的文件描述符上出现活动,select调用将返回指示该设备文件已经准备好的信息。这样就使进程能相对实时地监测到I/O设备上随机的变化,而不必由进程本身去探测输入数据是否准备好。

5 利用select I/O的机制实现GPS与GPSOne数据的接收

本文提出的基于GPS与GPSOne信号的双定位的解决方案,即对系统两个串口定位信号的监听与处理,充分利用uClinux下基于Select的I/O复用机制,更利于较复杂系统的控制和管理。

方案实现的程序流程如图4所示。


图4 双定位信息获取的程序流程

以下代码为使用Select I/O机制接收GPS信息和GPSOne信息的软件实现:

  int Maxfd = fd_gps>fd_gpsOne? fd_gps: fd_gpsOne;//得到串口描述符中较大的一个
  struct timeval tv;//定义超时控制结构
  fd_set fds; //文件描述符集合变量
  tv.tv_sec = 5;//设定超时值 5 s
  tv.tv_usec = 0;
  while(1){//通过GPSOne串口,发送GPSOne定位请求
    Rt = send_port (fd_gpsone, "AT+GPSSTRTr", strlen("AT+GPSSTRTr");
    if (Rt) == -1)
      printf("Error happened!");
    FD_ZERO (&fds);//初始化文件描述符集合
    FD_SET(*fd_gps, &fds);//设置文件描述符集合的相应位
    FD_SET(fd_gpsOne, &fds);//使用select,让内核开始监听GPSOne和GPS串口设备
    fd_sel = select((Maxfd)+1, &fds_gps, NULL, NULL, &tv);
    if (fd_sel < 0){
      printf("Error happened while receiving gps data.n");}
    else if (FD_ISSET(*fd_gps, &fds)){//若GPS串口设备有数据可读
      recv_len = recv_port(fd_gps, buf, 254);
      if (recv_len > 0){
        memcpy (gps_info, buf, recv_len);//信息保存到
        gps_info数组中gps_info_process(gps_info);//解析定位信息处理
      }
    }
    else if (FD_ISSET(*fd_gpsOne, &fds)){//若GPSOne串口设备有数据可读
      recv_len = recv_port(*fd_gpsOne, buf, 254);
      if (recv_len > 0){memcpy (gpsOne_info, buf, recv_len); //信息保存到gpsOne_info数组中
      gpsOne_info_process(gpsOne_info);//解析定位信息处理
      }
    }
    sleep(1);
  }

6 设计总结

本文详细说明了串口编程的基本方法和步骤,并提出一种基于select的I/O复用机制处理多个串口信息的方案,同时给出这种方案的具体实现。此方案具有较高的可靠性,保证了多个串口的信息可以很好地被接收和处理,而且不相互干扰,利于系统更好地管理多个文件设备。特别是在数据采集和数据传输领域中,select利用内核同时监听多个设备描述符机制,可以被广泛地应用于嵌入式系统多路I/O采集的设计中。

参考文献

[1] Kurt Wall. GNU/Linux编程指南[M].张辉,译. 北京:清华大学出版社,2005.
[2] Richard Stevens W. UNIX网络编程[M]. 第2版. 第1卷·套接口API和X/Open传输接口API.北京:清华大学出版社,1998:121131.
[3] 马忠梅,李善平,康慨,等. ARM&Linux嵌入式系统教程[M].北京:北京航空航天大学出版社,2005:255261.
[4] 周立功.ARM嵌入式系统实验教程(2).广州:广州周立功单片机发展有限公司,2005:213219.
[5] 邓滔,徐勇. GPS与嵌入式Linux平台串行通信研究[J]. 工业控制计算机,2005,18(1).

关键字:ARM7  芯片  I/O 引用地址:基于uClinux的GPSOne/GPS双定位信息接收

上一篇:关于嵌入式U盘读写器接口技术和系统设计
下一篇:嵌入式便携设备中电源管理的分析与研究

推荐阅读最新更新时间:2024-05-02 20:26

博通5代WiFi芯片 14大厂支持
    博通昨(17)日在台北正式发表其第5代WiFi(802.11ac)芯片,并已取得LG、华硕、华为、中兴、友讯、微软等14家业者携手推动、加速发展,博通行动无线事业群资深副总裁暨总经理Michael Hurlston指出,第5代WiFi最慢在2014年成为主流,另外甫推出的最新3G手机基频芯片已获TCL、三星等品牌客户采用,正积极向大陆市场发展。      无线网通芯片龙头博通2011年WiFi芯片全年出货量约10亿套,其中约有50%应用在行动装置市场,Michael Hurlston指出,第5代WiFi的成长动能也将来自行动装置,且驱动力因多元产品增加也将持续成长,另一方面,电视的无线传输是另一成长动力。      日前博通
[手机便携]
提升体验 手机DSP芯片你又了解多少?
随着智能手机的广泛普及,用户不仅要关注手机的外观设计,更加关注手机的硬件配置性能,听到最多的应该就是CPU这个词汇,但往往一些同样重要的芯片被人们所忽略,今天就为大家详解一个神秘且鲜为人知的DSP芯片。 虽然目前手机CPU足够强大,但智能手机所需要处理的任务也越来越多,这无疑将大大降低手机的流畅度,而专用芯片的加入可以有效地解决这个问 题,DSP就是这样一款专用芯片。DSP芯片也许并不如CPU那样广为人知,但它的确在智能手机中扮演着重要的角色,它可以带来更好地语音、音频、图像体 验,这绝对会提升手机单项功能的能力,让手机运行速度更快。 DSP是Digital Signal Processor的简称,即数字信号处理器,
[手机便携]
收购杰发科技推出ADAS芯片,四维图新总资产增幅达167.68%
北京四维图新科技股份有限公司(以下简称“四维图新”)自今年年初完成收购联发科子公司杰发科技后,不再只是地图软件背后的数据供应商,而是实现汽车电子芯片资源的整合,成为了A股中唯一的“高精度地图+车规级智能芯片”的上市公司。 8月28日,四维图新发布收购后的首个半年报,报告显示,上半年实现营收83,382.12万元,同比增长16.80%;实现归属于上市公司股东净利润12,133.68万元,同比增长54.85%;实现扣非净利润11,415.50万元,同比增长61.56%;总资产达到1,103,454.14万元,与上年同期相比增长幅度达到了167.68%。 收购杰发科技给四维图新带来哪些改变? 杰发科技自年初完成收购后,其业务已经
[半导体设计/制造]
收购杰发科技推出ADAS<font color='red'>芯片</font>,四维图新总资产增幅达167.68%
最新统计中国LED芯片厂家增至62家
LED产业研究机构LEDinside日前发布最新报告,截止2009年8月,中国大陆现存LED芯片生产企业达62个,近几年呈快速上涨的势头。1999年是中国LED芯片企业开始飞速发展的开始,在98年中国仅有3个相关企业,99年增加了6个,并从99年至2009年每年都有2-7个企业进入LED芯片行业。    从1999年-2009年11年里有7年时间每年新进入LED芯片企业的数量在6个及以上。低谷在2002年,仅有2个企业进入LED芯片行业。最高峰在2009年,仅1月至8月就有7个企业进入LED芯片行业。芯片生产企业数量更是从1998年3个增至2009年8月62个。    2000年之前虽有企业进入LED芯片行业,但LED
[电源管理]
东芝芯片业务出售谈判陷入僵局 已做好退市准备
   新浪科技讯 北京时间8月14日晚间消息,据彭博社报道,东芝在与贝恩资本领导的财团(以下简称“贝恩财团”)洽谈芯片业务出售事宜时,因为商业和治理问题导致双方在付费时机上陷入僵局,给该公司能否快速完成这一交易蒙上了阴影。   知情人士表示,贝恩财团希望在东芝解决与合作伙伴西部数据的法律纠纷后再支付现金,而东芝希望提前支付。东芝总裁纲川智(Satoshi Tsunakawa)上周表示,由于尚未与获得优先竞购权的贝恩财团达成最终协议,该公司将与其他可能的收购方展开谈判,但他并未披露具体原因。   在减记数十亿美元美国核业务资产后,东芝需要在明年3月之前完成芯片业务的出售,否则就会在东京证券交易所退市。   知情人士表示,虽然曾经尝试
[手机便携]
基于蓝牙芯片的无线通信模块设计与开发
   1 引言   蓝牙技术是一个开放性的、短距离无线通信技术标准,它工作在全球通用的2.4GHZ ISM 频段,采用跳频扩频技术,可以用于近距离通过无线连接的方式实现固定设备以及移动设备之间的网络互连,在各种数字设备之间实现灵活、安全、低成本、小功耗的数据和语音通信, 实现全方位的数据传输。   工业现场环境恶劣,有些地方工作人员甚至难以接近,特别是一些工业环境禁止使用电 缆(如超净或真空封闭的房间)或者很难使用电缆来传送数据(如高速旋转的设备、高空设备、不适于布线的强腐蚀恶劣环境),这时采用蓝牙等无线通信技术代替电缆来实现现场设备与监控网络间的数据传输就能有效解决上述问题。为此本文针对工业现场设备、接入点、手操器等设计
[嵌入式]
手机厂商砍单:从缺货到去库存,芯片供应进入调整期
随着中国智能手机市场逐渐走向饱和,开发海外市场成为国内手机厂商的必然选择。据StrategyAnalytics报道,在华为战略性撤退的情况下,从2019年Q1到2021年Q1,包括小米、OPPO、vivo、realme等中国本土厂商在欧洲市场的出货量几乎翻了两番。 然而,同欧洲市场手机销量持续增长的火热态势不同,在中国市场,本土厂商似乎遭遇了滑铁卢。据中国信通院分析报告显示,今年4月,国内手机市场出货量同比下降34.1%,高速增长的势头戛然而止。同时,受印度疫情影响,本土手机厂商纷纷下调出货量,减少芯片订单,使智能手机供应链出现动荡。 生产不足与厂商囤货,2020年缺芯成主流 对于芯片厂商来说,过去的一段时间,经历了如过山车般
[手机便携]
手机厂商砍单:从缺货到去库存,<font color='red'>芯片</font>供应进入调整期
基于DSP芯片TMS320DM642的嵌入式无线视频监控系统设计
选用TMS320DM642作为系统CPU,并采用最新视频编码标准H.264压缩算法,实现基于CDMA网络传输的无线视频监控和视频数据存储系统。 随着运营商在国内大部分地区推出GRPS和CDMA1x公共无线数据网络,通过公共无线数据网络传输视频已成为当今研究和应用的热点,它能彻底解决微波方式的短距离问题。由于公共无线数据网络的带宽比较窄且不稳定,采用编码效率不高的视频压缩算法(如H.263、MPEG-4等),传输效果不理想,无法满足大多数监控场合的要求。 H.264是JVT制定的最新视频压缩标准,比H.263和MPEG-4在同质量时码流可低50%,同时支持无线网络传输,但其运算复杂度也是H.263和MPEG-4的3-5倍,因此一
[嵌入式]
基于DSP<font color='red'>芯片</font>TMS320DM642的嵌入式无线视频监控系统设计
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved