MFC学习笔记-串口通信

xiaoxiao2021-02-28  143

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 } }
转载请注明原文地址: https://www.6miu.com/read-62082.html

最新回复(0)