Windows CE.NET 4.2下PC与单片机的串行通信
在工业控制中,常需要将单片机采集到的数据传送给PC机处理、显示,并且根据处理结果给单片机发送控制命令。串行通信虽然传送速度相对较慢,但是传送成本低,对实现监视和控制,具有足够的带宽,并且没有过于复杂的编解码,实现自定义的协议也不复杂,因而在工业自动化、通信和军事等领域的应用十分广泛。随着Windows CE嵌入式操作系统在工业控制中的广泛应用,设计和实现Windows CE下PC与单片机的串行通信具有重要的意义。
1Windows CE.NET 4.2简介
Windows CE 是一个面向移动计算和嵌入式应用的操作系统,其突出优点是模块化、可定制性、完备性、实时性、通信能力强大和基于Win32应用程序编程接口。 Windows CE.N ET 4.2是为嵌入式市场重新设计的Windows CE 3.0的后继产品,为快速建立下一代智能移动和小内存占用的设备提供了一个健壮的实时操作系统。他包括创建一个基于定制设备的Wi ndows CE所需的一切。
2Windows CE.NET 4.2下的串行通信技术
串行端口在Windows CE.NET 4.2(以下简称Windows CE)下属于流接口设备,他是串行设备接口常规I/O驱动程序的调用与通信相关的具体函数的结合。串行设备被视为用于打开、关闭和读写串行端口的常规的可安装的流设备。Windows CE的串口函数和Windows的串口函数基本相同,但有几点值得注意:
(1)Windows CE只支持Unicode字符集,在编程时必须特别注意。
(2) Windows CE不支持重叠的I/O操作。
2.1打开和关闭串行端口
在所有的流设备驱动程序中,均使用CreateFile来打开串行端口设备,如果这个端口不存在,CreateFile返回 ERROR_FILE_NOT_FOUND。因此,用户指定的端口必须是存在并且可用的,而且要遵循Windows CE流接口设备驱动程序的命名规则,即COM后接要打开的端口号再紧跟一个冒号。
HANDLE hPort = CreateFile (_T(COM1:),
GENERIC_READ|GENERIC_WRITE, 0,NULL,
OPEN_EXISTING,0,NULL);
关闭串行端口比较简单,调用CloseHandle函数就能关闭一个打开的串行端口。CloseHandle只有一个参数,即调用CreateFile函数打开端口时返回的句柄,方法如下:
CloseHandle (hPort);
2.2读写串行端口
正如使用CreateFile打开串行端口一样,可以使用ReadFile和WriteFile函数来读写串行端 口。假设已经调用CreateFile成功地打开了串行端口,那么只需调用ReadFile即可从串行端口读取数据:
由于Windows CE不支持重叠的I/O操作,所以第5个参数必须设置为NULL。写串行端口也很 简单。调用过程如下:
如果从主线程读、写大量的串行数据,主线程就会因为等待相对较慢的串行读或串行写操作而阻塞,不能即时处理其他的消息。因此最好用单独的线程来读写串行端口。
2.3配置串行端口
读和写串行端口比较简单,但是还需要对端口配置好正确的波特率、字符长度、奇偶校验、传输模式等,端口才能正确通信。可以调用I/O设备控制(IOCTL)来配置串行驱动程序,但此操作需要一些底层的知识,并且要有相应的“嵌入工具包”(ETK),而SDK不能实现该操作。除此之外,还有一种更简单的方法,就是调用GetCommState和SetCommState函数配置串行端口。由于配置端口的DCB结构内容较多,所以使用起来比较麻烦。错误地初始化 DCB结构是配置串行端口常见的问题。如果一个串行通信函数没有产生预期的效果,那么错误很可能是在DCB结构体的赋值。在与单片机实现串行通信的时候,由于只用到了RS 232串行口的RXD,TXD和GND三个引脚,而其他的引脚均舍弃不用,所以DCB的成员变量应该如下设置,否则不能正常通信:
2.4设置超时值
对于串行端口来说,还必须配置超时值,否则程序可能陷入到一个等待来自串口字符的死循环。通常,配置超时值和配置串口类似。首先用 GetCommTimeouts函数获取当前串口的超时值,然后修改CommTimeouts成员变量的值,最后用SetCommTimeouts设置新的超时值。
2.5异步多线程通信
虽然Windows CE不支持重叠I/O,但还是可以使用多个线程来实现同样的操作。当主线程正忙时,需要做的就是运行单独的线程来处理同步I/O操作。除了使用用于读和写的单独线程以外,Windows CE还支持Win32的WaitCommEvent函数,该函数将线程阻塞,直到预先设定的串行通信事件中的一个发生。该函数一般和函数 SetCommMask配合起来使用,SetCommMask设置WaitCommEvent要等待的串口事件。一般的使用方法是:
先调用SetCommMask函数设定要等待的串口事件,例如串口有数据到来(EV_RXCHAR)事件;然后在读串口线程中调用WaitCommEvent阻塞线程,等待EV_RXCHAR事件的发生。当等
待的EV_RXCHAR事件
串行 通信 单片机 PC CE NET 4 2 Windows 相关文章:
- 高速DSP串行外设接口设计 (03-11)
- MSP430与I2C总线接口技术的研究(06-14)
- DSP 与PC 机串行通讯的设计(01-13)
- TMS320LF2407 DSP控制器的串行通信设计(01-26)
- TMS320C3x DSP和PC机的异步串行通信设计(03-02)
- MAX5121及其在DSP系统中的应用(06-05)