网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 
中国网管联盟
Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道
 当前位置: > bitsCN.com > DotNet > VC.NET > 用VC 6.0实现串行通信的三种方法  

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

2007-07-03  作者:bitsCN整理  来源:中国网管联盟  点评 投稿 收藏

  

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

网管u家www.bitscn.net

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

网管有家bitscn.net

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

网管下载dl.bitscn.com

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

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

网管bitscn_com

CWinThrea *CommThread = AfxBeginThread(CommWatchThread, // 线程函数名
(LPVOID) m_pTTYInfo, // 传递的参数
THREAD_PRIORITY_ABOVE_NORMAL, // 设置线程优先级
(UINT) 0, // 最大堆栈大小
(DWORD) CREATE_SUSPENDED , // 创建标志
(LPSECURITY_ATTRIBUTES) NULL); // 安全性标志  
中国网管联盟bitsCN.com

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

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); // 发送通知消息
 }
}  
网管朋友网www_bitscn_net

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

BEGIN_MESSAGE_MAP(CSampleView, CView)
//{
{
 AFX_MSG_MAP(CSampleView)ON_MESSAGE(ID_COM1_DATA, OnProcessCom1Data) ON_MESSAGE(ID_COM2_DATA, OnProcessCom2Data)
.....
/
TAGs   通信   方法   实现   串口   串行   //   设置   线程   事件       函数      
用VC 6.0实现串行通信的三种方法 评论:
loading.. 评论加载中…
评论:请自觉遵守互联网相关政策法规,评论不得超过250字。

验证码: 注册用户