做上位机,与设备通信,经常会用到串口。看到一些串口助手,像SSCOM,能自动扫描枚举PC的串口。所以后面的应用,我也加上自动枚举串口。
在网上找的资料,最多的是读取注册表里的内容,HKEY_LOCAL_MACHINE\ Hardware\DeviceMap\SerialComm"
这个方法很简单,能读到本机串口,虚拟串口,或外扩USB串口等的COM号。代码如下:
typedef struct _SERIALNAMEBUF
{
int SerialNum;
TCHAR ppSerialName[128][10];
} SERIALNAMEBUF, *PSERIALNAMEBUF;
int EnumSerialPort(SERIALNAMEBUF *pSerialNameBuf)
{
int i = 0;
HKEY hKey;
TCHAR RegKeyName[128],SerialPortName[10];
int Num=0;
memset(pSerialNameBuf, 0, sizeof(SERIALNAMEBUF));
if(ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Hardware\\DeviceMap\\SerialComm"),NULL, KEY_READ, &hKey ))//打开串口注册表对应的键值
{
DWORD dwLong,dwSize;
while(1)
{
dwLong = dwSize = sizeof(RegKeyName);
if(ERROR_NO_MORE_ITEMS == ::RegEnumValue(hKey,i,RegKeyName,&dwLong,NULL,NULL,(PUCHAR)SerialPortName, &dwSize))//枚举串口
{
break;
}
_tcscpy(pSerialNameBuf->ppSerialName[Num], SerialPortName);
Num ++;
if (Num == 128)
{
break;
}
i++;
}
}
RegCloseKey(hKey);
pSerialNameBuf-