打造国内最大的IC交易平台
技术资料 行业资讯 PDF资料 IC价格 IC替换 缩略语 IC供应 IC采购
一种扩展低成本无线数据通信模块的方法
类别:嵌入式系统  
 
A Method of the Extending of Wireless Data Communication Module for an Embedded Hand-hold Equipment

Abstract: This paper presents a method on how to extend a low cost wireless data communication module for an embedded hand-hold equipment. By studying the hand-hold equipment based on ARM, the problem on how to extend the module is explained in detail, and the method on how to design a communication program under Windows CE operating system is also analyzed. The tests have proved that the wireless data communication module has good validity and reliability.

Key words: Wireless Data Communication; Hand-hold Equipment; WinCE Operation System

摘 要:文中针对一类嵌入式手持设备,提出了一种扩展低成本无线数据通信模块的方法。通过对基于ARM技术的嵌入式手持设备样机的研究,详细地介绍无线数据通信模块的扩展问题,并且分析了在嵌入式操作系统Windows CE下无线通信程序的设计方法。经过测试验证,该类无线数据通信模块具有良好的有效性及可靠性。

关键字:无线数据通信;手持设备;Windows CE操作系统

1引言

嵌入式微处理器技术的成熟与发展,使得像电子字典、掌上电脑等手持设备逐渐地走进人们的生活。本文所指的嵌入式手持设备是特指一类用于数据采集或小数据通信的手持式嵌入式计算机。针对有线数据通信的局限性,提出了一种扩展具有成本低、建设周期短、适应性好、维护佳等特点的无线数据通信模块的方法。文中选用基于嵌入式微处理器ARM9的开发平台及其外围设备作为嵌入式手持设备样机,详细地说明在硬件接口上如何进行无线数据通信扩展及在Windows CE操作系统下如何进行通信程序设计的两个问题。

2无线数据通信基本概念

2.1通信方式

无线数据传输可以大致分为两大类:一是使用专有的无线数据传输系统;二是借用GSM、CDMA等公用网信息平台的传输系统。本文扩展的无线数据通信模块是使用其自身专有传输系统进行数据通信的。

2.2数据传输过程

数据由信源发送出来,经过信源编码器进行初始数据的压缩、打包,再经过信道编码器,运用数字解调器将数字基带信号调制成高频信号发送出去,也就我们所说的数据的频带传输。接收端在按照相反的顺序进行相应的解码即可得到数据。常用的频带调制方法有:振幅键控(ASK)、频移键控(FSK)、相位键控(PSK)等。

2.3性能指标

评价无线数据通信的两个性能指标:有效性和可靠性[1]。

有效性就是指数据的传输速率。常用的3种传输率为码元传输数率、信息传输速率、消息传输速率;可靠性是用差错率来衡量。常用的差错率表达方式为误码率和误信率,它们分别表示码元在传输过程中被传错、传丢的概率。

3硬件扩展

3.1手持设备样机

本文选用的手持设备样机的主体是一块S3C2410X微处理器的开发板,它是由Samsung公司专为移动手持设备类产品所设计[1]的基于ARM920T核微处理器。该处理器内部集成了内存保护单元(MMU)、NAND flash、UART、LCD、USB、SD等控制器。由此嵌入式微处理器构建的开发平台再配合一些输入/输出设备及电源即可构成简单的嵌入式手持设备。

500)this.style.width=500;" border=0>

图1手持设备样机

在软件方面,该手持设备选用了时下非常流行、推广速度最快、普及程度最高、使用最为灵活的Windows CE操作系统[2]。Windows CE是Microsoft公司专为像PDA这样的手持设备而开发的嵌入式操作系统,但是用户可以根据需要,使用平台制定工具Platform Builder进行内核裁剪。而这个过程比较容易,因为它采用图形化的选择方式进行设置,最后将编译好的内核与Bootloader下载到NAND flash中,就可以使用操作系统了。由于Windows CE沿用了传统Windows操作系统的风格,所以对一般用户来讲使用起来并不陌生。

3.2无线数据通信模块

