找回密码
 立即注册
收起左侧

用Qt如何获取系统可用的串口信息?

7
回复
11937
查看
[复制链接]
累计签到:23 天
连续签到:1 天
来源: 2013-11-6 13:57:16 显示全部楼层 |阅读模式
1Qter豆
本帖最后由 cliffordl 于 2013-11-6 14:19 编辑

现在正在做串口程序,需要自动的获取本地串口信息,主要是串口号。请问用Qt如何获取系统可用的串口信息?

网上搜索:一种方法是读取本地注册表,另一种方法是挨个监测。
想问读取本地注册表怎么操作?

最佳答案

查看完整内容

https://code.google.com/p/qextserialport/ 你把它下载下来,里面有个帮助文件,安装到Qt Creator中,里面有详细的说明。这个QextSerialEnumerator类很好使,就几行程序。

相关帖子

回复

使用道具 举报

累计签到:23 天
连续签到:1 天
2013-11-7 13:57:57 显示全部楼层
本帖最后由 cliffordl 于 2013-11-7 14:00 编辑

以下参考的是百度文库的内容,可运行
http://wenku.baidu.com/link?url= ... uWEDY_RINPPZW8MTc53

问题:使用QSettings时,对于注册表中类似于串口信息中的\Device\Serial0的这种key值,用value()函数无法读到其value。
分析:QT在读取注册表时,对于有路径分隔符“\”“/”的value都无法读取,应该属于QT的一个小bug。
解决方法:
.h文件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QMessageBox>
#include <qt_windows.h>
#include <QSettings>
#include <QtGui/QMainWindow>
namespace Ui {
    class Widget;
}
class Widget : public QWidget
{
    Q_OBJECT
public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
private:
    Ui::Widget *ui;
    QStringList m_listcomboName;
    HKEY hKey;
    LPCWSTR subkey;
    wchar_t keyname[256]; //键名数组
    char keyvalue[256];  //键值数组
    DWORD keysize,type,valuesize;
    int indexnum;
public:
    QString getcomm(int index,QString keyorvalue); //读取键名
};
#endif // WIDGET_H

