MFC学习笔记-串口通信

1,自己下载控件并注册(mscomm32.ocx)
注册MSComm32控件
1),网上下载这个控件,然后把它拷贝到到C:\Windows\system32文件夹下,我装的是64位的Win7系统,是在C:\Windows\sysWOW64文件夹下
2),然后打开cmd,写入代码 regsvr32 C:\Windows\system32\MSComm32.ocx(regsvr32 C:\Windows\sysWOW64\MSComm32.ocx)然后按enter会提示你注册成功

2,
这里写图片描述

3,
这里写图片描述

4,
这里写图片描述

5,
这里写图片描述

6,
这里写图片描述

7,
这里写图片描述

8,
这里写图片描述

9,
这里写图片描述

10,
这里写图片描述

11,
这里写图片描述

12,获取所有的串口(从注册表中获取-方法有待完善)

BOOL CWinOperation::GetAllSerialPortNumber(CArray<CString, CString&>& szSerialPortResult)
{
    BOOL bResult = FALSE;
    //szSerialPortResult.Add();

    CRegKey RegKey;
    int nCount = 0;

    if (RegKey.Open(HKEY_LOCAL_MACHINE, L"Hardware\\DeviceMap\\SerialComm") == ERROR_SUCCESS)
    {
        while (true)
        {
            //CString ValueName;
            WCHAR ValueName[_MAX_PATH];
            unsigned char ValueData[_MAX_PATH];
            DWORD nValueSize = _MAX_PATH;
            DWORD nDataSize = _MAX_PATH;
            DWORD nType;

            if (::RegEnumValue(HKEY(RegKey), nCount, ValueName, &nValueSize, NULL, &nType, ValueData, &nDataSize) == ERROR_NO_MORE_ITEMS)
            {
                break;
            }
            CString str = L"";
            str.Format(L"%s", ValueData);
            szSerialPortResult.Add(str);

            /*  if (pNameList)
                    pNameList[nCount] = ValueName;

                if (pPortList)
                    pPortList[nCount] = ValueData;*/

            nCount++;
        }
    }
    return bResult;
}

13,打开串口

//CString szSerialPortNo="COM1";
//CString szSerilaPortBaudRate ="9600";
        CString portNumber = szSerialPortNo.Mid(3);
        CString portSetting = szSerilaPortBaudRate + ",n,8,1";
        if (m_mscommSP.get_PortOpen())m_mcom.put_PortOpen(FALSE);
        m_mcom.put_CommPort(_ttoi(portNumber));//串口号
        m_mcom.put_Settings(portSetting);//串口波特率、数据位、奇偶位
        m_mcom.put_InBufferSize(1024);//发送缓冲
        m_mcom.put_OutBufferSize(1024);//接收缓冲
        m_mcom.put_InputMode(1);//
        m_mcom.put_RThreshold(1);//
        m_mcom.put_PortOpen(TRUE);//打开串口
        if (m_mcom.get_PortOpen())
        {
            AfxMessageBox(L"串口打开成功");

        }
        else
        {
            AfxMessageBox(L"串口打开失败");
        }

13,发送数据

    if (m_mcom.get_PortOpen()) 
    {
        CString sendData = L"";
        GetDlgItem(IDC_EDIT_SEND)->GetWindowTextW(sendData);//EditControl
        if (sendData != L"")
        {
            m_mcom.put_Output(COleVariant(sendData));
        }
    }

14,接收数据(-方法有待完善,无法解析中文)

BEGIN_EVENTSINK_MAP(CDlgTest, CDialogEx)
    ON_EVENT(CDlgTest, IDC_MSCOMM1, 1, CDlgTest::OnOncommMscomm1, VTS_NONE)
END_EVENTSINK_MAP()

void CDlgTest::OnOncommMscomm1()
{
    // TODO: Add your message handler code here
    if (m_mcom.get_PortOpen())
    {
        CString result = L"", temp = L"";
        COleSafeArray csa;
        VARIANT input = m_mcom.get_Input();
        csa = input;
        LONG len = csa.GetOneDimSize();
        BYTE byData;
        for (long i = 0; i < len; i++) 
        {
            csa.GetElement(&i, &byData);
            WCHAR data = (WCHAR)byData;
            temp.Format(L"%C", data);
            result += temp;
        }
        GetDlgItem(IDC_EDIT_RECV)->SetWindowTextW(result);//EditControl

    }
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值