首页 >> 租房资讯

用实现串行通信的三种方法

2021-09-06 来源:黑龙江租房网

方法三 多线程下实现串行通信

方法一,二适用于单线程通信。在很多工业控制系统中,常通过扩展串口连接多个外设,各外设发送数据的重复频率不同,要求后台实时无差错捕捉,采集,处理,记录各端口数据,这就需要在自定义的串行通信类中创建端口监视线程,以便在指定的事件发生时向相关的窗口发送通知消息。

线程的基本概念可详见VC++参考书目,Windows内部的抢先调度程序在活动的线程之间分配CPU时间,Win 32 区分两种不同类型的线程,一种是用户界面线程UI(User Interface Thread),它包含消息循环或消息泵,用于处理接收到的消息;另一种是工作线程(Work Thread),它没有消息循环,用于执行后台任务。用于监视串口事件的线程即为工作线程。

多线程通信类的编写在端口的配置,连接部分与单线程通信类相同,在端口配置完毕后,最重要的是根据实际情况,建立多线程之间的同步对象,如信号灯,临界区,事件等,相关细节可参考VC++ 中的同步类。

一切就绪后即可启动工作线程:

CWinThrea *CommThread = AfxBegin

Thread(CommWatchThread, // 线程函数名

(LPVOID) m_pTTYInfo, // 传递的参数

THREAD_PRIORITY_ABOVE_NORMAL, // 设置线程优先级

(UINT) 0, // 最大堆栈大小

(DWORD) CREATE_SUSPENDED , // 创建标志

(LPSECURITY_ATTRIBUTES) NULL); // 安全性标志

同时,在串口事件监视线程中:

if(WaitCommEvent(pTTYInfo-idComDev,dwEvtMask,NULL))

{

if((dwEvtMask pTTYInfo-dwEvtMask )== pTTYInfo-dwEvtMask)

{

WaitForSingleObject(pTTYInfo-hPostEvent,0xFFFFFFFF);

ResetEvent(pTTYInfo-hPostEvent); // 置同步事件对象为非信号态

::PostMessage(CSampleView,ID_COM1_DATA,0,0); // 发送通知消息

}

这是由于某些因素的分数有所改善 }

用PostMessage()向指定窗口的消息队列发送通知消息,相应地,需要在该窗口建立消息与成员函数间的映射,用ON_MESSAGE将消息与成员函数名关联。

BEGIN_MESSAGE_MAP(CSampleView, CView)

//{{AFX_MSG_MAP(CSampleView)

ON_MESSAGE(ID_COM1_DATA, OnProcessCom1Data)

ON_MESSAGE(ID_COM2_DATA, OnProcessCom2Data)

.....

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

然后在各成员函数中完成对各串口数据的接收处理,但必须保证在下一次监测到有数据到来之前,能够完成所有的中间处理工作。否则将造成数据的捕捉错误。

多线程的实现可以使得各端口独立,准确地实现串行通信,使串口通信具有更广泛的灵活性与严格性,且充分利用了CPU时间。但在具体的实时监控系统中如何协调多个线程,线程之间以何种方式实现同步也是在多线程串行通信程序实现的难点。

以VC++ 6.0 为工具,实现串行通信的三种方法各有利弊,

根据不同需要,选择合适的方法,将达到事半功倍的效果。在温度监控系统中,笔者采用了方法二,在Window 98 ,Windows 95 上运行稳定,取得了良好的效果。查看本文来源

拉萨治疗白癜风哪好
地奥氨贝治疗效果好吗
石家庄妇科习惯性流产治疗多少钱