VS+Qt中获取串口COM的两种方式:
1、使用QT自带的类
bool QBatteryTesting::serialport_init()
{
//获得所有可用端口列表
QList<QSerialPortInfo> serialPortInfoList = QSerialPortInfo::availablePorts();
if (serialPortInfoList.isEmpty())
{
return false;
}
QList<QSerialPortInfo>::iterator iter = serialPortInfoList.begin();
//将所有端口添加到界面的下拉列表中
while (iter != serialPortInfoList.end())
{
ui.comboBox->addItem(iter->portName());
iter++;
}
return true;
}
但是这个方式可能在VS+QT中Release版本运行时QSerialPortInfo::availablePorts()会导致问题
2、
使用:ui.comboBox->addItems(getCommPort());
QStringList QBatteryTesting::getCommPort()
{
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 QBatteryTesting::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;
}
}
else
{
::RegCloseKey(hKey); // 关闭注册表
return tr(""); // 无可用串口
}
return strCommRet;
}