无线数据通信模块大都使用串行接口与其它设备进行连接来完成无线数据通信的扩展,但选择此类接口时应注意串行接口的电平标准。例如,RS232是用正负电压来表示逻辑状态,TTL则以高低电平表示逻辑状态。若要连接不同种的电平接口,需要先进行电平标准的转换。依靠自身为传输系统的无线通信模块的传输距离由几百米到十几千米不等,这主要取决于射频发射芯片的功率大小。无线通信模块的通信速率可设置为2400、4800、9600、19200、38400Bit/s,这些性能参数完全可以满足数据采集与小数据量通信的要求。

500)this.style.width=500;" border=0>

图2 无线模块与串口的连接

本文扩展的无线数据通信模块是基于FSK调制方式的STR-6型无线通信模块。内部的核心是一块Chipcon公司CC1000 RF射频芯片和Atmel公司的微功耗单片机。由于该模块采用了高纠错信道编码技术,因此具有较强的抗干扰能力。它的工作频率在ISM(Industrial,Scientific,Medical)频段,实际传输的误码率仅为10-5~10-6,传输距离可达300米[3]。该无线数据通信模块提供标准的RS-232、RS-485和UART/TTL电平的3种接口方式。由于S3C2410X开发板接有TTL电平的串口,所以采用三线制的交叉接线法与无线数据通信模块的串口进行连接,参见图2。

4程序设计

完成了硬件设备的连接后,需要开发相应的通信程序,这样才完成无线数据通信的整个过程。Windows CE的应用程序可以使用Embedded Visial C++或Embedded Visial Basic等开发工具。本文通信程序的设计选择前者为开发环境,由于它的API函数是Win32 API函数的一个子集,所以在设计或移植应用程序时要慎重使用EVC下的API函数。

由于无线数据通信模块的传输协议透明,所以无线通讯的程序就是在Windows CE操作系统下对串口进行通信程序的设计。

4.1 串口的打开与关闭

在Windows CE的操作系统下,串口设备是作为文件处理的。所以串口的打开、关闭与文件的操作是一样的。用CreateFile函数可打开指定的串口并且返回用于以后在该串口上操作句柄。在应用程序完成相应通信处理之后,调用CloseHandle函数关闭句柄就能关闭串口设备。在该函数调用之后,串口设备关闭之前,会有2秒的延时[4]。

4.2 串口初始化

串口的初始化通常要对传输的速率、位数、停止位、奇偶校验等参数进行设置通过改写DCB结构来实现的。在Windows CE下,延时的设置是相当重要的。用户可以设置COMMTIMEOUTS结构中的时间参数来实现读写操作时的延时值大小。它们的作用是在读写操作结束后,判断是否已经完成了要接收或发送的数据,这样来确定是否延时,若发生延时,读写操作函数将无条件的返回。

初始化时也要对通信事件进行设置,当通信事件发生时,操作系统通知应用程序进行相应的处理。通信事件包括输入中断、握手信号的状态改变、接收到字符、缓冲区中无信息等等。通常设置通信事件为接收到字符为串口通信事件。在初始化时,通过SetupComm函数来完成缓冲区的设置。但实际通信时,当输入/输出缓冲区大小溢出时,操作系统会自动增加缓冲的大小,所以用户在初始化时不必对缓冲设置得太大,以免浪费系统资源。

4.3 数据接收及数据处理

串口接收到字符时,即产生通信事件,这时数据接收线程便会进行数据的存储及处理。在线程中接收数据的原因有两个:

1)操作系统不支持重叠I/O模式,也就是说不能对I/O同时进行读写操作。

2)当调用数据接收函数ReadFile后,其它函数要等到该函数返回或延时发生才能响应[5]。

由于Windows CE支持多线程,所以通信程序的设计中开辟一个线程来进行数据的接收就解决了上述的两个问题。当然,数据的处理可以放在接收数据的线程内进行,也可以放在数据接收线程之外。这要取决于数据发送的频率及应用的需要了。下面是数据接收线程的参考程序片断。

