物流在现代社会中正扮演着越来越重要的角色。但是,与国外技术密集型的物流行业相比,国内物流行业在信息化、智能化程度上还存在着较大差距。鉴于这样一种状况,本文提出了一个基于WindowsCE平台的物流车载终端设计方案。该物流车载终端以Liod评估板(简称为“Liod板”)为硬件平台,在嵌人式操作系统WindowsCE上实现的功能有:电子地图,实现地图4级缩放、平移、归中功能;无线通信,实现终端与控制中心的GPRS无线通信;GPS定位,定
物流在现代社会中正扮演着越来越重要的角色。但是,与国外技术密集型的物流行业相比,国内物流行业在信息化、智能化程度上还存在着较大差距。鉴于这样一种状况,本文提出了一个基于Windows CE平台的物流车载终端设计方案。该物流车载终端以Liod评估板(简称为“Liod板”)为硬件平台,在嵌人式操作系统Windows CE上实现的功能有:电子地图,实现地图4级缩放、平移、归中功能;无线通信,实现终端与控制中心的GPRS无线通信;GPS定位,定位车载终端当前的位置;称重与打印,读取电子秤数据,实现票据的打印;语音提示,提供更好的人机交互功能。
1 软硬件平台简介
本车载终端以Liod板为硬件平台。Liod板的核心PXA270是一款属于Intel XScale微架构的高性能、低功耗嵌入式处理器。在本设计中要用到的主要有LCD、触摸屏、以太网接口、全功能串口、音频接口等。本设计方案采用Windows CE作为软件平台。Windows CE是一种针对小容量、移动式、智能化设备的多任务、抢占式、模块化实时嵌入式操作系统。Windows CE具有与桌面Windows几乎完全兼容的API接口,为了配合Windows CE上的应用程序开发,微软公司推出了eMbedded Visual C++(简称“eVC”)集成开发环境。本系统采用的是eVC 4.0。
2 硬件设计
2.1 系统硬件设计
在Liod板的基础上扩充了部分外围电路。根据Liod板提供的硬件资源和系统需要使用的硬件情况,硬件设计主要包括两个部分:以太网口转串口电路设计和电子秤硬件电路设计。
无线通信设备采用GPRS Modem。该GPRS Modem通过Liod板的串行口COM1发送和接收数据;GPS定位采用12通道定位模块GARMIN-15L;打印机采用TD58热敏打印机;电子秤采用应变片压力传感器结合C8051F020单片机自行开发;语音提示模块直接使用Liod板提供的音频接口。由于GPS接收模块、热敏打印机、电子秤都要通过串行口与Liod板通信,Liod板原有的串口数量已经无法满足要求,因此采用ZNE-100T以太网转串口模块,把Liod板的以太网口扩充成3个串行口。系统的硬件连接如图1所示。
tr> |
---|
2.2 以太网口转串口电路
该电路的核心转换部分采用ZNE-100T网络模块。经过该电路的转换,对串口的操作映射为通过以太网进行的数据发送和接收。ZNE-100T模块引脚定义如表1所列。
上述引脚中,GPIO0~GPIO4是可控制通用I/O口。在功能板的设计中,使用了3个RS232串口分别发送和接收电子秤数据、打印机数据和GPS数据。本系统采用带有使能控制信号的MAX3221电平转换芯片选择要使用的串口,具体做法是将GPIO0~GPIO2分别连接到3个MAX3221的使能端(EN),这样就可以通过软件来选择需要的串口。使能端均为低电平有效,当有一个串口的使能端为0时,其他两个串口使能端必须为1。
2.3 电子秤硬件设计
电子秤使用应变片压力传感器、AD8221运算放大器和C8051F020芯片进行设计。电子秤硬件电路框图如图2所示。
物品重量通过应变片压力传感器转换成比较微弱的电压信号。此电压信号经过AD822l运算放大器放大,送到C8051F020的ADC1转换器;转换后的数据通过串口发送出去,同时在扩展板的液晶显示屏上显示重量。电子秤的UART0和PC串口都使用9 600 bps的波特率。
C8051F020的ADC1转换器是8位的,因此转换数据是0~255。电子秤的分辨率为20 g,最大称量量程是5.1 kg。
3 软件设计
3.1 电子地图
电子地图模块采用栅格图像实现。栅格图像又称“位图”,由像素点组成。与矢量图像不同,栅格图像在用作电子地图时需要在地图元素和数据之间建立对应关系。
首先对坐标系统进行简单的说明。假设有一个形状为严格矩形的地图,其像素坐标原点为(0,0),地图X轴方向上的宽度假设为W个像素点,Y轴方向的高度假设为H个像素点,某个点的像素坐标为(x,y),则定义该像素点的归一化坐标为(x/W,y/H)。这样,地图左上角的归一化坐标为(0.0,0.0),右下角归一化坐标为(1.0,1.0)。把这样的坐标系统称为“归一化坐标系”。
采用归一化坐标系可以简化栅格地图的多级缩放。由于本终端要将车辆当前的位置显示在地图上,而对于不同的地图级别,地图的分辨率是不一样的。那么,当地图放大或缩小时,车辆对应的像素坐标就会发生改变;但是,在GPS连续的两次更新间隔之间,车辆在地图上的归一化坐标是不会变化的。地图放大或缩小后,只需要用新地图的像素宽度乘以归一化x坐标,即可得到车辆在新地图上的x轴像素坐标;同理,可得车辆在新地图上的y轴像素坐标。这样,坐标计算过程就可以统一起来。本设计中的电子地图模块统一采用归一化坐标系。
根据设计要求,本终端的电子地图支持4级缩放。设计中采用一幅大小为2 251×1 557、格式为BMP的成都地图作为原始地图,即所能支持的最大分辨率的地图。把缩小8倍以后的地图作为所能支持的最小分辨率地图,因此地图级别与放大倍数之间具有如表2所列的对应关系。
程序启动时将所有位图文件载入内存,以加快响应速度。此后,当执行放大或缩小地图的操作时,则将相应的位图显示在屏幕上;同时,根据新的位图大小和车辆的归一化坐标计算出车辆在地图的像素位置,并将车辆位置在地图上显示出来。
就车载终端而言,所覆盖的地理范围相对地球半径来说几乎无穷小,故可以认为该电子地图所对应的经纬度坐标是线性变化的,即地图坐标和GPS坐标之间近似为线性映射关系。此线性映射关系的原理如图3所示。
由于GPS得到的是当前车辆的经纬度坐标,而电子地图模块使用的是归一化坐标系,因此需要在两种坐标之间进行转换。此转换过程是依靠地图左上角点和右下角点这两个基准点来实现的,因此首先需要求得地图左上角和右下角的经纬度坐标。有了这两个数据以后,当从GPS硬件模块读取到经纬度坐标时,根据近似的线性映射关系,就可计算出该坐标在地图上二的归一化坐标,由此可得相应的像素点坐标,即可将车辆位置显示出来。
对于地图左上角点和右下角点的经纬度坐标的求取,通过实际测量的方法是很难做到准确无误的。因此本设计采用一种间接的方法来求得地图左上角和右下角的经纬度坐标。
假设在地图边界内部有两个任意点,把这两个点称为“参考点”,并且已知这两个参考点的经度、纬度、归一化x坐标、归一化y坐标;设参考点1的这4个参数为point1=(lon1,lat1,x1,y1),参考点2的这4个参数为point2=(lon2,lat2,x2,y2),即pointl和point2已知。根据前面的说明可知,左上角点的归一化坐标为(0.0,0.0),而右下角点的归一化坐标为(1.0,1.0)。另外假设左上角点用pointTL表示,其经纬度为lonTL和latTL;右下角点用pointBR表示,其经纬度为lonBR和latBR(TL意即Topleft,BR意即BottomRight),则有pointTL=(lonTL,latTL,0.0,0.0)。同理,对于右下角的点有pointBR=(lonBR,latBR,1.0,1.0)。
由于将经纬度与地图坐标之间近似为线性映射关系,因此根据欧氏几何原理可知,由已知的point1和point2,可以计算出pointTL和pointBR的未知参数:
可见,要得到地图左上角和右下角的经纬度坐标,只需要知道2个参考点的4个参数就可以了。在本系统中,实地采集了3个参考点,得到的数据如表3所列。
根据式(1)和式(2),上面的3个参考点之间两两结合可以求出一组左上角和右下角的经纬度,总共可以有3种组合方案,也就是可以求得3组经纬度值。然后,对这三组经纬度取平均,以减小误差,提高精度。
上述过程是在GPS数据处理模块初始化过程中完成的。为了提高系统的灵活性和可靠性,参考点数据都是存放在外部数据文件中的,因此,需要在程序启动时将相应的数据读入到内存中。为此,专门为参考点定义了一个数据结构(gpx2xy.h):
本设计定义了用于存储参考点信息的数据文件的格式,如表4所列。
上述工作完成之后,参考点数据的存储和读取就比较简单了。基准点和车辆位置的计算都只是简单的代数计算过程,容易实现。至于地图的显示和控制则需要通过Windows CE的API接口来完成。
3.2 GPRS模块
本车载终端采用GPRS Modem与控制中心进行无线数据通信,对GPRS Modem的控制和读写通过串口进行。由于与控制中心交互的数据种类较多,因此定义了相应的应用层数据包格式。数据包的所有字段均采用单字节ASCII编码且为固定长度。在发送端,数值型字段需要在发送前格式化为定长字符串再封装到数据包中;在接收端,需要将数据包中的格式化字符串还原为数值型常量。数值型字段不足部分以字符“0”为前导字符进行填充;字符型字段不足部分以空格(SPACE,0x20)为前导字符填充。字符串型字段的长度不包括字符串结尾的NULL字符(在C语言中为0x00)。所有采用UNICODE编码的字符数据在封装到数据包中之前必须进行转换。
定义的数据包主要有以下几类:客户端位置更新数据包;客户端接件信息数据包;客户端送达签收数据包;服务器新任务数据包;客户端确认数据包;服务器确认数据包;客户端车辆故障数据包;客户端道路堵塞数据包。
为了能够正确解析数据包中的数据,所有数据包都具有相同的包头(head),即数据包类型(packet type)、时间戳标记(time stamp)、数据包顺序号(packet sequencenumber)3个字段。当接收到一个数据包之后,根据包头中的类型字段就能判断该数据包主体部分的长度,由此即可正确解析出包中的内容。包头之后是数据包主体(body)部分,不同数据包类型有着不同的字段和长度。上述8种定义类型之外的数据包均为未定义类型,应当被丢弃。类型为NTSK、TMLF、RCNG的数据包需要接收端的确认;而RECV、SEND、UPDT、CACK、SACK这5种类型的数据包不需要确认。
GPRS Modem的数据传输与接收是通过串口编程来实现的。Windows CE平台上的串口编程依赖于与文件相关的API接口:CreateFile( )打开串口,ReadFile( )从串口读取数据,WriteFile ( )向串口写入数据。由于网络数据包的到来是一个异步过程,因此还需要处理串口的异步事件:GetCommMask( )取得串口已经设置的事件,SetCom-mMask( )设置串口事件集,WaitCommEvent( )等待预先设置的串口事件集中的某一事件发生。
3.3 称重与打印模块
该模块实现了电子称重和凭单打印功能。
由于采用ZNE-100T以太网口转串口模块把Liod板的以太网口扩充为3个串口,因此对外扩的3个串口的访问是通过以太网口进行的,这涉及Windows CE下的网络编程。对外扩串口的控制是通过向ZNE-100T模块的3003端口写入控制命令字来实现的;数据的收发是通过ZNE-100T模块的4001端口实现的。
网络编程接口采用的是Winsock1.1,采用面向连接的TCP协议。对数据的读写采用了非阻塞的方式:写操作直接将数据写到套接口的输出缓冲区中;而数据的读取因为是一个异步过程,因此放在一个单独的线程中完成。在此线程中定义了OnRead( )、OnError( )、OnDisconnect( )回调函数,用于把线程中读取到的数据递交给上层或者处理读取过程中发生的异常事件。
由于打印机、电子秤、GPS都是通过ZNE-100T模块进行控制的,而Liod板提供的以太网口只有一个,因此在任何时刻都只能与打印机、电子秤、GPS三者中的一个通信,而其他两个设备的串口则处于关闭状态。这是通过向ZNE-100T模块的3003端口发送不同的控制命令字完成的。
对于称重,只存在由C8051F020单片机向Liod板的单向数据传输,称量的范围为40 g~5 100g,因此重量数据采用2个字节表示,单位为g。为了确保数据传输的准确,除了2个字节的重量数据之外,还加入了几个字节的冗余数据。电子秤的数据帧格式如下:
其中,0xAA 0x55作为起始标记;结尾处的0x05既表明重量数据帧的长度,也作为结束标记。
就打印机而言,控制命令字和要打印的数据都在同一个数据流中发送给打印机,由打印机去区分命令和数据。由于Windows CE默认支持的字符集是UNICODE字符集,因此输出给打印机的字符需要转换成多字节字符发送给打印机才能正确打印,这是通过标准C提供的wcs-tombs( )库函数实现的。
3.4 语音提示模块
考虑到配送人员在驾驶车辆的过程中不便于时刻留意系统中任务的变化情况,因此在车载终端上加入了语音提示模块。
Windows CE提供了音频API接口:
BOOL WINAPl PlaySound(LPCSTR pszSound,HMOD-ULE hmod,DWORD fdwSound);
该函数的第1个参数表示要播放的音频文件,第2个参数设置为NULL,第3个参数指定影响声音播放的一些标志。因此,语音模块的实现就是在不同的情况下播放不同的提示声音。
4 结 论
基于Liod评估板的车载物流终端集成了电子地图、GPS定位、GPRS无线通信、打印与称重、语音提示等功能。由于采用栅格图像栗实现电子地图,因此通过将小范围内的地理经纬度坐标简化为线性坐标模型,可成功地在栅格图像上实现车辆定位的功能。