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
}
}