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

发布者:幸福梦想最新更新时间:2018-02-27 来源: eefocus关键字:Windows  NET  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即可从串行端口读取数据:

37.jpg

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

38.jpg

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

2.3配置串行端口

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

39.jpg

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

3完整的串行通信程序

头文件定义: 

41.jpg

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.


关键字:Windows  NET  PC  单片机  串行通信 引用地址:Windows CE.NET 4.2中PC与单片机的串行通信

上一篇:单片机数据通信:模拟SPI数据传输
下一篇:串行EEPROM X24128与AT89C51的接口及编程

推荐阅读最新更新时间:2024-03-16 15:55

单片机C语言程序设计之T0控制LED实现二进制计数
AT89C51单片机是美国ATMEL公司生产的低电压、高性能CMOS 8位单片机,具有丰富的内部资源:4kB闪存、128BRAM、32根I/O口线、2个16位定时/计数器、5个向量两级中断结构、2个全双工的串行口,具有4.25~5.50V的电压工作范围和0~24MHz工作频率,使用AT89C51单片机时无须外扩存储器。 单片机C语言程序设计之T0控制LED实现二进制计数 T0控制LED实现二进制计数原理图 T0控制LED实现二进制计数程序设计 /* 名称:T0 控制 LED 实现二进制计数说明:本例对按键的计数没有使用查询法,没有使用外部中断函数,没有使用定时或计数中断函数。而是启用了计数器,连接在 T0 引脚的按键每次按
[单片机]
<font color='red'>单片机</font>C语言程序设计之T0控制LED实现二进制计数
STM32F407用USART2与HC06蓝牙模块通信
笔者曾经使用STM32F103做过些小东西,想着迁移到F407应该很容易,未曾想事情并不简单,有很多坑被我踩到了。本文主要讲述利用建立STM32F407的USART2与HC06蓝牙模块进行通信。本文写的尽量详细简单,让初学ARM的新手也能看懂,同时也涉及到一些容易出错的细节,供大家参考和指正。 本文主要分下面几块来写: STM32F407用USART2与HC06蓝牙模块通信 串口通信原理 HC06蓝牙模块 STM32F407的USART2配置 串口通信原理 想必玩过一点单片机的人都懂一点串口通信,而恐怕我们印象中的串口通信不过如此,两个芯片通过串口通信,需要共地、Tx(发送)和Rx(接收)相互连接即可
[单片机]
单片机学习札记之8 内部EEPROM的配置和使用
失,STC单片机的EEPROM不是真正的EEPROM,比如AT24C02,那才是真正的EEPROM,可以每次按字节擦除数据,而STC15W的都是用Flash模拟的,以512字节是一个扇区,每次擦除数据,必须全部擦除掉才可以,考虑到应用比较简单,用内部的EEPROM就凑合用吧。 接下来,我们测试下单片机内部的EEPROM是不是能够正常的存储我们的数据,能够掉电不丢失数据,测试前,我们先来移植STC关于EEPROM使用的例程,不需要改动,拿过来使用就好了。 然后,我们写一个程序,程序的功能是在指定的地址上读取数据,然后写入一个新的数据,每次上电,数据记忆上电次数,显示在数码管上 将程序编译之后下
[单片机]
<font color='red'>单片机</font>学习札记之8 内部EEPROM的配置和使用
一键变身+4D震感 iQOO Pro游戏体验更加全面
今天,iQOO官方微博发布了一张海报:“你想要一部游戏手机,还是想让你的手机随时变成游戏机。”可以肯定的是,作为一台性能旗舰,iQOO Pro手机游戏体验部分的表现将值得期待。同期,iQOO产品经理也表示,iQOO Pro是生而强悍的延伸,游戏只是展现强悍性能的方式之一,对于此,iQOO Pro已经做出权衡。 发展到现在,手机已经与大家的日常生活形影不离,而单纯的将手机定性为游戏手机是伪命题。毕竟手机充当的角色越来越多元化,而游戏仅仅是其中的一个部分。甚至,用来衡量性能上,游戏也只是一个代表,绝对不是生活或者性能的全部。这是手机绝对区隔于游戏主机的本质区别,即手机的全面考量维度更广,不会像游戏主机一样单纯。 从iQOO一代
[手机便携]
基于AT89C2051单片机的视频监控矩阵切换器设计
1  引言   在重大事件、零售场、交通控制等方面,都需要进行视频监控。视频监控系统中存在多点分布与集中监控的矛盾,不适合采用一对一的监视。一对一的监视即一部摄像机对应一台监视器,这样监控室体积庞大,投资高。一般采用一对多的监控,即一台监视器对应多台摄像机,用足够少的监视设备实现多点监控,这样视频切换控制设备在监控系统中具有极其重要的地位。在视频切换控制中,矩阵切换应用十分广泛。   2  视频矩阵切换原理   视频矩阵切换控制将多路输入信号任意选择一路或多路分别输出给一路或多路显示设备,用于规模较大的监控系统中。它可以选择性地观察图像,指定在某台监视器上输出显示。   在多路视频输入的情
[单片机]
基于AT89C2051<font color='red'>单片机</font>的视频监控矩阵切换器设计
安卓机5G AP后道测试出货Q4或将下降
业内消息人士称,鉴于中国大陆手机厂商芯片需求或将下降,据中国台湾地区封测厂预计,用于5G安卓手机的AP后道测试出货量将在2021年第四季度下降。 《电子时报》援引上述人士称,由于中国大陆手机厂商向联发科下单量的减少,预计第四季度采用7nm制程的5G AP的测试需求将下降10%-20%。根据此前报道,相关芯片供应商可能在该季度略微减少出货量。 消息人士表示,由于早些时候的大举囤货,中国大陆手机供应商目前仍有足够的5G AP库存,第四季度的销售前景仍不明朗,但预期苹果iPhone13系列有望获得市场动能。封测厂仍将可能获得新的5G AP测试订单,但最早可能要等到明年第一季度。 事实上,据联发科此前预计,尽管台积电提供了强大的代工支持,
[手机便携]
浅谈单片机c语言模块化编程-附ds1302时钟芯片驱动程序
在单片机c语言编程中,模块化编程显得非常重要。我觉得,模块化恰恰体现了c语言很好的可移植性。嵌入式编程中,硬件模块区分非常明显,所以驱动程序用模块化编程显得十分方便简洁。 报错原因,修改了不能修改的变量。 C51中为了节省ram资源,数组用code定义在rom中,这样定义数组就不能重新赋值。 自己对着例程一条一条的看。真心表示没有发现错误。最后把函数一个一个替换成例程中的。最终确定在ds1302_write_byte中。发现了一个很奇特的事情。错误是因为fou循环,我用for(i=0;i 8;i++)替换成为for(i=8;i 0;i--)解决了问题。 extern可以置于变量或者函数前,以表示变量或者函数的定
[单片机]
RTOS实现双核MCU消息通信
手机、电脑多核的CPU你可能经常看见,但多核的单片机相对来说就不那么常见了。随着需求的增加、技术的进步,单片机已不再局限于单核了,因此,近几年陆续出现了双核的单片机了。 你可能会好奇,双核单片机之间怎么通信?其实,通信的方式和方法有很多种。本文就给大家描述一下:使用FreeRTOS消息缓冲区,实现简单的非对称多处理(AMP)核心到核心通信,结合STM32H7(M4和M7) 双核处理器为例。 分享正文之前推荐一个嵌入式招聘信息的平台: 概述 实现STM32H7双核之间通信是FreeRTOS官方提供的一个方案,是基于FreeRTOS消息缓冲区,该消息缓冲区是无锁循环缓冲区,可以将大小不同的数据包从单个发送方传递到单个接收方。
[单片机]
RTOS实现双核<font color='red'>MCU</font>消息通信
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

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