多语言展示
当前在线:1667今日阅读:26今日分享:39

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

VS2013取消了MSCOMM串口控件,如果还想用该控件写串口程序,就得自己添加写基于MFC的程序11vs2013中MSComm通讯控件的导入和注意事项
工具/原料
1

VS2013

2

串口控件

3

电脑

方法/步骤
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注册成功如图所示:

3

修改注册表:win+R组合键打开“运行”或者直接在开始菜单里找到“运行”;输入regedit后回车,打开注册表管理器,在其中找到HKEY_CLASSES_ROOT项下的Licenses项,添加主项命名为“4250E830-6AC2-11cf-8ADB-00AA00C00905”,并将键值修改为“kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun”

4

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

5

添加MSComm控件:在对话框上右击选择“打开ActiveX控件”,英文版“InsertActiveX Control”找到Microsoft Communications Control,version 6.0,此时在对话框中出现一个电话一下的按钮,这个就是MSComm控件,软件运行时是看不见的

6

删除默认的按钮以及静态文本框,添加如下对话框控件:A:打开串口控件,工具栏中拖一个botton 到 diadlg 上 ,并修改Caption 为 ”打开串口“,修改ID 为  IDC_BOTTON_OPEN B: 关闭串口控件,工具栏中拖一个botton 到 diadlg 上 ,并修改Caption 为 ”关闭串口“,修改ID 为  IDC_BOTTON_CLOSE C:发送控件,工具栏中拖一个botton 到 diadlg 上 ,并修改Caption 为 ”发送“,修改ID 为  IDC_BOTTON_SENDD:发送编辑框 和  接受编辑框

7

在电话图标上右击:

8

添加一个命名如图示,点击完成 在工程中会自动生成mscomm.h 和mscomm.cpp两个文件;

9

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

10

发送数据文本框:

11

接收数据本文框:

12

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

13

选择添加事件处理程序,完成后点击添加编辑

14

得到如下回调函数

15

点击输入串口编号下面的示例编辑框,右键添加变量。

16

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

17

打开串口按钮回调函数编写:CString portnums = _T('0');//定义串口编号,默认值串口编号为0void Cport_demonstrationDlg::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::OnCommMscomm1(){    // 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

推荐信息