摘要:本文阐述了基于微小型飞行器飞行控制系统中利用串口实现与GPS通信的方法。首先,简要介绍了串口通信;然后,介绍了GPS数据格式的相关问题;最后,给出串口通信模块与GPS信号提取模块的实现方法,详细叙述了如何利用嵌入式程序开发语言进行串口通信,并给出了具体流程。 关键词:飞行控制系统 GPS 串口通信
1、引言
飞行控制系统的两个主要功能是:飞行和增稳控制、导航和任务控制。飞机导航就是引导飞机按照预定航线飞向目标。导航的基本任务就是确定飞机在飞行中的位置和飞行方向。GPS即全球定位系统,是适合微小型飞机的一种重要导航系统。飞行控制系统将根据航路点的经纬度坐标、序号、各航段飞行速度、高度、各航路点半径等参数设置确定的任务航线,通过GPS 卫星定位接收机获取飞机当前位置信息,经 CPU 运算后通过飞行控制系统,控制飞机按航路点序号已设定的速度和高度顺序飞行。
GPS通过串口与飞控计算机实现数据通信,下面将具体介绍如何实现GPS与飞控计算机的串口通信。
2、串行通信
每台PC都配有串行端口,以便与外部串行设备之间进行通信。串行端口的本质功能是作为芯片和串行设备之间的编码转换器。当数据从芯片经过串行端口发送出去时,字节数据被转换为串行的位。在接收数据时,串行的位将被转换为字节数据。GPS提供串行通信接口,串行通信参数为:波特率=4800bps,数据位=8位,开始位=l位,停止位=l位,无奇偶校验。
3、GPS数据格式
工程所使用的是e-Compass E511GPS模块,它是12通道的GPS接收机模块,同时可以跟踪多达12颗GPS卫星,跟踪性能优越,从而能够快速的定位。E511接收机模块功耗非常小,数据更新率为每秒一次,其优良的性能既能够满足陆地导航的灵敏度需求,也能够满足飞行器的动态需求。E511所输出的数据是以美国国家海洋电子协会(National Marine Electronics Association)的NMEA0183 ASCII 码接口协议为基础的。此语句包括:GPGGA,GPGSA,GPGSV,GPRMC,GPGLL,GPVTG。而在我们实际使用时可通过NMEA 0183 输入语句对输出语句进行选择,也可对波特率进行更改[1]。本工程中,最终只需取出高度、经度、纬度、速度和接收信号的时间等信息,所以只要求获得GPGGA和GPRMC语句即可。现以GPGGA语句为例,介绍它的语句格式:$GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,M,<10>,M,<11>,<12>*hh<CR><LF>。其具体信息如表1所列。
|
$GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>,*hh<CR><LF> |
|
<1> |
UTC时间,hhmmss.dd (时分秒)格式 |
|
<2> |
纬度ddmm.mmmm(度分)格式(前面的0也被传输) |
|
<3> |
纬度半球N(北半球)或S(南半球) |
|
<4> |
经度dddmm.mmmm(度分)格式(前面的0也被传输) |
|
<5> |
经度半球E(东经)或S(西经) |
|
<6> |
GPS状态:0=未定位,1=定位 |
|
<7> |
正在使用解算位置的卫星数量(00~12)(前面的0也将被传输) |
|
<8> |
HDOP水平精度因子(0.5~99.9) |
|
<9> |
海拔高度(-9999.9~99999.9) |
|
<10> |
地球托球面相对大地水准面的高度 |
|
<11> |
差分时间(从最近一次接收到差分信号开始的秒数,如果不是差分定位将为空) |
|
<12> |
差分站ID号0000~1023(前面的0也将被传输,如果不是差分定位将为空) |
表1 GPGGA语句信息说明
4、GPS信号的接收模块设计
接收模块是基于PHILIP公司LPC2138进行研制的,它是基于ARM7TDMI-S核,采用单电源供电、LQFP64封装,有两个符合`550工业标准的异步串行口(UART)UART0和UART1。它具有16字节收发FIFO;接收器FIFO触发点可为1,4,8和14字节;内置波特率发生器等特性。对于串口接收既可以采用查询方式进行处理,也可以采用中断方式进行处理,本文采用中断处理方式以减少接收程序对CPU时间的占用。具体步骤为:首先进行串口初始化,包括管脚的选择、波特率的设置、设置接收的数据格式、允许中断、设置FIFO、建立数据队列等[2]。
串口的接收过程可采用查询方式或中断方式,但查询方式耗时较长,有可能延长20ms的程序运行周期,不满足实时性要求,所以选择使用中断方式以减少驱动程序对CPU时间的占用[4]。由于UART可以同时存在几个中断源申请中断的情况,而UART的硬件仅指示出其中的一个中断源,为减少多次进入中断而引起的开销,中断中使用了while循环判断UART的中断是否处理完毕。中断服务程序流程图如图1:

图1 串口中断服务程序
在中断处理程序中先后使用了两种方式进行数据的接收,一是使用uC/OS-II实时操作系统提供的信号量机制。信号量实际上是一种约定机制,在多任务内核中普遍使用。 信号像是一把钥匙,任务要运行下去,得先拿到这把钥匙。如果信号已被别的任务占用,该任务只得被挂起,直到信号被当前使用者释放[3]。当中断源为接收数据可用或接收字符超时,表明UART的FIFO中有数据,中断程序发送信号量给接收任务,以便接收数据的任务可以接收数据。接收任务得到这个信号量,则将接收器缓存寄存器UxRBR中的数据读出。此方法对普通的串口接收来说不失为一种好方法,但是此方法有一种致命的缺陷,当没有接收数据时,程序会一直等待中断服务程序发出信号量,从而会影响整个任务的执行状态,比如,当串口接收与AD采集、PWM采集在同一任务中运行时,当串口没有接收数据时,AD采集与PWM采集将无法进行,从而影响了整个任务状态。第二种方法是采用数据队列,数据队列一般用于数据缓存,且一般用于平衡速率不同的两个部件,使快速部件无需等待慢速部件。本数据队列设置为先入先出(FIFO),当中断服务程序接收到数据后,接收程序即从串口接收缓冲区中UxRBR将数据读到队列缓冲区UART1GetBuf[]中。其流程如图2:

图2 串口接收程序流程图
4、GPS信号的提取
根据GPS数据格式可以看出,一个完整的NEMA0183语句是从起始符“$”到终止符“<CR><CF>”为止的—段字符串。而我们需要掌握的信息是高度、经度、纬度、速度和接收信号的时间。所以接收到这样一个完整的NEMA0183语句时,提取有用信息的方法是:先判定起始符$的位置,从起始符开始读人数据,直到以回车符为结尾,在这之间的语句为一个完整语句放入定义的数组one_cmd中,至此,一个完整的命令被读出。之后,是要取得我们所需要的信息,通过异或校验后的语句中寻找字符“,”,然后截取前后两个“,”之间的字符(串)获得所关心的数据。
5、结束语
通过本方法,可以将GPS定位导航信息从GPS接收机完整接收,并将所需信息从中提取,从而为实现飞行控制系统的导航控制提供数据采集。其实,GPS接收并提取的数据也可以为其它应用系统所应用,如电子地图、车载导航、智能交通、野外勘探等方面。只是在数据提取方面有所不同,经过修改,完全可以应用到其中。
参考文献
[1] 李洪涛,许国昌等。GPS应用程序设计。北京:科学出版社,1999
[2] 周立功 ARM微控制器基础与实战 北京:航空航天大学出版社, 2003.11
[3] Labrosse J J. 嵌入式实时操作系统uC/OS-II(邵贝贝等译). 北京:北京航空航天大学出版社,2003
[4] Kernighan Brain W,Dennis M Ritchie. The C Programming Language. 2 edition.Englewood Cliffs, New Jersey:Prentice Hall,1998
[5] 杨贵军,武文波。PDA环境下GPS信号的接收和处理方法。单片机与嵌入式系统应用,2005(9):27~29
|