我们一般对串口进行通信的时候,是自己指定的端口,但是个人感觉不是很方便,今天在网上找到了枚举串口的两种方法感觉很实用,不用自己去设备管理器查看串口了。
第一种方式 :通过注册表来枚举串口
void GetComList_Reg( CComboBox * CCombox )
{
HKEY hkey;
int result;
CString strComName;//串口名称
int i=0;
result = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
_T( "Hardware\\DeviceMap\\SerialComm" ),
NULL,
KEY_READ,
&hkey );
if( ERROR_SUCCESS == result ) // 打开串口注册表
{
TCHAR portName[ 0x100 ], commName[ 0x100 ];
DWORD dwLong, dwSize;
CCombox->ResetContent();
do
{
dwSize = sizeof( portName ) / sizeof( TCHAR );
dwLong = dwSize;
result = RegEnumValue( hkey, i, portName, &dwLong, NULL, NULL, ( LPBYTE )commName, &dwSize );
if( ERROR_NO_MORE_ITEMS == result )
{
// 枚举串口
break; // commName就是串口名字"COM2"
}
strComName=commName;
CCombox->AddString(strComName);
i++;
} while ( 1 );
RegCloseKey( hkey );
}
CCombox->SetCurSel(0);
}
1
2
3
4
5
6
7
|
LONG
RegOpenKeyEx(
HKEY
hKey,
// 需要打开的主键的名称
LPCTSTR
lpSubKey,
//需要打开的子键的名称
DWORD
ulOptions,
// 保留,设为0
REGSAM samDesired,
// 安全访问标记,也就是权限
PHKEY
phkResult
// 得到的将要打开键的句柄
|
RegEnumValue( )枚举指定项的值
第二种方式为调用CreateFile方法;
void GetComList_256(CComboBox * CCombox)//获取可用com口支持到256个
{
CString strCom,strComOpen;
int nCom = 0;
HANDLE hCom;
CCombox->ResetContent();
do
{
nCom++;
strCom.Format("COM%d", nCom);
strComOpen.Format("\\\\.\\COM%d", nCom);
hCom = CreateFile(strComOpen, GENERIC_READ | GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
if(INVALID_HANDLE_VALUE == hCom )
{
DWORD error=::GetLastError();//取得错误信息
}
else
{
CCombox->AddString( strCom );
}
CloseHandle(hCom);
} while(nCom<256);
CCombox->SetCurSel(0);
}
CreateFile()这是一个多功能的函数,可打开或创建以下对象,并返回可访问的句柄:控制台,通信资源,目录(只读打开),磁盘驱动器,文件,邮槽,管道。
1
2
3
4
5
6
7
8
9
|
HANDLE
WINAPI CreateFile(
_In_
LPCTSTR
lpFileName,
_In_
DWORD
dwDesiredAccess,
_In_
DWORD
dwShareMode,
_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
_In_
DWORD
dwCreationDisposition,
_In_
DWORD
dwFlagsAndAttributes,
_In_opt_
HANDLE
hTemplateFile
);
|