路振民,邵瓊玲,宋方
摘 ?要: 基于嵌入式Linux,使用UM220和TE6410開發板,完成了北斗二代接收機的應用開發。通過嵌入式Linux和Qt/E的移植,實現了Qt的GUI界面顯示,利用Linux多線程的特點,完整實現了NMEA 數據的接收、處理、顯示以及可視星的星座圖顯示,對北斗二代系統終端的開發有一定的借鑒意義。
關鍵詞: 北斗二代系統; 嵌入式Linux; 應用開發; 數據接收
中圖分類號: TN927+.2?34; TP311.1; V19 ? ? ? ? ? ?文獻標識碼: A ? ? ? ? ? 文章編號: 1004?373X(2014)23?0155?04
Application development of BD2 receiver based on embedded Linux
LU Zhen?min1, SHAO Qiong?ling2, SONG Fang3
(1. Company of Postgraduate Management, the Academy of Equipment, Beijing 101416, China;
2. Department of Space Equipment, the Academy of Equipment, Beijing 101416, China; 3. Detachment 54, Unit 73678 of PLA, Xiamen 361009, China)
Abstract: In this paper, the application development of BD?2 receiver base on embedded Linux was performed on UM220 module and TE6410 board. By transplantation of the embedded Linux and Qt/E, the Qt GUI interface display was realized. NMEA data receiving, processing, display and constellation show of the visible satellite were completely implemented by means of the Linux multithreaded characteristics. It has certain reference significance for the development of BD?2 terminal.
Keywords: BD2 receiver; embedded Linux; application development; data acceptance
0 ?引 ?言
隨著北斗二代系統在國內及周邊區域無源定位的實現[1],北斗二代終端的設計及應用也逐漸成為研究熱點。
Linux可在GNU公共許可權限下免費獲得,并且符合POSIX標準[2]。采用開源的嵌入式Linux作為嵌入式操作系統,可以有效避免關于版權的糾紛,節省了大量的開發費用[3]。同時,嵌入式Linux還可以根據應用需求進行內核裁剪,可應用于多種硬件平臺。
因此,本文提出基于開源的嵌入式Linux系統,實現了北斗無源定位數據的接收、提取,同時采用QT/E進行軟件界面設計,實現數據的顯示,滿足了北斗接收機應用的基本需求。通過該方法,有效地降低了北斗接收機的開發成本,同時對北斗接收機的開發具備一定的借鑒意義。
1 ?硬件平臺介紹
本文所采用的硬件開發平臺為UM220導航模塊和TE6410開發板。
其中UM220為BD/GPS雙系統導航模塊,可同時接收BD2 B1、GPS L1兩個頻點的信號,進行接收、解調、解算,生成定位相關信息,并從串口輸出NMEA(National Marine Electronics Association)數據。
TE6410開發板采用基于ARM11的S3C6410作為主控制器,通過串口的控制完成數據的讀取,在運行嵌入式Linux的基礎上,實現了數據的提取和顯示。
本文采用的硬件平臺工作原理圖如圖1所示。
<;E:\2014年23期\2014年23期\Image\42t1.tif>;
圖1 硬件平臺組成框圖
2 ?開發環境搭建
2.1 ?嵌入式Linux介紹
嵌入式Linux是運行在嵌入式設備上的Linux,是根據硬件設備進行定制的一種小型操作系統[2],由內核(kernel)及部分系統模塊組成。
嵌入式Linux主要有跨平臺、可裁剪、移植性好、開源、支持多任務多進程等優點,是用途最廣,裝備最多的嵌入式操作系統[4]。
2.2 ?嵌入式Linux移植
本文所述的軟件開發環境是指運行在虛擬機上的Ubuntu 12,并已安裝好gcc, g++,arc?linux?gcc, arc?linux?g++編譯器和應用程序QT4.8。
Linux目前最新的版本是3.15,考慮到穩定及兼容性,本文采用Linux版本為2.6。下載并解壓內核源碼后,在Ubuntu終端中進入源碼目錄,輸入命令“make menuconfig ARCH=arm”,之后系統進入內核配置界面endprint
進入System Type選項的子菜單ARM system type,選擇Samsung S3C64XX。保存退出,這里選擇S3C64XX系列的默認內核配置。
輸入命令“make zImage”,進行內核編譯。編譯完成后,在目錄“arch/arm/boot”中可找到編譯好的內核映像zImage。
Linux系統啟動的一般過程包括引導內核、啟動內核和啟動初始化程序等[5],因此運行一個完整的嵌入式操作系統除內核外,還需要bootloader和文件系統的支持。
這里選擇的bootloader和文件系統分別是Uboot1.6和Yaffs2。因bootloader和文件系統的編譯不是本文重點,這里不再贅述
2.3 ?Qt/E簡介
Qt作為跨平臺的圖形界面開發平臺,可以直接建立在簡單的幀緩沖驅動上,并且有良好的可配置,可裁剪特性,因此也經常用在嵌入式系統上[6]。
Qt/Embedded Linux(即Qt/E或Qtopia)是為嵌入式Linux優化過的Qt版本。Qt/E提供了與Qt的桌面系統相同的API(應用程序接口),因此任何標準的Qt應用程序都可以被重新編譯到Qt/E上進行運行[4]。
Qt/E圖形引擎的基礎是圖形緩沖幀,它是一種采用mmap系統調用的驅動程序接口,在這個接口的支持下,系統屏幕才能顯示內容[7]。
2.4 ?Qt/E移植
在運行Qt/E的API進行應用程序編寫和調試之前,還有兩項很重要的工作要做:
首先,必須編譯和安裝Qt/E的開發包,以Qt4.4.3為例,下載源碼并解壓后,開啟終端并進入源碼目錄下的configure子目錄,依次運行“make”和“make install”命令。
編譯完成后,子目錄“builddir/image”下的所有文件就是Qt4.4.3的運行文件,本質上這是Qt/E的一個文件系統。將其復制到開發板文件系統的opt目錄下。
同時,也生成了移植Qt程序所需要的交叉編譯工具,即 “builddir/sdk/qtopiacore/target/bin”下的qmake程序。
在應用程序編寫完成后,使用qmake工具創建Makefile,然后輸入指令“gedit Makefile”,在CFLAGS和CXXFLAGS的等號后面添加“?fno?rtti”參數,該參數表示禁用運行時類型信息,可降低程序的資源占用,有效提高程序運行效率。
修改完Makefile后,輸出命令“make”即可完成程序編譯。
3 ?應用程序開發
作為北斗二代接收機的一款應用,首先必須實現NMEA數據的獲取,然后對數據進行處理,提取有用的數據,并使用Qt的API函數,實現定位數據的顯示、衛星星座圖顯示以及地圖上定位點的顯示。
3.1 ?串口設備的控制
Qt本身提供了用于串口控制的頭文件“termios.h”,該頭文件聲明了一個結構體用于串口的控制,同時宏定義了一些控制變量。
由于UM220默認串口輸出波特率為9 600 b/s,數據位8位,停止位1,無校驗位[8],硬件連接串口使用串口1,因此可在宏定義中進行如下定義:
#define BAURATE B9600
#define RS_DEVICE "/dev/ttySAC1"
使用頭文件中的結構體必須先定義:
Struct termios Tioset;
在各項定義準備好之后,就可以打開串口了,下面語句以讀寫的方式打開串口1,打開成功返回0,失敗返回-1:
fd=open(RS_DEVICE,0_RDWR);
串口成功打開后,則按照UM220的默認值進行設置,如下:
Tioset.c_cflag=BAURATE|CS8|CL0CSAL|CREAD;
Tioset.c_iflag|=IGNPAR; ?//忽略奇偶
以上設置完成后,還可以用同樣方式設置串口讀寫字符的速度和單次讀寫字符數量等。
關閉串口使用close(fd)函數。
3.2 ?NMEA數據的接收
串口打開完畢后,就可以準備讀寫數據了,寫入數據比較簡單,使用write()函數寫入到緩存即可,下面語句就從串口輸出了字符串“RS 232 Data”。
write(fd,″RS 232 Data″,10);
讀數據函數為read(),可從緩存讀出指定長度的字符,返回值為實際讀取長度,如下:
res=read(fd,buf,1024);
考慮到讀取定位數據是一個連續的過程,因此可將串口的控制及數據的接收以多線程的方式運行。
開啟線程,需引用頭文件QThread,該頭文件包含線程類QThread的聲明,以單繼承的方式生成一個新類,這樣,新類就繼承了QThread的所有方法。
線程的開啟可使用start()函數,可在線程的實際執行函數內包含串口控制及數據讀寫,這樣就可通過控制線程的各項參數來間接完成以上功能。
圖2顯示了讀取到的部分數據。
<;E:\2014年23期\2014年23期\Image\42t2.tif>;
圖2 串口數據讀取
3.3 ?定位的數據的顯示
當數據讀取成功后,需要根據NMEA格式進行處理。NMEA格式采用Unicore協議,該協議中,輸入的語句統稱為消息,每條消息均為全ASCII字符組成的字符串。所有消息都以“$”開始,后緊跟消息名,之后有一定數量的參數或數據,消息名與數據之間均以逗號進行分隔[6]。endprint
NEMA格式對每一種數據類型都有嚴格的定義,其中位置數據格式如下:
$BDGLL,Lat,N,Lon,E,time,valid,Mode*cs
例子:$BDGLL,4002.2178,N,11618.1057,E,123400.00,A,A*5B
各部分參數含義[9]見表1。
表1 定位數據格式部分參數含義
[參數名\&;描述\&;參數名\&;描述\&;BDGLL\&;BD2系統單獨
定位的地理位置\&;time\&;UTC 時間,格式為hhmmss.sss\&;Lat\&;緯度\&;Valid\&;位置有效標識\&;N\&;北緯或南緯指示\&;Mode\&;定位模式\&;Lon\&;經度\&;A*cs\&;校驗和\&;E\&;東經或西經指示\&;\&;\&;]
定位精度因子信息的數據格式如下:
$BDGSA,Smode,Fs,sv1,sv2,sv3,sv4,sv5,sv6,sv7,sv8,sv9,sv10,sv11,sv12,PDOP,HDOP,VDOP*cs
例子:$BDGSA,A,167,124…5.572,2.788,4.824*36
各部分參數定義[6]見表2。
表2 GSA數據格式部分參數定義
[參數名\&;描述\&;參數名\&;描述\&;BDGSA\&;GNSS精度因子與有效衛星信息\&;PDOP\&;位置精度因子\&;Smode\&;定位模式指定狀態\&;HDOP\&;水平精度因子\&;Sv1~Sv12\&;參與定位的衛星號\&;VDOP\&;垂向精度因子\&;]
根據以上格式,對接收到的數據進行字符串處理,提取有用信息,即可進行顯示,如圖3所示。
<;E:\2014年23期\2014年23期\Image\42t3.tif>;
圖3 定位數據顯示
3.4 ?星座圖的顯示
Qt的視圖體系包括一個由QGraphicsScenec充當的場景及由一些QGaraphicItem的子類充當場景中的項。QGraphicView是一個控件,可顯示場景。GraphicView系統主要由QGraphicScene,QGraphicItem,QGraphicView組成[10]。他們之間的關系是場景是基礎,項用來管理視圖,并通過添加到場景中來完成顯示。
對NEMA中的GSV語句進行字符串分割,即可得到可視星信息,主要包括衛星的編號、仰角和方位角。
星座圖的顯示,首先要進行坐標轉換,即將衛星的仰角和方位角,通過簡單的幾何公式轉換為星座圖的坐標。
然后,定義類MySat,同樣以繼承的方式使用頭文件“QGraphicsItem.h”中定義的類及方法,結合QPainter函數,可以很方便地將可視星以圖形化的方式表現出來。
Class MySat:public QGraphicsItem
之后,分別使用Qpainter類的drawPixmap()函數和drawText()函數在進行畫圖。
Pos_ball=axis_transform(FYJ,BPJ);
Painter.drawPixmap(pos_ball,pix);
最后在控件QGraphicView里顯示場景,并使用場景的addItem()方法來實現MySat類的畫圖功能。代碼如下:
MySat *mysat=new MySat;
Scene?>;addItem(mysat);
Ui?>;graphicview.>;setScene(scene);
這樣,就實現了星座圖在控件里的顯示,顯示效果如圖4所示。
<;E:\2014年23期\2014年23期\Image\42t4.tif>;
圖4 衛星星座圖顯示
4 ?結 ?語
本文實現了從S3C6410開發板的串口讀取NEMA數據,并進一步完成了定位數據提取和衛星星座圖顯示。經測試,程序運行穩定,定位精度優于10 m,驗證了北斗二代接收機在Linux終端上開發的可行性,對北斗終端應用的發展有一定的借鑒意義。
參考文獻
[1] 中國衛星導航系統管理辦公室.北斗衛星導航系統發展報告(2.1版)[M].北京:中國衛星導航系統管理辦公室,2012.
[2] 吳林城,胡慶新,李冬.基于Qt/Embedded的圖形用戶界面開發[J].儀器儀表學報,2009,30(6):371?374.
[3] 邵海東,周鵬,胡南軍,等.基于Linux的嵌入式系統設計與實現[J].計算機工程,2002(6):262?264.
[4] 何永琪.嵌入式Linux系統實用開發[M].北京:電子工業出版社,2010.
[5] 楊水清,張劍,施云飛.精通ARM嵌入式Linux系統開發[M].北京:電子工業出版社,2012.
[6] BLANCHETTE J, SUMMERFIELD M.C++ GUI Qt4編程[M]. 2版.閆鋒欣,曾泉人,張志強,譯.北京:電子工業出版社,2012.
[7] 吳子平.基于Qt/E的嵌入式GUI技術研究與實現[D].荊州:長江大學,2012.
[8] 和芯星通有限公司.UM220用戶手冊[EB/OL].[2013?06?03].http://www.unicorecomm.com/down?64.aspx.
[9] 和芯星通有限公司.UM220北斗/GPS雙系統導航授時模塊數據接口協議[EB/OL].[2013?11?06].http://www.unicorecomm.com/down?64.aspx.
[10] 廖熹,易克非.基于嵌入式Linux系統下的Qt測試軟件開發[J].兵工自動化,2013(8):98?100.endprint
NEMA格式對每一種數據類型都有嚴格的定義,其中位置數據格式如下:
$BDGLL,Lat,N,Lon,E,time,valid,Mode*cs
例子:$BDGLL,4002.2178,N,11618.1057,E,123400.00,A,A*5B
各部分參數含義[9]見表1。
表1 定位數據格式部分參數含義
[參數名\&;描述\&;參數名\&;描述\&;BDGLL\&;BD2系統單獨
定位的地理位置\&;time\&;UTC 時間,格式為hhmmss.sss\&;Lat\&;緯度\&;Valid\&;位置有效標識\&;N\&;北緯或南緯指示\&;Mode\&;定位模式\&;Lon\&;經度\&;A*cs\&;校驗和\&;E\&;東經或西經指示\&;\&;\&;]
定位精度因子信息的數據格式如下:
$BDGSA,Smode,Fs,sv1,sv2,sv3,sv4,sv5,sv6,sv7,sv8,sv9,sv10,sv11,sv12,PDOP,HDOP,VDOP*cs
例子:$BDGSA,A,167,124…5.572,2.788,4.824*36
各部分參數定義[6]見表2。
表2 GSA數據格式部分參數定義
[參數名\&;描述\&;參數名\&;描述\&;BDGSA\&;GNSS精度因子與有效衛星信息\&;PDOP\&;位置精度因子\&;Smode\&;定位模式指定狀態\&;HDOP\&;水平精度因子\&;Sv1~Sv12\&;參與定位的衛星號\&;VDOP\&;垂向精度因子\&;]
根據以上格式,對接收到的數據進行字符串處理,提取有用信息,即可進行顯示,如圖3所示。
<;E:\2014年23期\2014年23期\Image\42t3.tif>;
圖3 定位數據顯示
3.4 ?星座圖的顯示
Qt的視圖體系包括一個由QGraphicsScenec充當的場景及由一些QGaraphicItem的子類充當場景中的項。QGraphicView是一個控件,可顯示場景。GraphicView系統主要由QGraphicScene,QGraphicItem,QGraphicView組成[10]。他們之間的關系是場景是基礎,項用來管理視圖,并通過添加到場景中來完成顯示。
對NEMA中的GSV語句進行字符串分割,即可得到可視星信息,主要包括衛星的編號、仰角和方位角。
星座圖的顯示,首先要進行坐標轉換,即將衛星的仰角和方位角,通過簡單的幾何公式轉換為星座圖的坐標。
然后,定義類MySat,同樣以繼承的方式使用頭文件“QGraphicsItem.h”中定義的類及方法,結合QPainter函數,可以很方便地將可視星以圖形化的方式表現出來。
Class MySat:public QGraphicsItem
之后,分別使用Qpainter類的drawPixmap()函數和drawText()函數在進行畫圖。
Pos_ball=axis_transform(FYJ,BPJ);
Painter.drawPixmap(pos_ball,pix);
最后在控件QGraphicView里顯示場景,并使用場景的addItem()方法來實現MySat類的畫圖功能。代碼如下:
MySat *mysat=new MySat;
Scene?>;addItem(mysat);
Ui?>;graphicview.>;setScene(scene);
這樣,就實現了星座圖在控件里的顯示,顯示效果如圖4所示。
<;E:\2014年23期\2014年23期\Image\42t4.tif>;
圖4 衛星星座圖顯示
4 ?結 ?語
本文實現了從S3C6410開發板的串口讀取NEMA數據,并進一步完成了定位數據提取和衛星星座圖顯示。經測試,程序運行穩定,定位精度優于10 m,驗證了北斗二代接收機在Linux終端上開發的可行性,對北斗終端應用的發展有一定的借鑒意義。
參考文獻
[1] 中國衛星導航系統管理辦公室.北斗衛星導航系統發展報告(2.1版)[M].北京:中國衛星導航系統管理辦公室,2012.
[2] 吳林城,胡慶新,李冬.基于Qt/Embedded的圖形用戶界面開發[J].儀器儀表學報,2009,30(6):371?374.
[3] 邵海東,周鵬,胡南軍,等.基于Linux的嵌入式系統設計與實現[J].計算機工程,2002(6):262?264.
[4] 何永琪.嵌入式Linux系統實用開發[M].北京:電子工業出版社,2010.
[5] 楊水清,張劍,施云飛.精通ARM嵌入式Linux系統開發[M].北京:電子工業出版社,2012.
[6] BLANCHETTE J, SUMMERFIELD M.C++ GUI Qt4編程[M]. 2版.閆鋒欣,曾泉人,張志強,譯.北京:電子工業出版社,2012.
[7] 吳子平.基于Qt/E的嵌入式GUI技術研究與實現[D].荊州:長江大學,2012.
[8] 和芯星通有限公司.UM220用戶手冊[EB/OL].[2013?06?03].http://www.unicorecomm.com/down?64.aspx.
[9] 和芯星通有限公司.UM220北斗/GPS雙系統導航授時模塊數據接口協議[EB/OL].[2013?11?06].http://www.unicorecomm.com/down?64.aspx.
[10] 廖熹,易克非.基于嵌入式Linux系統下的Qt測試軟件開發[J].兵工自動化,2013(8):98?100.endprint
NEMA格式對每一種數據類型都有嚴格的定義,其中位置數據格式如下:
$BDGLL,Lat,N,Lon,E,time,valid,Mode*cs
例子:$BDGLL,4002.2178,N,11618.1057,E,123400.00,A,A*5B
各部分參數含義[9]見表1。
表1 定位數據格式部分參數含義
[參數名\&;描述\&;參數名\&;描述\&;BDGLL\&;BD2系統單獨
定位的地理位置\&;time\&;UTC 時間,格式為hhmmss.sss\&;Lat\&;緯度\&;Valid\&;位置有效標識\&;N\&;北緯或南緯指示\&;Mode\&;定位模式\&;Lon\&;經度\&;A*cs\&;校驗和\&;E\&;東經或西經指示\&;\&;\&;]
定位精度因子信息的數據格式如下:
$BDGSA,Smode,Fs,sv1,sv2,sv3,sv4,sv5,sv6,sv7,sv8,sv9,sv10,sv11,sv12,PDOP,HDOP,VDOP*cs
例子:$BDGSA,A,167,124…5.572,2.788,4.824*36
各部分參數定義[6]見表2。
表2 GSA數據格式部分參數定義
[參數名\&;描述\&;參數名\&;描述\&;BDGSA\&;GNSS精度因子與有效衛星信息\&;PDOP\&;位置精度因子\&;Smode\&;定位模式指定狀態\&;HDOP\&;水平精度因子\&;Sv1~Sv12\&;參與定位的衛星號\&;VDOP\&;垂向精度因子\&;]
根據以上格式,對接收到的數據進行字符串處理,提取有用信息,即可進行顯示,如圖3所示。
<;E:\2014年23期\2014年23期\Image\42t3.tif>;
圖3 定位數據顯示
3.4 ?星座圖的顯示
Qt的視圖體系包括一個由QGraphicsScenec充當的場景及由一些QGaraphicItem的子類充當場景中的項。QGraphicView是一個控件,可顯示場景。GraphicView系統主要由QGraphicScene,QGraphicItem,QGraphicView組成[10]。他們之間的關系是場景是基礎,項用來管理視圖,并通過添加到場景中來完成顯示。
對NEMA中的GSV語句進行字符串分割,即可得到可視星信息,主要包括衛星的編號、仰角和方位角。
星座圖的顯示,首先要進行坐標轉換,即將衛星的仰角和方位角,通過簡單的幾何公式轉換為星座圖的坐標。
然后,定義類MySat,同樣以繼承的方式使用頭文件“QGraphicsItem.h”中定義的類及方法,結合QPainter函數,可以很方便地將可視星以圖形化的方式表現出來。
Class MySat:public QGraphicsItem
之后,分別使用Qpainter類的drawPixmap()函數和drawText()函數在進行畫圖。
Pos_ball=axis_transform(FYJ,BPJ);
Painter.drawPixmap(pos_ball,pix);
最后在控件QGraphicView里顯示場景,并使用場景的addItem()方法來實現MySat類的畫圖功能。代碼如下:
MySat *mysat=new MySat;
Scene?>;addItem(mysat);
Ui?>;graphicview.>;setScene(scene);
這樣,就實現了星座圖在控件里的顯示,顯示效果如圖4所示。
<;E:\2014年23期\2014年23期\Image\42t4.tif>;
圖4 衛星星座圖顯示
4 ?結 ?語
本文實現了從S3C6410開發板的串口讀取NEMA數據,并進一步完成了定位數據提取和衛星星座圖顯示。經測試,程序運行穩定,定位精度優于10 m,驗證了北斗二代接收機在Linux終端上開發的可行性,對北斗終端應用的發展有一定的借鑒意義。
參考文獻
[1] 中國衛星導航系統管理辦公室.北斗衛星導航系統發展報告(2.1版)[M].北京:中國衛星導航系統管理辦公室,2012.
[2] 吳林城,胡慶新,李冬.基于Qt/Embedded的圖形用戶界面開發[J].儀器儀表學報,2009,30(6):371?374.
[3] 邵海東,周鵬,胡南軍,等.基于Linux的嵌入式系統設計與實現[J].計算機工程,2002(6):262?264.
[4] 何永琪.嵌入式Linux系統實用開發[M].北京:電子工業出版社,2010.
[5] 楊水清,張劍,施云飛.精通ARM嵌入式Linux系統開發[M].北京:電子工業出版社,2012.
[6] BLANCHETTE J, SUMMERFIELD M.C++ GUI Qt4編程[M]. 2版.閆鋒欣,曾泉人,張志強,譯.北京:電子工業出版社,2012.
[7] 吳子平.基于Qt/E的嵌入式GUI技術研究與實現[D].荊州:長江大學,2012.
[8] 和芯星通有限公司.UM220用戶手冊[EB/OL].[2013?06?03].http://www.unicorecomm.com/down?64.aspx.
[9] 和芯星通有限公司.UM220北斗/GPS雙系統導航授時模塊數據接口協議[EB/OL].[2013?11?06].http://www.unicorecomm.com/down?64.aspx.
[10] 廖熹,易克非.基于嵌入式Linux系統下的Qt測試軟件開發[J].兵工自動化,2013(8):98?100.endprint