微波EDA网,见证研发工程师的成长!
首页 > 应用设计 > 汽车电子 > GPS导航数据提取的设计与研究

GPS导航数据提取的设计与研究

时间:01-25 来源:电子技术应用 点击:

Windows CE 是一个开放的、可裁剪的、32位实时嵌入式窗口操作系统,具有可靠性好、实时性高、内核体积小的特点,广泛应用于各种智能式设备的开发。系统通过微软提供的Platform Builder定制需要的Windows CE5.0系统,运行在硬件平台上。硬件平台采用博创科技PXA270实验箱,该实验箱嵌入式处理器是基于ARMV5E的Xscale核心PXA270,并支持串口通信。

GPS导航芯片采用天宝iQ 46240,将接收到的数据通过串口发送给处理器。串口是计算机系统与外部串行设备之间的数据传输通道,是嵌入式通信最可靠、最通用的通信方式。程序员利用Windows API函数可以编写出高效、可移植性的应用程序。Windows CE不支持Windows下常用的串行通信异步I/O方式(Overlapped,非阻塞),因此在嵌入式环境下采用了同步I/O方式的通信程序设计方法。

实验设计根据GPS导航数据有效性确认的标准,对提取的数据进行处理,把缓存中接收到的GPS数据格式转化为电子地图上常用的浮点型格式。此设计已应用于智能阅读器盲用定位模块中。

1 串口通信同步I/O方式的程序设计

串口通信是串行通信的一种,串行通信的模式一般分为上位机和下位机通信。上位机可以读取下位机的状态数据,也可以设置下位机的状态。一般串行通信协议可分为两类,即读和写。读写协议的描述如图1所示,常用的效验码有异或、累加和、CRC等[1]。


在实验设计中,GPS接收装置作为下位机只负责提供固定格式的数据,实验箱作为上位机不必发送指令,只负责定时读取GPS接收装置发送的数据。即可以简化通信协议,提高工作效率。

1.1 设计开发环境

在Windows NT/ME环境下安装eVC4.0编程环境,设置顺序如下:

(1)安装同步软件Microsoft ActiveSync 4.0;
(2)安装eVC4.0;
(3)利用PB(Platform Builder5.0)定制Wince系统对应的SDK并安装;
(4)利用PB将定制的wince系统下载到实验箱上,并与PC机同步[2]。

1.2 同步I/O方式读取的设计方法

为完成串口通信同步I/O方式程序设计,分为三个部分,每个部分有一个函数完成其对应的功能[3]。函数原型为:

OnOpenCom(); //打开并设置串口
ReadThreadFunc(LPVOID lparam); //串口接收线程
OnSeriesRead(CWnd *pWnd, BYTE *buf, int bufLen);
//串口接收数据成功回调函数

串口接收的具体流程图如图2所示,图中对应了串口设置的三个功能函数。

1.3 程序设计的核心代码实现

1.3.1 打开并设置通信串口参数

以同步读取方式打开串口COM1

m_hComm=CreateFile(_T("COM1:"), GENERIC_READ|GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);

//配置串口,得到打开串口的当前属性参数,修改后再重新设置串口。

DCB portDCB;
portDCB.DCBlength=sizeof(DCB); //DCB结构大小
portDCB.BaudRate=CBR_4800; //波特率
portDCB.ByteSize=8; //字符位
portDCB.Parity=NOPARITY; //奇偶校验位
portDCB.StopBits=ONESTOPBIT; //停止位
//设置串口读写时间,配置超时
COMMTIMEOUTS CommTimeouts;
GetCommTimeouts(m_hComm,&CommTimeouts);
CommTimeouts.ReadIntervalTimeout= MAXDWORD;
CommTimeouts.ReadTotalTimeoutMultiplier=0;
CommTimeouts.ReadTotalTimeoutConstant=0;
//指定端口监测的事件集
SetCommMask (m_hComm, EV_RXCHAR);
//分配设备缓冲区
SetupComm(m_hComm,512,512);
//初始化缓冲区中的信息
PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_
RXCLEAR);
m_hReadCloseEvent=CreateEvent(NULL,TRUE,FALSE,
NULL);

1.3.2 GPS定位信息的接收

在成功打开并设置通信口后,在主程序中创建线程函数ReadThreadFunc(LPVOID lparam):

//创建串口接收线程
hRecvThread=CreateThread(0, 0, CommRecvTread, this, 0, &IDThread);
然后在线程函数中采取事件触发方式进行接收处理,通过等待EV_RXCHAR事件的发生来启动ReadFile函数完成对GPS定位信息的接收:
while (TRUE){
if (evtMask & EV_RXCHAR){
ClearCommError(m_hComm,&dwReadErrors,&cmState);
willReadLen = cmState.cbInQue ;
//接收缓冲区中存储的待读取的字符数
readBuf = new BYTE[willReadLen+1];
ReadFile(m_hComm,readBuf,willReadLen,&actualReadLen,0);
readBuf[willReadLen]=0; //如果读取的数据大于0,
if (actualReadLen>0){ //触发读取回调函数 m_OnSeriesRead(ceSeries->m_pPortOwner,readBuf,actualReadLen); }}
如果收到读线程退出信号,则退出线程
if(WaitForSingleObject(ceSeries->m_hReadCloseEvent,500) == WAIT_OBJECT_0) break;

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top