通过读注册表检测本机串口信息
2014-07-10 21:52
351 查看
用QT做上位机,使用串口通讯时,想自动扫描串口设备,即在下拉列表框中,只显示已有的串口。
本来挺简单的,只要轮询HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM就能找到已有的串口,但QT的QSettings有个bug,如果键名里有斜杠'/',则读出的键值就是空的。参考别人使用API函数读取键值的文章,写了下面这个函数。
使用方法:
本来挺简单的,只要轮询HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM就能找到已有的串口,但QT的QSettings有个bug,如果键名里有斜杠'/',则读出的键值就是空的。参考别人使用API函数读取键值的文章,写了下面这个函数。
UINT32 comPortInfo(QStringList *qslKeyValList) { //1.从注册表中取出 键名 QString qsRegPath = "HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM"; QSettings *reg = new QSettings(qsRegPath,QSettings::NativeFormat); QStringList qsListKeys = reg->allKeys(); //childKeys(); QList<int> qlTmp; //2.再依次取出 键值 for (UINT32 i=0; i < qsListKeys.size(); i++) { HKEY hKey; wchar_t wsKeyName[256]; //键名数组 char sKeyVal[32]; //键值数组 DWORD ulKeyNameSize = sizeof(wsKeyName); DWORD ulKeyValSize = sizeof(sKeyVal); RegOpenKeyEx(HKEY_LOCAL_MACHINE,TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"),0,KEY_READ,&hKey); RegEnumValue(hKey, /*要查询的已打开的键的句柄*/ i, /*索引号*/ wsKeyName, /*返回所读取的名称*/ &ulKeyNameSize, /*返回读取名称的长度,不含chr(0)*/ 0, /*保留*/ 0, /*返回所读取的数据类型*/ (BYTE*)sKeyVal, /*返回所读取的数据*/ &ulKeyValSize); /*返回所读取的数据长度*/ //取出类似 COM3 COM20 这样的键值 //只取第3位以后的数字,放入list (方便排序) qlTmp.append( QString::fromUtf16((ushort*)sKeyVal).mid(3).toUInt() ); } //3.排序 // 因为字符串排序 "COM12" < "COM3", 所以不能简单地QStringList.sort() // 故先提取出数字, 再按数字排序, 再附加上前缀COM qSort(qlTmp); for (UINT32 i=0; i<qsListKeys.size(); i++) { qslKeyValList->append(QString("COM%1").arg(qlTmp[i])); } //qDebug() << *qslKeyValList; return qsListKeys.size();
使用方法:
// 检查本机串口设备 QStringList qslKeyValList; UINT32 uiComCount = comPortInfo(&qslKeyValList); if(uiComCount == 0) QMessageBox::about(NULL, "错误", "本机无串口设备,请检查串口线"); qDebug() << QString("=== 本机有%1个串口:").arg(uiComCount) << qslKeyValList;
相关文章推荐
- VC++ 动态检测串口的热插拔(一)通过注册表实现
- VC++ 动态检测串口的热插拔(一)通过注册表实现
- VC++ 动态检测串口的热插拔(二)通过注册表实现
- VC++ 动态检测串口的热插拔(一)通过注册表实现
- 在Windows下用注册表修改串口信息
- Uart2Socket:将PC的串口信息通过WiFi网络传输至安卓Android手机上
- vb.net 通过注册表读出系统所有串口
- 通过注册表获取当前所有串口号
- 注册表的信息读取--获取系统串口数
- VC++ 动态检测串口的热插拔(一)通过遍历实现
- C#通过注册表检测是否安装Office和QQ等软件
- 通过注册表枚举串口
- 不通过注册表获取运营商,系列号等信息(ExTAPI)
- 利用 Qt 4.1.0 读取注册表获得串口信息
- C++通过访问注册表获取已安装软件信息列表
- 通过注册表查看 .NET Framework的版本信息
- 控制发送SMS信息的C51程序[GSM模块(M22)通过串口与单片机相连]
- 通过RS_232串口向某检测台握手,发送和接受数据源代码
- Wince驱动下操作线程,写入注册表,共享串口信息
- 通过va_list和/dev/kmsg在串口打印调试信息