Windows CE.NET 4.2下PC与单片机的串行通信

发布者:GoldenEclipse最新更新时间:2012-02-23 来源: 现代电子技术 关键字:WindowsCE  串行通信  多线程  嵌入式操作系 手机看文章 扫描二维码
随时随地手机看文章

    在工业控制中,常需要将单片机采集到的数据传送给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的成员变量应该如下设置,否则不能正常通信:[page]
    
    
  

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所示。[page]

3完整的串行通信程序

    头文件定义:  
  
  

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.

关键字:WindowsCE  串行通信  多线程  嵌入式操作系 引用地址:Windows CE.NET 4.2下PC与单片机的串行通信

上一篇:基于单片机的红外遥控信号自学习及还原新方法
下一篇:单片机低功耗技术及应用

推荐阅读最新更新时间:2024-03-16 12:53

多核与多线程技术的区别到底在哪里?
毫无疑问的,“多核”、“多线程”此二词已快成为当今处理器架构设计中的两大显学,如同历史战国时代以“儒”、“墨”两大派的显学,只不过当年两大治世思想学派是争得你死我亡,而多核、多线程则是相互兼容并蓄,今日几乎任何处理器都朝同时具有多核多线程的路线发展迈进。 虽然两词到处可见,但可有人知此二者的实际差异?在执行设计时又是以何者为重?到底是该多核优先还是多线程提前?关于此似乎大家都想进一步了解,本文以下试图对此进行个中差异的解说,并尽可能在不涉及实际复杂细节的情形下,让各位对两者的机制观念与差别性有所理解。 行程早于线程 若依据信息技术的发展历程,在软件程序执行时的再细分、再切割的小型化单位上,先是有行程(Process),之
[应用]
51单片机串行通信奇偶校验的设置方法
通常,串行通信的一帧的格式是8-n-1,即8位数据、无校验、1个停止位。 有时为了提高准确度,需要增加一个 奇 校验位或者 偶 校验位。 对于高级语言的做法是很简单的,只要把格式命令 8-n-1 ,改为 8-P-1 或 8-O-1 即可。 串行口在带有校验位的通信方式中,是先发送8位数据,然后再发送校验位。 51单片机也可以按照带有校验位的方式进行串行通信,这在51单片机中称为9位数据方式。 51单片机中有两个位,分别称为TB8和RB8,它们在 无校验 的时候,并没有用处。 当51单片机用9位数据方式进行串行通信的时候,TB8和RB8的作用如下: 51单片机在发送的时候,先发送8位数据,然后发送TB8中的内容; 51单片机在接收
[单片机]
RS-232串行通信消除干扰噪声的设计方法分析
  1通信线路的绝缘设计方法   RS-232的大噪声(干扰)容限可使接口可靠工作,避免对由外部加到导线上的噪声引起的数据错误。在一个充满了电子噪声的连接环境中,绝缘可以防止噪声在连接电路之间的耦合。绝缘通过将一个电路分成一个个独立的块来进行工作。这些块使用光和磁耦合来传送能量和数据,而过滤掉大部分的噪声。   绝缘可以隔开地线、数据连接,或者把两者都隔开。地线绝缘使得一个电路对电源震荡和在被附近电路共用的地线中的噪声有免疫能力。在长的连接中,地线绝缘还使得连接对从一端到另一端的接地电位差异有免疫能力。绝缘数据连接避免了噪声在连接和它所连接到的电路之间的耦合。   大多数的电路连接使用直接的办法,例如焊点或者诸如螺母接线
[嵌入式]
基于DS1075的8051高速单片机串行通信的时钟新配置
1引言 在当今许多实时监测系统与通信系统中,经常需要进行远距离的数据传送,为此,如何实现高速、可靠及低成本的数据传输是前级机或发送级8051单片机迫切需要解决的新技术。据此,笔者采用Dallas Semiconductor公司生产的DS1075芯片-EconOscillator(高效型振荡器)为8051系列高速单片机DS87C520提供时钟的配置设计方案,从而实现了单片机DS87C520串行通信的高速波特率。 与众不同的Econ Oscillator(高效型振荡器)DS1075内含一个振荡器,可用于产生一个基本频率;同时它还内置了一个分频链,可以将基本频率降低到需要的频率。每种Econ Oscillator均可提供四种基本频率
[单片机]
基于DS1075的8051高速单片机<font color='red'>串行通信</font>的时钟新配置
异步串行通信接口的IP核设计
摘要:异步串行通信接口(SCI)因其结构简洁、使用方便,因而在各类MCU、DSP和MPU芯片设计中获得广泛的应用。本文给出一种以状态机为控制核心、以数据流为执行中心的异步串行通信接口IP核结构设计的通用方法。此方法已在笔者所设计的DSP芯片中得到验证。 关键词:SCI IP核设计 状态机 数据流 引言 目前,基于传统IC芯片的微电子应用系统设计技术正在转向基于知识产权(IP,Intellectual Property)核的片上系统(SoC,System on Chip)技术发展。另外,IC设计在国内的发展很快,各种规模的IC设计中心和公司不断出现。因此,IP核的设计已开始逐渐成为国内微电子系统设计的一项支撑技术。从应用功能角
[工业控制]
【ARM】串行通信
异步通信 所谓异步通信,是指数据传送以字符为单位,字符与字符间的传送是完全异步的,位与位之间的传送基本是同步的。 异步串行通信的特点可以概括如下 1)以字符为单位传送信息 2)相邻两字符间的间隔是任意长 3)因为一个字符中的比特们长度有限,所以需要的接收时钟和发送时钟只要相近就可以 4)异步方式的特点简单地说就是:字符间异步,字符内部各位同步 异步串行方式的数据格式 1)1位起始位,规定为低电平0 2)5~8位数据位,即要传送的有效信息 3)1位奇偶校验位 4)1~2位停止位,规定为高电平1 同步串行 所谓同步通信,是指数据传送是以数据块(一组字符)为单位,字符与字符之间、字符内
[单片机]
基于STM32的虚拟多线程(TI_BLE协议栈_ZStack协议栈)
基于STM32的虚拟多线程,可以很好的用于裸机程序中,用于模拟小型操作系统的多线程概念。本实例参考了参考TI_BLE协议栈_ZStack协议栈。 #include Hal_Led/Hal_Led.h #include Hal_delay/delay.h #include Hal_Key/Hal_Key.h #include ringbuffer.h #define APP_LED2_BLINK_EVENT 0x0001 #define HAL_LED1_BLINK_EVENT 0x0001 #define TASK_NO_TASK_RUNNING 0xFF unsigned short Hal_ProcessE
[单片机]
基于STM32的虚拟<font color='red'>多线程</font>(TI_BLE协议栈_ZStack协议栈)
基于VK3366 的DSP 异步串行通信的设计
随着数字信号处理技术和集成电路技术的不断发展,数字信号处理器的可靠性也越来越高,应用亦越来越广。在DSP应用系统中通常需要由DSP接受上位机的控制信号或进行下位机通信,最常见的方式是采用异步串行接口RS 232或RS4 22来实现。本文的信号采集模块采用TMS320C6713B 芯片为例,但没有集成UART接口,因此进行扩展异步串口通讯芯片或者配置McBSP以实现与其他串行设备高速异步通信。本文选择异步串口扩展芯片VK3366进行扩展。 1 数据采集硬件系统设计 数据采集电路系统主要包括:数据信号处理TMS320C6713B 子系统、AIC32 音频采集电路子系统和异步串口扩展芯片VK3366系统等,其逻辑框图如图1所示。
[电源管理]
基于VK3366 的DSP 异步<font color='red'>串行通信</font>的设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved