历史上的今天
返回首页

历史上的今天

今天是:2025年02月27日(星期四)

正在发生

2018年02月27日 | Windows CE.NET 4.2中PC与单片机的串行通信

2018-02-27 来源:eefocus

在工业控制中,常需要将单片机采集到的数据传送给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即可从串行端口读取数据:

37.jpg?imageView2/2/w/550

由于Windows CE不支持重叠的I/O操作,所以第5个参数必须设置为NULL。写串行端口也很 简单。调用过程如下:

38.jpg?imageView2/2/w/550

如果从主线程读、写大量的串行数据,主线程就会因为等待相对较慢的串行读或串行写操作而阻塞,不能即时处理其他的消息。因此最好用单独的线程来读写串行端口。

2.3配置串行端口

读和写串行端口比较简单,但是还需要对端口配置好正确的波特率、字符长度、奇偶校验、传输模式等,端口才能正确通信。可以调用I/O设备控制(IOCTL)来配置串行驱动程序,但此操作需要一些底层的知识,并且要有相应的“嵌入工具包”(ETK),而SDK不能实现该操作。除此之外,还有一种更简单的方法,就是调用GetCommState和SetCommState函数配置串行端口。由于配置端口的DCB结构内容较多,所以使用起来比较麻烦。错误地初始化 DCB结构是配置串行端口常见的问题。如果一个串行通信函数没有产生预期的效果,那么错误很可能是在DCB结构体的赋值。在与单片机实现串行通信的时候,由于只用到了RS 232串行口的RXD,TXD和GND三个引脚,而其他的引脚均舍弃不用,所以DCB的成员变量应该如下设置,否则不能正常通信:

39.jpg?imageView2/2/w/550

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事件发生时,调用ClearCommError函数清除通信错误信息,并且获取串口的当前状态,主要是获取串口接收缓冲区中的字节数,然后调用ReadFile函数将接收缓冲区的数据全部读出。最后调用PostMessage函数将这些数据发送给主线程进行处理。

这里存在一个问题:读串口数据操作是在读串口线程中进行的,而处理数据操作是在主线程中进行的,如果上次接收的数据还没处理完,下次的数据又发送给了主线程处理,势必造成混乱。这个问题的解决,涉及到线程间的同步机制。

2.6线程间的同步

在Windows CE中采用同步对象的方法来协调多线程的执行。一个线程监视一个同步对象,当用信号通知该对象时,解除正在阻塞的线程并调度该线程。同步对象包括事件和互斥体两种方式。本文只介绍事件方式。

事件对象是一种有两种信号状态有信号和无信号的同步对象,创建的事件对象可以被不同的线程共享。Windows CE常用等待函数阻塞线程自身的执行,等待其监视的对象产生一定的信号才停止阻塞,继续线程的执行。常用的等待函数有监视单个同步对象的 WaitForSingleObject,和监视多个同步对象的WaitForMultipleObjects。在Windows CE串口通信中,用CreateEvent函数创建事件时,手动设置为有信号状态,以便程序在第一次能够顺利地进入到WaitCommEvent函数处等待串口数据的到来,等到程序读取了串口的数据并发送给主线程处理后,调用ResetEvent函数将事件状态设置成无信号状态,线程就阻塞在 WaitForSingleObject函数处,一直等到主线程把接收到的数据处理完后,再将事件状态用SetEvent函数设置成有信号状态,释放 WaitForSingleObject函数对线程的阻塞,重新进入WaitCommEvent函数处等待串口数据的到来。循环接收、处理串口数据的流程如图1所示。

40.jpg?imageView2/2/w/550

3完整的串行通信程序

头文件定义: 

41.jpg?imageView2/2/w/550

4结语

为了实现Windows CE下PC与单片机的串行通信,本串口通信程序采用自定义的通信协议,在运行Windows 2000的PC机上,用Embedded Visual C++4.0编写,在PC机上编译、调试成功后,下载到运行Windows CE.NET 4.2的工控机上运行,实现了和单片机的正确通信,获得了很好的效果。本程序也能够应用于其他类似的测控应用场合。


参考文献 
[1]傅曦,齐宇.嵌入式系统Windows CE开发技巧与实例[M].北京:化学工业出版社,2003
[2]田东风.Windows CE应用程序设计[M].北京:机械工业出版社,2003
[3][美]Douglas Boling.MICroSOFt Windows CE程序设计[M].北京博彦科技发展有限公司译.北京:北京大学出版社,1999
[4][美]Chris Muench. Windows CE权威指南[M].精英科技译.北京:中国电力出版社,2001.


推荐阅读

史海拾趣

敦泰(FOCALTECH)公司的发展小趣事
压缩机启动电路故障通常涉及启动器和压缩机线圈。如果启动器损坏,可以购买同型号的新启动器进行更换。如果压缩机线圈断路,则可能需要更换整个压缩机。这些维修工作较为复杂,建议由专业维修人员进行操作。
Alcatel-Lucent公司的发展小趣事
首先检查电源插头是否牢固插入插座,然后用万用表测量插座是否有电。如果插座有电但冰箱仍不工作,可以检查冰箱内部的电源线路是否有断路或短路现象。注意,在检查电源线路时务必断电操作,以免发生触电事故。
COTO TECHNOLOGY公司的发展小趣事

