首页 > 范文大全 > 正文

基于MFC的多线程与串口通信

开篇:润墨网以专业的文秘视角,为您筛选了一篇基于MFC的多线程与串口通信范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

【摘要】本人结合研究生阶段所做的项目经验和相关参考书籍完成本文,本文基于mfc的基础上,简要阐述了多线程的概念、分类及其相关联的应用和优势,并且着重介绍其在串口通信中的应用,并附着曾经项目中的关键程序段,而且给予了相应的解释。

【关键词】计算机科学与技术;MFC;多线程;串口通信

随着信息技术的发展,更新更快更方便的通信方式才会满足大众口味,本文基于曾经参与的雷达模拟器项目的相关经验完成,该项目主要是实现在微机室中能够模拟海上航行工程中教练的与学员的船只之间的指挥、调度等通信过程,有着很大的实用价值。本项目用VC6.0开发,大致分为三部分即教练船,本船和操作舵,本文提取的是教练船与本船(即学员船)之间的通信部分,基于此基础上研究多线程技术在串口通信中的应用。

1.基于MFC的多线程

在Windows应用程序开发时, 有两种主要方法: 基于Windows API 的开发方法和基于Windows MFC 的开发方法。后者借助于类向导的帮助,简化了程序开发的过程并减少了开发的工作量和难度。本文研究的重点就是基于VC ++的MFC 多线程通信程序及其在串口通信中的应用。多线程应用程序比单线程应用程序要考虑更多的因素,但它有着明显的好处。在MFC类库中,提供了多线程编程的支持,基本原理与基于Win32 API 函数的设计一致,但由于MFC对同步对象作了封装,因此对用户编程实现来说更加方便。在MFC 中,线程分为两种:用户接口线程(User Interface Thread)和工作者线程(Worker T hread)。前者常用来独立地处理用户输入和响应用户事件。后者常用于任务处理不要求用户输入的后台任务。

2.多线程在串口通信中的应用

串口1/0通常是很费时的操作,如果程序需要实时监听串口同时又想要避免很长时间等待1/0操作结束,可以利用多线程技术。下面是简单的串口通信程序,并创建工作线程分别监视串口。

2.1 串口通信类

程序专门建立了一个串口通信类class CMyCOM

{Public:CMyCOM(Cstring set[6]); ~CMyCOM();BOOL InCOM();BOOL OpCoM();

DWORD WrCOM(char*buf,DWORD dN);DWORD ReCOM(char*buf,DWORD dN);

void CloseCOM();HANDLE hCom://串行口句柄;HANDLE ht;//用于WM一COMMNOTIFY消息事件对象B00L bt;//标志和串口的连接状态};

2.2 串口通信类成员函数的说明

对串口通信类CCOM中各成员函数的说明:

(l)CMyCOM(Cstring set[6]);//串口构造函数。

(2)~CMyCOM();//该析构函数主要用于删除串口初始化时所创建的事件对象。

(3)BOOL InCOM();//初始化。

(4)BOOL OpCoM()://打开串口连接该成员函数以重叠方式打开串口设备其中用到以下一些函数:hCom=CreateFile(m_Port,GENERIC-READ,!GENERIC-WRITE,0,NULL,

OPEN-EXISTING,FILE一FLAGOVERLAPPED, NULL)SetupComm(hCom,MAXBLOCK,MAXBLOCK)://重新设置读写缓冲区大小。SetComm-Timeouts(hCom,&Cs);//设置超时参数。SetCommMask(hCom,EV一XCHAR);//设定监视事件。GetComm-State(hCom,&dcb);//获取串口的初始配置。SetCommState(hCom,&dc);//用新的DCB结构重新配置串口设备。

(5)DWORD WrCOM(char*buf,DWORD dN);//写串口函数;该成员函数将指定数量的字符从串口输出,其中用到以下一些API函数即:ClearCommError(hCom,&dr,&Ct);//清理错误标志并返回当前状态信息;WriteFile(hCom,buf,dm,&dm,&We);//写串口。

(6)DWORD RdCOM(char*buf,DWORD dm);//读串口函数;该成员函数可以从串口接收缓冲区中读入指定数量的字符,其中用到以下一些函数:ClearCommError(hCom,&dr,&Ct);ReadFile(hCom,buf,mN,&mN,&Rd);//读串口。

(7)void CloseCOM();//关闭串口。

2.3 建立监控线程处理串口通信事件

如下是该线程的关键代码:

UINT ComThread(LPVOID pPm)//用于监控串口的工作者线程

{CMyCOM*pm=(CMyCOM*)pPm;memset(&os,0,sizeof(OVERLAPPED));//初始化OVERLAPPED结构。os.hEvent=CreatEvent(NULL,TRUE,FALSE,NULL);//初始为无信号状态。B00L bt=FALSE;while(pm->bt)//一直监视串口设备,直到串口连接被挂断。{ClearCommErrort(pm一>hCom,&dr,&Ct);//清除所有I/O错误,并返回设备当前状态;if(Ct.cblnQue){WaitForsingleobjeet(pm一>ht,INFLNITE);

ResetEvent(pm一>ht);PostMessage(pm一>ht,WM-COMMNOTIFY,EV-CHAR,0);

Continue;if(!WaitCommEvent(pm一>hCom,&dk,&os))if(GetLastError()==ERROR -IO-PENDING)//无限等待重叠操作结果Get-OverlappedResult(pm一>hCom,&os, &ds,TRUE);else{}//进行出错处理}

CloseHandle(os.hEvent);//关闭事件句柄Return(0);}

3.结论

本文给出了多线程的原理优势方面的介绍,结合本人参与的项目中的例子,一个串口类及其成员函数,以点带面介绍了基于MFC的多线程技术在串口通信中的应用。

参考文献

[1]刘勇.如何利用MFC 实现线程间的同步[J].计算机应用,2001.

[2]于华.多线程应用程序中的同步控制技术及应用[J].计算机系统应用,2001,07.

[3]深入浅出MFC (第二版),侯俊杰,华中科技大学出版社,2001,1.

[4]孙鑫,余安萍.VC++深入详解(附光盘)[M].北京:电子工业出版社,2006.

[5]孔鹏.Visual C++ 6.0 完全自学手册(附光盘)[M].北京:机械工业出版社,2007.