char receiveBuf [100]; //ANSIII码字符数组

DWORD dwBytesRead,dwCommModemStatus;

TCHAR treceiveBuf[200]; //UNICODE码字符数组

while(hport != INVALID_HANDLE_VALUE)

{

SetCommMask (hport, EV_RXCHAR); //设置通信事件

WaitCommEvent(hport,&dwCommModemStatus,0); //线程暂停,直到事件发生

if(dwCommModemStatus==EV_RXCHAR)

{

ReadFile(hport, receiveBuf,20,&dwBytesRead,NULL);//读取ANSIII码

treceiveBuf =ANSIII2UNICODE((char*)receiveBuf);//得到UNICODE码

……//数据处理

}

SetCommMask (hport, EV_RXCHAR); //设定等待事件

}

4.4 数据发送

同数据接收相同,数据发送也要在线程内完成。按照用户发送数据的需要,可以把数据发送放在主线程中使用WriteFile实现。由于STR-6无线通信模块是半双工的,并且操作系统也不支持重叠I/O,所以数据的发送与接收线程并不存在互斥问题,即发送时不能接收,接收时不能发送。

DWORD dwBytesWritten;

if(hport != INVALID_HANDLE_VALUE)

{

TCHAR tsendBuf[200];

char *sendBuf;

……//得到要发送的数据,放到tsendBuf里去

sendBuf =UNICODE2 ANSIII ((char*) tsendBuf);//调用字符转换函数

WriteFile(hport,sendBuf,100,&dwBytesWritten, NULL);//向串口写数据

}

4.5 字符转换

与普通Windows操作系统的ANSII编码方式不同,Windows CE使用的是UNICODE编码方式。ANSII编码方式中的一个字符的长度是8bit,而UNICODE是16bit。例如字符‘A’,它的ANSII码为41,而UNICODE码就为00 41。

在数据发送前和接收后,需要进行ANSII与UNICODE字符的相互转换。下面举一个UNICODE2ANSII()函数的编写过程,其核心就是使用了两次API函数WideCharToMultiByte。

//读取要进行转换的UNICODE字符到lpWideCharStr缓冲区

……

//计算从UNICODE转换到ANSII后需要的字节数

intmultibytelen=WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK|WC_DEFAULTCHAR, lpWideCharStr, -1, 0, 0, 0,0);

//开辟multibytelen字节的ANSII缓冲区

……

//转换UNICODE到ANSII,并返回ANSII字符指针

WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK|WC_DEFAULTCHAR,lpWideCharStr,-1,lpMultiByteStr,multibytelen, 0,0);

同理,反方向的转换可由MultiByteToWideChar函数来实现,程序编写的步骤是类似的,详细地使用方法可参见帮助文件。

5总结

本文将无线数据传输模块成功地扩展到一类嵌入式手持设备中,解决了原有的有线数据通信带来的布线麻烦、通信距离短、维护困难等问题,并且在嵌入式Windows CE操作系统中运用多线程实现无线数据通讯及编码字符转换等软件设计问题。在实际的多组通信测试表明中,该类无线数据传输模块表现了很好的可靠性和有效性。

参考文献:

[1]张敬堂等.现代通信技术.北京:国防工业出版社,2002:1-4

[2]陈赜等.ARM9嵌入式技术及Linux高级实践教程.北京:北京航空航天大学出版社,2005:9

[3]崔海霞等.WinCE中基于XML的数据同步[J].微计算机信息,2004年第7期84页

[4]STR-6型微功率无线数传模块使用说明书

[5]叶宏材等,Windows CE.NET嵌入式工业用控制器及自动控制系统设计.北京:清华大学出版社,2004:68

作者简介:

张庆杰,男,1981年生,汉,在读硕士,模式识别与智能系统专业。

Email:z.q.j@hotmail.com。

朱华勇,男,1971年生,汉,副教授,模式识别与智能系统专业。

Email:nethead@vip.sina.com。

通信地址:410073,湖南省长沙市国防科学技术大学机电工程与自动化学院任务规划研究中心