RSS

基于多线程技术的异步串行通信应用

发布时间:2006-12-31 关键字: 通信 技术 基于 线程 串口 串行 系统

2.3  协调线程
当编写线程执代码时,必须考虑到可能同步执行的其他线程的行为。特别要避免两个线程试图同时使用相同的全局对象或变量;另一方面,一个线程中代码可能会依赖其他线程所执行任务的结果。在C+ + Builder中,系统均提供了相应的机制来协调线程间的行为,达到避免冲突并发挥多线程优点的目的。

3  多线程方式下的串行通信
利用C++ Builder开发串口通信软件一般有两种方法:其一是利用Windows的API函数,其二是采用微软的MSComm控件。相对于API函数的方式, MSComm控件使用简单,但可靠性差一些,另外考虑到系统的兼容性和可移植性,推荐使用Windows的API函数来开发相关的串口通信软件。除了上述两种开发方式以外,开发者还可以使用第三方软件供应商针对C++ Builder开发的专用的串行通信组件,这些组件其实已经把Windows API函数以及多线程编程封装在其中,对用户而言只需要像使用普通组件一样来使用它们。但这种方式下,开发者受制于第三方组件的应用条件和功能,不利于自己的功能扩展。
除了少量简单应用外,要利用Windows API函数实现串行通信就必须采用多线程技术。使用多线程实现串行通信需要创建几个相关的线程,除了主线程以外,还包括串口监控线程串口监控线程也可以单独创建为串口线程串口线程。主线程即系统主程序,一般情况下就是这个主线程被提取到CPU执行,它负责系统功能的实现,同时也完成对串口的打开、关闭和初始化;当主线程在CPU执行时,应用程序还可以创建监控线程,用以监测串口的状态变化,对发生的串口事件做出反应。如果整个系统对串口的读写操作不会发生冲突,那么就可以把串口线程串口线程合并到监控线程中,在监控线程中完成串口数据的读写操作。主线程中创建的线程都有各自的执行周期,监控线程的生命期的长短取决于主线程的功能要求。
线程方式下,系统的功能块被明确地分开,各个线程完成各自的工作,这样的设计使得线程之间的协调和同步变得尤为重要,所以,在多线程程序设计中,线程之间的同步问题是一个设计的难点。

4  应用实例
下面给出了一个利用串行口进行高速数据采集的应用系统实例,该系统完成对某集群信道通信数据的采集工作。系统中的PC机要实时接收下位机所发送的大量数据,并完成对数据的实时存储;PC机对下发的数据很少,且是在串口数据接收、存储并处理完毕后才发送一个命令信号给下位机。由于系统实时性的要求,本文采用了多线程机制来分别实现PC机的串行通信功能和后台的数据处理功能,单片机作为下位机完成对数据采集设备的控制并完成对PC机的数据传输。
4.1  PC机通信模块
根据上述的系统功能描述,在应用程序中创建一个串口监控线程,用于读串口,完成串行数据接收;因为下发的数据量很小,所以写串口的操作在主线程中完成就可以了。主线程的功能是完成对串口的操作,对数据的存储和处理以及提供良好的人机界面。串口监控线程的功能是完成对串口的实时监控,捕捉串口事件,完成数据接收,并通过消息机制向主线程发送接收到的数据。为了方便对串口进行操作,系统设计了一个串口类,封装了同操作串口通信相关的Windows的API函数。
线程的程序流程如图1所示:

 

 

 

图1     主线程程序流程图

最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册