两种枚举串口的方式
2005-11-16 12:13
225 查看
以下是C++ Builder下调试过的两种枚举系统串口的代码
/* 函数名 : GetSerialPortsReg
* 说 明 : 通过注册表枚举系统串口数量,并列出所有串口的系统名
*
* 参 数 : pListStr, 串口名称列表
* 返回值 : int, 系统串口个数
*/
int GetSerialPortsReg(char (*pListStr)[80])
{
HKEY hKey;
LPCTSTR data_Set="HARDWARE//DEVICEMAP//SERIALCOMM//";
long ret0 = (::RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_Set, 0, KEY_READ, &hKey));
if(ret0 != ERROR_SUCCESS)
{
return -1;
}
int i = 0;
CHAR Name[25];
UCHAR szPortName[80];
LONG Status;
DWORD dwIndex = 0;
DWORD dwName;
DWORD dwSizeofPortName;
DWORD Type;
dwName = sizeof(Name);
dwSizeofPortName = sizeof(szPortName);
do
{
Status = RegEnumValue(hKey, dwIndex++, Name, &dwName, NULL, &Type,
szPortName, &dwSizeofPortName);
if((Status == ERROR_SUCCESS)||(Status == ERROR_MORE_DATA))
{
if (pListStr != NULL)
{
memcpy(*(pListStr + i), (LPCSTR)szPortName, 80);
}
i++;
}
} while((Status == ERROR_SUCCESS)||(Status == ERROR_MORE_DATA));
RegCloseKey(hKey);
return i;
}
/* 函数名 : GetSerialPortsSys
* 说 明 : 通过系统信息枚举系统串口数量,并列出所有串口的系统名
*
* 参 数 : pListStr, 串口名称列表
* 返回值 : int, 系统串口个数
*/
int GetSerialPortsSys(char (*pListStr)[80])
{
DWORD pcReturned = 0;
DWORD pcbNeeded = 0;
BYTE *outb = NULL;
EnumPorts(NULL, 2, outb, 0, &pcbNeeded, &pcReturned);
outb = new byte[pcbNeeded];
EnumPorts(NULL, 2, &outb[0], pcbNeeded, &pcbNeeded, &pcReturned);
PORT_INFO_2 *portsArray ;
portsArray = (PORT_INFO_2 *)(outb);
for (unsigned int i = 0; i< pcReturned; i++)
{
if (((AnsiString)(*(portsArray + i)).pPortName).Pos("COM") > 0)
{
memcpy(*(pListStr + i), (*(portsArray + i)).pPortName, 80);
}
}
return pcReturned;
}
/* 函数名 : GetSerialPortsReg
* 说 明 : 通过注册表枚举系统串口数量,并列出所有串口的系统名
*
* 参 数 : pListStr, 串口名称列表
* 返回值 : int, 系统串口个数
*/
int GetSerialPortsReg(char (*pListStr)[80])
{
HKEY hKey;
LPCTSTR data_Set="HARDWARE//DEVICEMAP//SERIALCOMM//";
long ret0 = (::RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_Set, 0, KEY_READ, &hKey));
if(ret0 != ERROR_SUCCESS)
{
return -1;
}
int i = 0;
CHAR Name[25];
UCHAR szPortName[80];
LONG Status;
DWORD dwIndex = 0;
DWORD dwName;
DWORD dwSizeofPortName;
DWORD Type;
dwName = sizeof(Name);
dwSizeofPortName = sizeof(szPortName);
do
{
Status = RegEnumValue(hKey, dwIndex++, Name, &dwName, NULL, &Type,
szPortName, &dwSizeofPortName);
if((Status == ERROR_SUCCESS)||(Status == ERROR_MORE_DATA))
{
if (pListStr != NULL)
{
memcpy(*(pListStr + i), (LPCSTR)szPortName, 80);
}
i++;
}
} while((Status == ERROR_SUCCESS)||(Status == ERROR_MORE_DATA));
RegCloseKey(hKey);
return i;
}
/* 函数名 : GetSerialPortsSys
* 说 明 : 通过系统信息枚举系统串口数量,并列出所有串口的系统名
*
* 参 数 : pListStr, 串口名称列表
* 返回值 : int, 系统串口个数
*/
int GetSerialPortsSys(char (*pListStr)[80])
{
DWORD pcReturned = 0;
DWORD pcbNeeded = 0;
BYTE *outb = NULL;
EnumPorts(NULL, 2, outb, 0, &pcbNeeded, &pcReturned);
outb = new byte[pcbNeeded];
EnumPorts(NULL, 2, &outb[0], pcbNeeded, &pcbNeeded, &pcReturned);
PORT_INFO_2 *portsArray ;
portsArray = (PORT_INFO_2 *)(outb);
for (unsigned int i = 0; i< pcReturned; i++)
{
if (((AnsiString)(*(portsArray + i)).pPortName).Pos("COM") > 0)
{
memcpy(*(pListStr + i), (*(portsArray + i)).pPortName, 80);
}
}
return pcReturned;
}
相关文章推荐
- 魔方机器人之下位机编程-----两种串口通信方式的比较
- 两种实现方式mycat多租户,枚举分片,注解拦截
- 枚举进程的两种方式
- STM32使用串口IDLE中断的两种接收不定长数据的方式
- 关于串口通讯查询与中断两种方式
- 串口通信一般有两种方式: 1、字符 2、字节
- C#动态获取本机可用串口的两种方式
- UVa 10361 Automatic Poetry (字符串处理&两种读入方式)
- 将一个正整数分解质因数的两种方式
- Struts2.0中获取项目的上下文的两种方式
- 两种导入eclipse到androidstudio的方式
- mysql delete两种关联删除方式
- swagger响应信息码枚举设置方式
- android开发两种退出程序方式(killProcess,System.exit)
- 自定义Cell注册两种方式
- Java中有两种实现多线程的方式以及两种方式之间的区别
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
- 【转】Android手机上监听短信的两种方式
- Web APi之认证(Authentication)两种实现方式【二】(十三)
- win7下加载nfs的两种命令方式