在VS2013下编写基于MSCOMM的MFC串口通讯程序

2024-10-14 16:27:29

1、下载串口控件:链接:http://pan.baidu.com/s/1geD2AUf 密码:yfxo压缩包包含四个文件:MSCOMM.SRG、MSCOMM32.DEP、MSCOMM32.oca、mscomm32.ocx;解压后拷贝到:C:\Windows\System32(WIN7、Win8、Win10系统);C:\WINDOWS\system32(XP系统)。注意:64位win7、8、10系统还需要将mscomm32.ocx文件复制到C:\Windows\SysWOW64\目录下,否则后面注册会出错。

2、在C:\Windows\System32里找到cmd.exe以管理员身份运行:Regsvr32 C:\WINDOWS\system32\MSCOMM32.OCX注册成功如图所示:

在VS2013下编写基于MSCOMM的MFC串口通讯程序

4、新建MFC工程:在VS 2013中新建一个MFC项目,比如基于对话框的一个项目

在VS2013下编写基于MSCOMM的MFC串口通讯程序在VS2013下编写基于MSCOMM的MFC串口通讯程序

7、在电话图标上右击:

在VS2013下编写基于MSCOMM的MFC串口通讯程序

9、分别在两个文本框上右键,给两个编辑框添加成员变量

在VS2013下编写基于MSCOMM的MFC串口通讯程序

10、发送数据文本框:

在VS2013下编写基于MSCOMM的MFC串口通讯程序

12、在串口控件上右键,添加控件事件处理函数:

在VS2013下编写基于MSCOMM的MFC串口通讯程序

14、得到如下回调函数

在VS2013下编写基于MSCOMM的MFC串口通讯程序

16、输入一个变量名为Edit的变量。

在VS2013下编写基于MSCOMM的MFC串口通讯程序

17、打开串口按钮回调函数编写:CString portnums = _T("0");//定义串口编号,默认值串口编号为0void Cport_de罪焐芡拂monstrationDlg::OnBnClickedBottonOpen(){ // TODO: 在此添加控件通知处理程序代码 Edit.GetWindowText(portnums);//获取编辑框中的串口编号 int flag = _ttoi(portnums);//将其转化为数值类型 if (flag)//如果输入的串口编号为正整数,才执行下列命令 { if (m_mscomm.get_PortOpen()) { m_mscomm.put_PortOpen(FALSE); } m_mscomm.put_CommPort(flag); //选择COM m_mscomm.put_InBufferSize(1024); //接收缓冲区 m_mscomm.put_OutBufferSize(1024);//发送缓冲区 m_mscomm.put_InputLen(0);//设置当前接收区数据长度为0,表示全部读取 m_mscomm.put_InputMode(1);//以二进制方式读写数据 m_mscomm.put_RThreshold(1);//接收缓冲区有1个及1个以上字符时,将引发接收数据的OnComm m_mscomm.put_Settings(_T("9600,n,8,1"));//波特率9600无检验位,8个数据位,1个停止位 if (!m_mscomm.get_PortOpen())//如果串口没有打开则打开 { m_mscomm.put_PortOpen(TRUE);//打开串口 AfxMessageBox(_T("串口打开成功")); } else { m_mscomm.put_OutBufferCount(0); AfxMessageBox(_T("串口打开失败")); } } else { AfxMessageBox(_T("请先输入需要打开串口编号")); }}

18、关闭按钮回调函数编写:void Cport_demonstrationDlg::OnBnClickedBottonClose(){ // 皈其拄攥TODO: 在此添加控件通知处理程序代码 m_mscomm.put_PortOpen(FALSE);//关闭串口 AfxMessageBox(_T("串口已关闭"));}发送数据按钮回调函数实现:void Cport_demonstrationDlg::OnBnClickedBottonSend(){ // TODO: 在此添加控件通知处理程序代码 UpdateData(true); //读取编辑框内容 m_mscomm.put_Output(COleVariant(m_EditSend));//发送数据 m_EditSend.Empty(); //发送后清空输入框 UpdateData(false); //更新编辑框内容}

19、接收数据按钮回调函数编写(写在串口事件处理程碌食撞搁序里面):void Cport_demonstrationDlg::OnCommMs艘早祓胂comm1(){ // TODO: 在此处添加消息处理程序代码 static unsigned int cnt = 0; VARIANT variant_inp; COleSafeArray safearray_inp; long len, k; unsigned int data[1024] = { 0 }; byte rxdata[1024]; //设置 BYTE 数组 CString strtemp; if (m_mscomm.get_CommEvent() == 2) //值为 2 表示接收缓冲区内有字符 { cnt++; variant_inp = m_mscomm.get_Input(); //读缓冲区消息 safearray_inp = variant_inp; ///变量转换 len = safearray_inp.GetOneDimSize(); //得到有效的数据长度 for (k = 0; k<len; k++) { safearray_inp.GetElement(&k, rxdata + k); } for (k = 0; k<len; k++) //将数组转换为 CString 型变量 { strtemp.Format(_T("%c"), *(rxdata + k)); m_EditReceive += strtemp; CString temp = _T("\r\n"); //换行 m_EditReceive += temp; } } UpdateData(FALSE); //更新编辑框内容}

猜你喜欢