随着业务的不断扩展,COTO TECHNOLOGY开始寻求全球范围内的合作与发展。1998年,公司收购了位于荷兰的Philips干簧开关事业部,组建了Coto Technology B.V.,进一步增强了其在全球市场的竞争力。此后,COTO还通过与其他企业的战略合作,不断拓宽业务领域,实现了从单一产品制造商向综合性电子解决方案提供商的转变。

GE公司的发展小趣事

近年来,随着全球电子产业的快速发展,中国市场的重要性日益凸显。COTO TECHNOLOGY也看到了这一机遇,开始深耕中国市场,寻求与当地企业的合作。通过与成都迈极芯科技等公司的战略合作,COTO不仅将先进的技术和产品引入中国,还为中国半导体测试产业提供了更优质的产品和服务。这一系列的合作不仅促进了COTO在中国市场的发展,也推动了中国电子产业的进步。

这五个故事只是COTO TECHNOLOGY发展历程中的一部分,但它们充分展示了这家公司在电子行业中的成长与变迁。从初创时期的线圈绕组制造商,到后来的干簧继电器领导者,再到全球范围内的扩张与战略合作,COTO始终保持着对技术的追求和对市场的敏锐洞察。这些故事不仅反映了COTO的发展历程,也见证了整个电子行业的变革与进步。

ALPS公司的发展小趣事

近年来,随着全球电子产业的快速发展,中国市场的重要性日益凸显。COTO TECHNOLOGY也看到了这一机遇,开始深耕中国市场,寻求与当地企业的合作。通过与成都迈极芯科技等公司的战略合作,COTO不仅将先进的技术和产品引入中国,还为中国半导体测试产业提供了更优质的产品和服务。这一系列的合作不仅促进了COTO在中国市场的发展,也推动了中国电子产业的进步。

这五个故事只是COTO TECHNOLOGY发展历程中的一部分,但它们充分展示了这家公司在电子行业中的成长与变迁。从初创时期的线圈绕组制造商,到后来的干簧继电器领导者,再到全球范围内的扩张与战略合作,COTO始终保持着对技术的追求和对市场的敏锐洞察。这些故事不仅反映了COTO的发展历程,也见证了整个电子行业的变革与进步。

Hitachi Chemical Co America Ltd公司的发展小趣事

进入上世纪六十年代,COTO TECHNOLOGY迎来了一个重大的转折点。公司开始探索线圈绕组以外的领域,通过引入簧片继电器,成功扩展了产品线。这一创新举措不仅丰富了公司的产品种类,更重要的是,它为公司打开了新的市场领域。到了七十年代,COTO更是凭借开发出的首款获得专利的低热电动势簧片继电器,一跃成为业界领先的干簧继电器制造商。

问答坊 | AI 解惑

音频噪音抑制技术

音频噪音抑制技术…

查看全部问答>

Xilinx多媒体应用高性能DSP方案

赛灵思公司 (Xilinx) 今天宣布推出应用优化的赛灵思? XtremeDSP 解决方案,该解决方案可加快多媒体、视频与成像 (MVI) 系统的开发,并扩展基于数字信号处理 (DSP) 处理器的应用的性能。通过提供采用业界最 ...…

查看全部问答>

Cortex-M3,你选择STM还是LM?

STM32系列芯片由于它的低价与高性能,现在是火的不行了,各式各样的开发板到处都是,之前我也有购买一块STM的开发板,不过没怎么去用,最近打算拿出来试着点亮LED,结果发现STM给的数据手册简直无法阅读.扯来扯去的,最简单的GPIO寄存器地址我都差不多找到 ...…

查看全部问答>

请教内存管理问题

请教各位高手, 在win32工程下开发, 内存管理这块,主要用到那些api函数, 小弟头一次要在win32下动态管理内存, 不太熟悉windows系统内存管理, 有劳各位了。…

查看全部问答>

wince下不能使用webServices求助~~

/-----------------webServices 代码----------------------- using System; using System.Collections.Generic; using System.Web; using System.Web.Services; /// /// Summary description for testService /// [WebService(Namespace ...…

查看全部问答>

BT 移植:需要在uclinux 2.4中运行,急!现金5K-1W购买原码.另外招嵌入式开发经理。详细见我们公司网站。

如题,我公司有一个项目需要在uclinux 2.4上移植BT 及emule ,可现金购买。硬件平台是sigma designs 8623。 希望大家帮顶。 另外公司高薪招STB软件开发经理要求如下: 要求: 1、电子、通信、自动化专业,本科以上学历; 2、精通数字电视系统知识 ...…

查看全部问答>

USB RNDIS的下载和调试

最近使用MAINSTONEIII的BSP,使用其USB模拟网口,确不能下载:其调试信息如下: Microsoft Windows CE Ethernet Bootloader Common Library Version 1.1 Built Nov 9 2005 06:15:26 Microsoft Windows CE Ethernet Bootloader 1.11 for the Intel ...…

查看全部问答>

真想骂ST

去年就一直关注STM8L系列. STM8L101系列,晶振都不能接,要串口有个屁用. 波特率不准,工业场合根本不敢用.…

查看全部问答>

建议

斑竹,能不能将广告图片弄的短点啊,原有广告把网页拉得太长了。…

查看全部问答>

单片机原理与应用实例仿真(51)

单片机原理与应用实例仿真(51)…

查看全部问答>