Qt5获取计算机可用串口,并将之储存到QStringList中

前言:

Qt下由两种方式获得计算机可用串口:一是通过读取注册表获取,当然这只适用于Windows系统;二是利用QSerialPort和QSerialPortInfo类来获取。本文代码使用Qt5.9.6版本测试。

                         

                         方法一  获取windows注册表中的串口信息

1. 使用到的头文件:

需要添加三个头文件:

#include <QSettings>
#include <qt_windows.h>
#include <QMessageBox>

2. 源码:

没有使用类成员变量,将这两个函数复制过去,在类中声明函数即可使用。

// 获取计算机可用串口
QStringList SerialPort::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));
    }

    return CommPortList;
}

// nIndex为索引号 bValue选择返回值为key还是value,默认为value
QString SerialPort::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;
}

 

3.  成果展示:

(1)获取Value:

(2)获取Key:

 

/*==================================================================================*/

            方法二  利用QSerialPort和QSerialPortInfo类获取

1. pro工程文件里添加 QT += serialport

2. 使用的头文件:

#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>

3. 源代码:

// 获取计算机可用串口
QStringList SerialPort::GetEnableCommPort()
{
    QStringList CommPortList;

    foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        QSerialPort serial;
        serial.setPort(info);
        if (serial.open(QIODevice::ReadWrite))
        {
            CommPortList.append(serial.portName());
            serial.close();
        }
    }

    return CommPortList;
}

4. 成果展示:

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页