刚开始转做上位机,然后要使用串口通信。其实项目不需要获取串口号,开始不知道,就去获取了串口号。
整理了一下,以后要用的话也方便使用。
环境:VS2013 + QT5.7
QStringList ConfigInterfaceDevice::getEnableCommPort()
{
QStringList CommPortList;
QString strCommPath = tr("HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM");
QSettings *settings = new QSettings(strCommPath, QSettings::NativeFormat);
QStringList keyList = settings->allKeys();
if (!keyList.isEmpty())
{
for (int i = 0; i < keyList.count(); i++)
CommPortList.append(getComm(i,true));
}
return CommPortList;
}
// nIndex为索引号 bValue选择返回值为key还是value,默认为value
QString ConfigInterfaceDevice::getComm(int nIndex, bool bValue)
{
QString strCommRet = tr("");
HKEY hKey;
// RegOpenKeyEx windowsApi 成功返回0 需要加<qt_windows.h>头文件
if (::RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"), 0, KEY_READ, &hKey) != 0)
{
QMessageBox::warning(this, tr("注册表"), tr("无法打开注册表!"), QMessageBox::Ok);
return tr(""); // 无法打开注册表
}
QString strKeyMsg; // 键名
QString strValueMsg; // 键值
wchar_t keyName[256]; // 键名数组
char keyValue[256]; // 键值数组
ulong nKeySize = sizeof(keyName);
ulong nValueSize = sizeof(keyValue);
ulong nType;
if (::RegEnumValue(hKey, nIndex, keyName, &nKeySize, 0, &nType, (BYTE*)keyValue, &nValueSize) == 0) // 列举键名
{
// 读取键名
for (uint i = 0; i < nKeySize; i++)
{
if (keyName[i] != 0x00)
strKeyMsg.append(keyName[i]);
}
// 读取键值
for (uint j = 0; j < nValueSize; j++)
{
if (keyValue[j] != 0x00)
strValueMsg.append(keyValue[j]);
}
if (bValue)
strCommRet = strValueMsg;
else
strCommRet = strKeyMsg;
}//if
else
{
::RegCloseKey(hKey); // 关闭注册表
return tr(""); // 无可用串口
}
return strCommRet;
}