MFC 自动获取可用com串口(串口号以及名称)
之前获取串口号都是从注册表中获取,现在用一个新的方法能够获取窗口名称和串口号;
1、首先#include <setupapi.h> 和#pragma comment(lib, "Setupapi.lib");
不同电脑位置不一样
可以在系统盘C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib(Setupapi.lib)
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include(Setupapi.h) 直接复制到你的工程目录下面,如下:
#include <setupapi.h>
#pragma comment(lib, "Setupapi.lib")
SCtring com1 , com2 , com_1 , com_2;
2、在OnInitDialog()里面添加
HDEVINFO hDevInfo = SetupDiGetClassDevs(&GUID_DEVCLASS_PORTS, NULL, NULL, 0);
HANDLE hCom;
if (hDevInfo)
{
int iy = 0;
SP_DEVINFO_DATA SpDevInfo = { sizeof(SP_DEVINFO_DATA) };
for (DWORD iDevIndex = 0; SetupDiEnumDeviceInfo(hDevInfo, iDevIndex, &SpDevInfo); iDevIndex++)
{
TCHAR szName[512] = { 0 };
if (SetupDiGetDeviceRegistryProperty(hDevInfo, &SpDevInfo, SPDRP_FRIENDLYNAME,
NULL, (PBYTE)szName, sizeof(szName), NULL))
{
_tprintf(_T("%s\n"), szName);
CString com, str, strComOpen;
str.Format(_T("%s"), szName);//获取串口的名称COM2
int posBeg = str.Find('(');
int posEnd = str.Find(')');
com = str.Mid(posBeg + 1, posEnd - posBeg - 1);//获取串口的名称COM2
strComOpen = _T("\\\\.\\") + com;
hCom = CreateFile(strComOpen, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);//如果返回不为空则此串口可用
if (INVALID_HANDLE_VALUE == hCom || ComYanzheng == com)
{
DWORD error = ::GetLastError();//取得错误信息
}
else
{
ComYanzheng = com;
ComY[iy] = str;
iy++;
}
CloseHandle(hCom);
}
}
SetupDiDestroyDeviceInfoList(hDevInfo);
}
其次加获取的串口名和串口号写入下拉列表
if (ComY[0] == ""&&ComY[1] == ""&&ComY[2] == ""&&ComY[3] == "") {
com1.AddString(_T("无可用串口"));
com2.AddString(_T("无可用串口"));
com1.SetCurSel(0);
com2.SetCurSel(0);
}
else
{
for (int iu = 0; iu < 4; iu++)
if (ComY[iu] != "") {
com1.AddString(ComY[iu]);
}
for (int ix = 0; ix < 4; ix++)
if (ComY[ix] != "") {
com2.AddString(ComY[ix]);
}
com1.SetCurSel(1);
com2.SetCurSel(0);
}s
从下拉列表读取
int indexd = com1.GetCurSel();
com1.GetLBText(indexd, strd);
int posBeg = strd.Find('(');
int posEnd = strd.Find(')');
com_1= strd.Mid(posBeg + 4, posEnd - posBeg - 1);//获取串口的名称COM1
int indexy = com2.GetCurSel();
com2.GetLBText(indexy, stry);
int posBeg2 = stry.Find('(');
int posEnd2 = stry.Find(')');
com_2 = stry.Mid(posBeg2 + 4, posEnd2 - posBeg2 - 1);//获取串口的名称COM2