首页软件新闻工具软件操作系统办公软件聊天工具多媒体网页制作网页设计网站运营平面设计作品欣赏数据库程序组网
Ghost | Kugoo | 遨游 | Xp | Dw | Fw | Flash | Ps | 迅雷 | CD | ill | CAD | 五笔 | Word | Excel | Wps | Msn | QQ | 学电脑 | Asp | Php | Jsp | 3Dmax | 海报 | 包装 | 标志 | 地产 | 插画

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

来源:未知(读取中...) 2007-5-17 【字体: 】 切换为

 

  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所示。

上一页  [1] [2] [3] [4] 下一页

    相关新闻
    用户评论
数据载入中,请稍后……
评论内容:不能超过250字,不需审核,请自觉遵守互联网相关政策法规。
发表评论: 匿名发表 用户名: loading 位网友发表了评论 查看评论
(0/250)
    推广服务
IT部落推荐阅读
·生活服务
·精彩图文
·赞助商链接