MFC串口的编程mscomm控件与SerialPort类已有3821次阅读2014-7-3023:57|MFC,串口MFC制作上位机,首先需要了解的是串口的编程,一般有两种方法,一个是使用ActiveX控件,例如mscomm串口控件,还有一个是用SerialPort类或者一些其他的串口类,这两个的区别是使用SerialPort类不需要注册控件,在其他没有安装控件的电脑上也能够用。一·使用mscomm串口控件使用mscomm串口控件的方法网上一大堆,大致说一些方法和一些需要注意的地方。如果是使用VC6.0在WIN7上来编写就会有个问题会通常说添加控件的方法为选中项目“工程”“添加到工程”“ComponentsandControls”“MicrosoftCommunicationsControl”这样添加会出错,提示为不支持此接口,这是因为此软件在Win7上面不兼容,解决办法是直接在工程界面上右击“插入ActiveX控件”然后选择相关的控件,然后给用建立类向导,给控件添加变量名,控件相关的类会自动添加,然后就可以用了。这个控件类在但是这个在VS2008以上版本也是一样的,对于有多种类的控件就不一样了。然后右击控件添加事件,这是事件就是收到串口数据的处理函数,接下来就初始化串口就可。二·使用SerialPort类SerialPort类是开源的,使用起来也方便,下面是复制的其他人的教程:1建立程序框架工程1、在VC6.0开发环境中,新建基于对话框的MFC应用程序名为exp,并添加主要控件,更改控件ID。2、用ClassWizard为相应控件添加变量。主要添加的变量为显示类型的,如编辑框、组合框等。3.添加类文件。下载或者拷贝类文件serialport.h和serialport.cpp复制到工程所在的文件夹下,然后点击VC6.0菜单Project-AddtoProject-Files…,选择serialport.h和serialport.cpp点击OK,就把类文件加入了当前工程。4.在FileView中打开expDlg.h,将头文件说明,即加入#includeSerialPort.h,这样就加入了CSerialPort类。通过CSerialPort类完成串口操作。5.在主对话框头文件expDlg.h中定义CserialPort类对象,如果只操作一个类对象,就只定义一个类对象。public:CSerialPortm_SerialPort;//CSerailPort类对象BOOLm_bSerialPortOpened;//标志串口是否打开若要操作多个串口则要为每个串口定义一个类对象,这个可以通过数组方式来定义,这里定义的类对象为m_SerialPort,再定义一个布尔变量用来标志串口是否打开,如上。2添加消息响应(添加3处地方)2.1在头文件expDlg.h中添加消息响应函数的声明在CSerialPort类中有多个串口事件可以响应,在一般串口编程中,只需要处理WM_COMM_RXCHAR消息就可以了,该类所有的消息均需要人工添加消息处理函数。将处理函数名定义为OnComm(),首先在expDlg.h中添加串口字符接收消息WM_COMM_RXCHAR(串口接收缓冲区内有一个字符)的响应函数声明:protected:HICONm_hIcon;//Generatedmessagemapfunctions//{{AFX_MSG(CExp2Dlg)…………afx_msgLONGOnComm(WPARAMch,LPARAMport);//只需添加这一行//}}AFX_MSG2.2在expDlg.cpp文件中进行WM_COMM_RXCHAR消息映射:BEGIN_MESSAGE_MAP(CExp2Dlg,CDialog)//{{AFX_MSG_MAP(CExp2Dlg)…………ON_MESSAGE(WM_COMM_RXCHAR,OnComm)//只需添加这一行//}}AFX_MSG_MAPEND_MESSAGE_MAP()2.3接收数据的消息处理函数。手动输入:接着在expDlg.cpp文件中手动输入函数OnComm()的实现(注意:这里不添加按钮,而是直接手动输入整个函数体!!!)。并在其中完成对接收到的字符的处理,将接收到的字符显示在接收编辑框中:LONGCExp2Dlg::OnComm(WPARAMch,LPARAMport){m_strEditReceiveMsg+=ch;UpdateData(FALSE);//将接收到的字符显示在接收编辑框中return0;}3串口操作函数3.1打开串口和关闭串口(必须先打开串口,才能发送数据,否则发生内存地址写的错误!)为按钮添加单击响应函数,分别为“打开串口”按钮添加OnButtonOpen(),为“关闭串口”按钮添加OnButtonClose(),并在OnButtonOpen()中进行初始设置:voidCExp2Dlg::OnButtonOpen(){//TODO:AddyourcontrolnotificationhandlercodehereintnPort=1;//选择串口COM1if(ChuankouDX.InitPort(this,nPort,9600,'N',8,1,EV_RXFLAG|EV_RXCHAR,512)){ChuankouDX.StartMonitoring();m_bSerialPortOpened=TRUE;}else{AfxMessageBox(没有发现此串口或被占用);m_bSerialPortOpened=FALSE;}}voidCExp2Dlg::OnButtonClose(){//TODO:AddyourcontrolnotificationhandlercodehereChuankouDX.ClosePort();//关闭串口m_bSerialPortOpened=FALSE;3.2发送数据为“发送”按钮添加OnButtonSend()。voidCExp2Dlg::OnButtonSend(){//TODO:Addyourcontrolnotificationhandlercodehereif(!m_bSerialPortOpened)return;//检查串口是否打开charbuf[100];memset(&buf,0,sizeof(buf));GetDlgItemText(IDC_send,buf,sizeof(buf));if(strcmp(NOTFOUND,buf)==0)return;ChuankouDX.WriteToPort(buf);//发送数据}