IDC_MSCOMM控件向下位机发送十六进制指令

  1.  
  2. 下载串口控件:

    链接: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\目录下,否则后面注册会出错。

  3. 2

    在C:\Windows\System32里找到cmd.exe以管理员身份运行:

    Regsvr32  C:\WINDOWS\system32\MSCOMM32.OCX

    注册成功如图所示:

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

  4. 3

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

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

  5. 4

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

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

  6. 5

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

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

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

  7. 6

    删除默认的按钮以及静态文本框,添加如下对话框控件:

    A:打开串口控件,工具栏中拖一个botton 到 diadlg 上 ,并修改Caption 为 ”打开串口“,修改ID 为  IDC_BOTTON_OPEN

     

    B: 关闭串口控件,工具栏中拖一个botton 到 diadlg 上 ,并修改Caption 为 ”关闭串口“,修改ID 为  IDC_BOTTON_CLOSE

     

    C:发送控件,工具栏中拖一个botton 到 diadlg 上 ,并修改Caption 为 ”发送“,修改ID 为  IDC_BOTTON_SEND

    D:发送编辑框 和  接受编辑框

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

  8. 7

    在电话图标上右击:

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

  9. 8

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

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

  10. 9

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

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

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

  11. 发送数据文本框:

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

  12. 接收数据本文框:

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

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

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

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

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

  15. 得到如下回调函数

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

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

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

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

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

  18. 打开串口按钮回调函数编写:

    CString portnums = _T("0");//定义串口编号,默认值串口编号为0

    void 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("请先输入需要打开串口编号"));

        }

    }

  19. 关闭按钮回调函数编写:

    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); //更新编辑框内容

     

    }

  20. 接收数据按钮回调函数编写(写在串口事件处理程序里面):

     

    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<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); //更新编辑框内容

    }

 

发送十六进制协议:
int i,Count;
BYTE SendBuff[8];
CByteArray Array;
Count=8;
Array.RemoveAll();
Array.SetSize(Count);
        SendBuff[0]=0x55;
        SendBuff[1]=0x01;
        SendBuff[2]=0x31;
        SendBuff[3]=0x00;
        SendBuff[4]=0x00;
        SendBuff[5]=0x00;
        SendBuff[6]=0x01;
        SendBuff[7]=0x88;
    
for(i=0;i<Count;i++)
Array.SetAt(i,SendBuff[i]);
m_CurrentCommandId=2;
m_mscomm.put_OutBufferCount(0);
//    m_Comm1.put_InBufferCount(0);

m_mscomm.put_Output(COleVariant(Array));
 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值