图1CSerialPort类多线程串口通信的模型框图李一雷,张赟(浙江交通职业技术学院,浙江杭州311112)摘要:比较了Windows下的三种串口通信编程方法,画出了CSerialPort类多线程串口通信的模型框图,给出了VC++下多线程串口通信的编程实现方法。关键词:多线程;串口通信;CSerialPort类中图分类号:TP391文献标识码:A文章编号:1009-3044(2007)20-40535-01TheImplementationofMultithreadingonSerialCommunicationBasedonClassCSerialPortLIYi-lei,ZHANGYun(ZhejiangInstituteofCommunications,Hangzhou311112,China)Abstract:Threemethodsofserialcommunicationinwindowsarecompared.AmodelmapofmultithreadingonserialcommunicationbasedonclassCSerialPortisillustratored.TheprogramsformultithreadingonserialcommunicationwithVC++aregiven.1引言串行通信是计算机与数字化设备之间的一种重要通信手段。在利用计算机进行工业监控时,常常需要在线监测电、水、气等多种数据,因而要使用多个串口实时采集数据[1]。这就需要使用多线程串口通信编程技术实现。本文将比较Windows环境下的三种常用串口通信编程方式,重点论述利用CSerialPort类进行多线程串口通信的方案,给出在VC++6.0的环境下,基于SDI的实现方法和步骤。2常用串口通信目前,在Windows下,编程时,常用的串口通信主要有三种方法:一是用WindowsAPI进行编程[2],二是用MSComm通信控件[3],三是用第三方提供的一些串口通讯类进行编写。2.1WindowsAPI利用WindowsAPI编写串口程序,特别是复杂的多线程串口程序时,对于程序员的能力要求较高。除了需要程序员熟练掌握和使用众多的API函数,能编写很多底层代码之外,还必须熟悉线程的编程方法,因此,不建议普通程序员使用这种方式。2.2MSComm控件在只需对单个串口操作的情况下,利用MSComm控件会使编程快捷简单。然而,由于做了大量的封装,降低了编程的可控性和灵活性,因此在多线程多串口编程时,需要做许多复杂处理的情况下,最好不使用MSComm控件[4]。2.3CSerialPort类利用第三方的串口通信类进行串口编程时,既可以使编程效率高,程序可控性强,扩展性好,又比WindowAPI编程简单。其中的CSerialPort是基于多线程的,容易实现多线程的串口通信。比较三种串口通信方式,可以发现使用第三方的CSerial-Port类,是实现Windows下的多线程串口编程的较好的选择。3CSerialPort多线程串口通信编程3.1模型框图通常,对于单个串口的操作主要包括:打开串口、设置串口参数、使用串口(串口写、串口读)、关闭串口等[3],不再赘述。当使用CSerialPort类,启动多线程,多串口操作时,模型框图如图1所示:3.2编程实例3.2.2添加类文件和类对象将SerialPort.hSerialPort.cpp两个类文件复制到工程文件夹中,用Project-AddtoProject-Files命令将上述两个文件加入工程。并在MySerialPortView.h中加入头文件说明:#include"Serial-Port.h"。并在MySerialPortView.h中添加5个CSerialPort类对象classCMySerialPortView:publicCView{public:CSerailPortm_MyPort[5];//定义5个CSerialPort类对象CStringm_strRevData[5];//接收串口数据}3.2.3初始化串口及启动监听线程voidMySerialPortView::OnInitialUpdate(){CView::OnInitialUpdate();for(inti=0;i<5;i++){if(m_MyPort[i].InitPort(this,i+1,9600,'N',8,1,EV_RXFLAGEV_RXCHAR,512)){//串口初始化:配置串口号,波特率9600bps,检验方式,数据位8,停止位1,设置串口事件,发送缓冲大小512字节m_SerialPort[i].StartMonitoring();//启动串口监听线程}else//如果初始化不成功,则显示提示信息{CStringstrError;strError.Format("串口%d未发现,或被占用",i+1);AfxMessageBox(strError);}}}注意,其中的串口初始化函数InitPort需要修改。下面所示的建立一个基于单文档的MFC应用程序MySerialPort,骤保持缺省状态。所有步收稿日期:2007-09-03作者简介:李一雷(1976-),男,浙江杭州人,讲师,硕士,研究方向为多媒体通信、工业监控;张赟(1979-),女,浙江慈溪人,讲师,硕士。535图5相电流波形图6相电压波形图4换相逻辑模块仿真多媒体技术及其应用本栏目责任编辑:李桂瑾压、相电流、反电动势波形比较规则,减小了对系统的冲击,...