基于WindowsCE的物流车载终端设计
扫描二维码
随时随地手机看文章
提出一种基于Windows CE嵌入式操作系统的物流车载终端设计方案。在此方案中集成了电子地图、GPS定位、GPRS无线通信、热敏打印机、电子秤等功能。文中给出了相应的实现及测试结果。
物流在现代社会中正扮演着越来越重要的角色。但是,与国外技术密集型的物流行业相比,国内物流行业在信息化、智能化程度上还存在着较大差距。鉴于这样一种状况,本文提出了一个基于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通道定位模块GARMIN15L;打印机采用TD58热敏打印机;电子秤采用应变片压力传感器结合C8051F020单片机自行开发;语音提示模块直接使用Liod板提供的音频接口。由于GPS接收模块、热敏打印机、电子秤都要通过串行口与Liod板通信,Liod板原有的串口数量已经无法满足要求,因此采用ZNE100T以太网转串口模块,把Liod板的以太网口扩充成3个串行口。
系统的硬件连接如图1所示。
图1 系统硬件连接示意图
表1 ZNC-100T模块引脚定义
上述引脚中,GPIO0~GPIO4是可控制通用I/O口。在功能板的设计中,使用了3个RS232串口分别发送和接收电子秤数据、打印机数据和GPS数据。本系统采用带有使能控制信号的MAX3221电平转换芯片选择要使用的串口,具体做法是将GPIO0~GPIO2分别连接到3个MAX3221的使能端(EN),这样就可以通过软件来选择需要的串口。使能端均为低电平有效,当有一个串口的使能端为0时,其他两个串口使能端必须为1。
2.3 电子秤硬件设计
电子秤使用应变片压力传感器、AD8221运算放大器和C8051F020芯片进行设计。电子秤硬件电路框图如图2所示。
图2 电子秤硬件电路框图
物品重量通过应变片压力传感器转换成比较微弱的电压信号。此电压信号经过AD8221运算放大器放大,送到C8051F020的ADC1转换器;转换后的数据通过串口发送出去,同时在扩展板的液晶显示屏上显示重量。电子秤的UART0和PC串口都使用9 600 bps的波特率。
C8051F020的ADC1转换器是8位的,因此转换数据是0~255。电子秤的分辨率为20 g,最大称量量程是5.1 kg。
3 软件设计
3.1 电子地图
电子地图模块采用栅格图像实现。栅格图像又称“位图”,由像素点组成。与矢量图像不同,栅格图像在用作电子地图时需要在地图元素和数据之间建立对应关系。
表2 地图级别与放大倍数的对应关系
首先对坐标系统进行简单的说明。假设有一个形状为严格矩形的地图,其像素坐标原点为(0,0),地图X轴方向上的宽度假设为W个像素点,Y轴方向的高度假设为H个像素点,某个点的像素坐标为(x,y),则定义该像素点的归一化坐标为(x/W,y/H)。这样,地图左上角的归一化坐标为(0.0,0.0),右下角归一化坐标为(1.0,1.0)。把这样的坐标系统称为“归一化坐标系”。
采用归一化坐标系可以简化栅格地图的多级缩放。由于本终端要将车辆当前的位置显示在地图上,而对于不同的地图级别,地图的分辨率是不一样的。那么,当地图放大或缩小时,车辆对应的像素坐标就会发生改变;但是,在GPS连续的两次更新间隔之间,车辆在地图上的归一化坐标是不会变化的。地图放大或缩小后,只需要用新地图的像素宽度乘以归一化x坐标,即可得到车辆在新地图上的X轴像素坐标;同理,可得车辆在新地图上的Y轴像素坐标。这样,坐标计算过程就可以统一起来。本设计中的电子地图模块统一采用归一化坐标系。
图3 经纬度坐标线性映射示意图
根据设计要求,本终端的电子地图支持4级缩放。设计中采用一幅大小为2 251×1 557、格式为BMP的成都地图作为原始地图,即所能支持的最大分辨率的地图。把缩小8倍以后的地图作为所能支持的最小分辨率地图,因此地图级别与放大倍数之间具有如表2所列的对应关系。
对于地图左上角点和右下角点的经纬度坐标的求取,通过实际测量的方法是很难做到准确无误的。因此本设计采用一种间接的方法来求得地图左上角和右下角的经纬度坐标。
假设在地图边界内部有两个任意点,把这两个点称为“参考点”,并且已知这两个参考点的经度、纬度、归一化x坐标、归一化y坐标;设参考点1的这4个参数为point1=(lon1, lat1, x1, y1),参考点2的这4个参数为point2=(lon2, lat2, x2, y2),即point1和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的未知参数:
上述工作完成之后,参考点数据的存储和读取就比较简单了。基准点和车辆位置的计算都只是简单的代数计算过程,容易实现。至于地图的显示和控制则需要通过Windows CE的API接口来完成。
3.2 GPRS模块
本车载终端采用GPRS Modem与控制中心进行无线数据通信,对GPRS Modem的控制和读写通过串口进行。由于与控制中心交互的数据种类较多,因此定义了相应的应用层数据包格式。数据包的所有字段均采用单字节ASCII编码且为固定长度。在发送端,数值型字段需要在发送前格式化为定长字符串再封装到数据包中;在接收端,需要将数据包中的格式化字符串还原为数值型常量。数值型字段不足部分以字符“0”为前导字符进行填充;字符型字段不足部分以空格(SPACE,0x20)为前导字符填充。字符串型字段的长度不包括字符串结尾的NULL字符(在C语言中为0x00)。所有采用UNICODE编码的字符数据在封装到数据包中之前必须进行转换。
定义的数据包主要有以下几类:客户端位置更新数据包;客户端接件信息数据包;客户端送达签收数据包;服务器新任务数据包;客户端确认数据包;服务器确认数据包;客户端车辆故障数据包;客户端道路堵塞数据包。
为了能够正确解析数据包中的数据,所有数据包都具有相同的包头(head),即数据包类型(packet type)、时间戳标记(time stamp)、数据包顺序号(packet sequence number)3个字段。当接收到一个数据包之后,根据包头中的类型字段就能判断该数据包主体部分的长度,由此即可正确解析出包中的内容。包头之后是数据包主体(body)部分,不同数据包类型有着不同的字段和长度。上述8种定义类型之外的数据包均为未定义类型,应当被丢弃。类型为NTSK、TMLF、RCNG的数据包需要接收端的确认;而RECV、SEND、UPDT、CACK、SACK这5种类型的数据包不需要确认。
GPRS Modem的数据传输与接收是通过串口编程来实现的。Windows CE平台上的串口编程依赖于与文件相关的API接口:CreateFile()打开串口,ReadFile()从串口读取数据,WriteFile()向串口写入数据。由于网络数据包的到来是一个异步过程,因此还需要处理串口的异步事件:GetCommMask()取得串口已经设置的事件,SetCommMask()设置串口事件集,WaitCommEvent()等待预先设置的串口事件集中的某一事件发生。
3.3 称重与打印模块
该模块实现了电子称重和凭单打印功能。
由于采用ZNE100T以太网口转串口模块把Liod板的以太网口扩充为3个串口,因此对外扩的3个串口的访问是通过以太网口进行的,这涉及Windows CE下的网络编程。对外扩串口的控制是通过向ZNE100T模块的3003端口写入控制命令字来实现的;数据的收发是通过ZNE100T模块的4001端口实现的。
网络编程接口采用的是Winsock1.1,采用面向连接的TCP协议。对数据的读写采用了非阻塞的方式:写操作直接将数据写到套接口的输出缓冲区中;而数据的读取因为是一个异步过程,因此放在一个单独的线程中完成。在此线程中定义了OnRead()、onError()、OnDisconnect()回调函数,用于把线程中读取到的数据递交给上层或者处理读取过程中发生的异常事件。
由于打印机、电子秤、GPS都是通过ZNE100T模块进行控制的,而Liod板提供的以太网口只有一个,因此在任何时刻都只能与打印机、电子秤、GPS三者中的一个通信,而其他两个设备的串口则处于关闭状态。这是通过向ZNE100T模块的3003端口发送不同的控制命令字完成的。
对于称重,只存在由C8051F020单片机向Liod板的单向数据传输,称量的范围为40 g~5 100 g,因此重量数据采用2个字节表示,单位为g。为了确保数据传输的准确,除了2个字节的重量数据之外,还加入了几个字节的冗余数据。电子秤的数据帧格式如下:
参考文献
[1] 陈章龙,唐志强,涂时亮. 嵌入式技术与系统——Intel XScale结构与开发[M]. 北京:北京航空航天大学出版社,2004.
[2] 毛德操,胡希明. 嵌入式系统——采用公开源代码和StrongARM/Xscale处理器[M]. 杭州:浙江大学出版社,2004.
[3] 候俊杰. 深入浅出MFC[M]. 第2版. 武汉:华中科技大学出版社,2004.
[4] 汪兵,李存斌,陈鹏. EVC高级编程及其应用开发[M]. 北京:中国水利水电出版社,2005.
[5] 田东风. Windows CE应用程序设计[M]. 北京:机械工业出版社,2003.
[6] 童长飞. C8051F系列单片机开发与C语言编程[M]. 北京:北京航空航天大学出版社,2005.
[7] MapInfo公司. MapX Help Online.
[8] 同志工作室. Visual Basic 6.0 API函数开发实例[M]. 北京:人民邮电出版社,2000.
陈云川、刘锋(硕士研究生),主要研究方向为嵌入式应用。