.cpp 文件
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    QString path = "HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM\\";
    QSettings *settings = new QSettings( path, QSettings::NativeFormat);
    QStringList key = settings->allKeys();
    int num = (int)key.size();
    QString value;
    for(int i=0; i<num; i++)
    {
        value = getcomm(i, "value");
        m_listcomboName<<value;
    }

}
Widget::~Widget()
{
    delete ui;
}
QString Widget::getcomm(int index,QString keyorvalue)
//index为索引号,keyorvalue为选择返回值应该为key还是value
{
    QString commresult;
    if(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"),0,KEY_READ,&hKey)!=0)
    {
        QString error="Cannot open regedit!";//无法打开注册表时返回error
        return error;
    }//if(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,subkey,0,KEY_READ,&hKey)!=0)
    QString keymessage;//键名
    QString message;
    QString valuemessage;//键值
    indexnum = index;//要读取键值的索引号
    keysize=sizeof(keyname);
    valuesize=sizeof(keyvalue);
    if(::RegEnumValue(hKey,indexnum,keyname,&keysize,0,&type,(BYTE*)keyvalue,&valuesize)==0)//列举键名和值
    {
        for(int i=0;i<keysize;i++)
        {
            message=keyname;
            keymessage.append(message);
        }// for(int i=0;i<=keysize;i++)    读取键名
        for(int j=0;j<valuesize;j++)
        {
             if(keyvalue[j]!=0x00)
             {
                 valuemessage.append(keyvalue[j]);
        }
        }//for(int j=0;j<valuesize;j++) 读取键值
        if(keyorvalue=="key")
        {
             commresult=keymessage;
        }
        if(keyorvalue=="value")
        {
             commresult=valuemessage;
        }
    }
    else
    {
         commresult="nokey";
    } //if(::RegEnumValue(hKey,indexnum,keyname,&keysize,0,&type,(BYTE*)keyvalue,&valuesize)==0) 列举键名和值
    return commresult;
    ::RegCloseKey(hKey);//关闭注册表
}

回复

使用道具 举报

尚未签到

2013-11-6 13:57:17 显示全部楼层
cliffordl 发表于 2013-11-13 22:48
请问,这个具体怎么用呢?

https://code.google.com/p/qextserialport/
你把它下载下来,里面有个帮助文件,安装到Qt Creator中,里面有详细的说明。这个QextSerialEnumerator类很好使,就几行程序。
回复

使用道具 举报

累计签到:4 天
连续签到:1 天
2013-11-6 16:05:25 显示全部楼层
Windows下的?  亚飞老师串口例子应该很明确了!
Linux下的话就简单了... /dev/ttyUSB*    使用find 或者 grep..
回复

使用道具 举报

累计签到:23 天
连续签到:1 天
2013-11-6 16:29:00 显示全部楼层
study_wen 发表于 2013-11-6 16:05
Windows下的?  亚飞老师串口例子应该很明确了!
Linux下的话就简单了... /dev/ttyUSB*    使用find 或者 g ...

小弟问的正是Windows下的。 亚飞老师串口例子我没有搜到,求连接,求指教。
回复

使用道具 举报

累计签到:4 天
连续签到:1 天
2013-11-6 16:37:32 显示全部楼层
cliffordl 发表于 2013-11-6 16:29
小弟问的正是Windows下的。 亚飞老师串口例子我没有搜到,求连接,求指教。 ...

注册表啊...这个Windows版本不一样,我估计可能位置不大一样啊。。
我个你搜了一个你瞅瞅!
  1. #define MAXCOMNO 256  //最大COM号256
  2. typedef struct{
  3. char name[8];
  4. short no;
  5. }SCOM;

  6. /////用读注册表的方式查看系统的串口设备
  7. void GetAvailableCom(SCOM *port,int &cnt)
  8. {
  9. HKEY  hKey;
  10. LONG  ret;
  11. OSVERSIONINFO    osvi;
  12. BOOL  bOsVersionInfoEx;
  13. CString  keyinfo;
  14. unsigned char comm_name[40];
  15. char ValueName[40];
  16. char szNO[3];
  17. int  i=0,j=0;
  18. cnt=0;
  19. DWORD  sType,Reserved,cbData,cbValueName;

  20. ZeroMemory(&osvi,  sizeof(OSVERSIONINFO));
  21. osvi.dwOSVersionInfoSize  =  sizeof(OSVERSIONINFO);

  22. keyinfo.Format(_T("HARDWARE\\DEVICEMAP\\SERIALCOMM"));
  23. //CString  keyinfo=_T("HARDWARE\\DEVICEMAP\\SERIALCOMM");

  24. i=0;  sType=REG_SZ;Reserved=0;
  25. bOsVersionInfoEx  = GetVersionEx(&osvi);

  26. ret=RegOpenKeyEx(HKEY_LOCAL_MACHINE,keyinfo,0,KEY_ALL_ACCESS,&hKey);
  27. if  (ret==ERROR_SUCCESS)
  28. {
  29.   if  (osvi.dwPlatformId  ==  VER_PLATFORM_WIN32_WINDOWS)    //WIN32,not used
  30.   {
  31.    for(i=1;i<=MAXCOMNO;i++)
  32.    {
  33.     memset(comm_name, 0, 40);
  34.     sprintf((char*)comm_name,"COM%d",i);
  35.     ret=RegEnumValue(hKey, i, ValueName, &cbValueName, NULL, &sType, comm_name, &cbData);
  36.     if(ret==ERROR_SUCCESS)
  37.     {
  38.      i++;
  39.     }

  40.    }
  41.   }
  42.   else  if  (osvi.dwPlatformId  ==  VER_PLATFORM_WIN32_NT) //WINNT XP 2000
  43.   {
  44.    do   
  45.    {
  46.     cbData=40;cbValueName=40;
  47.     memset(comm_name,0,40);   
  48.     memset(ValueName,0,40);
  49.     memset(szNO,     0, 3);
  50.     ret=RegEnumValue(hKey, i, ValueName, &cbValueName, NULL, &sType, comm_name, &cbData);
  51.     if  (ret==ERROR_SUCCESS)
  52.     {
  53.      for(j=0;j<cbData;j++)
  54.      {
  55.       port->name[j]=comm_name[j];
  56.       if(j>2 && j<6)
  57.       {
  58.        szNO[j-3] = comm_name[j];
  59.       }
  60.      }
  61.      port->no = atoi(szNO);
  62.      port++;
  63.      cnt++;
  64.      i++;
  65.     }
  66.    }while(ret==ERROR_SUCCESS);
  67.   }
  68. }
  69. RegCloseKey(hKey);
  70. }
复制代码
参与人数 1人气 +1 收起 理由
cliffordl + 1 必须支持!

查看全部评分总评分 : 人气 +1

回复

使用道具 举报

尚未签到

2013-11-13 18:48:55 显示全部楼层
这个需要读取注册表吗,qextserialport中的QextSerialEnumerator类负责获得串口名和数量等。
回复

使用道具 举报

累计签到:23 天
连续签到:1 天
2013-11-13 22:48:53 显示全部楼层
imthypal 发表于 2013-11-13 18:48
这个需要读取注册表吗,qextserialport中的QextSerialEnumerator类负责获得串口名和数量等。 ...

请问,这个具体怎么用呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了