• Qt开发之串口通信(三)


    VS+Qt中获取串口COM的两种方式:

    1、使用QT自带的类

    bool QBatteryTesting::serialport_init()
    {
        //获得所有可用端口列表
        QList serialPortInfoList = QSerialPortInfo::availablePorts();
        if (serialPortInfoList.isEmpty())
        {
            return false;
        }

        QList::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 需要加头文件
        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;

    }

  • 相关阅读:
    【无标题】
    Python 编程基础 | 第六章-包与模块管理 | 1、包与模块简介
    Android NDK篇-C++语言之 this 原理和可变参数与友元函数友元类
    单链表的相关操作(初阶)
    网络面试-0x04 DNS协议以及查询过程?
    趣聊粒子滤波器Particle Filter的概念问题
    阿里云无影升级2.0 云电脑解决方案时代到来
    42、集合的第一大类:List
    442. 数组中重复的数据
    【EI会议征稿】JPCS独立出版-第五届新材料与清洁能源国际学术会议(ICAMCE 2024)
  • 原文地址:https://blog.csdn.net/bigtree_mfc/article/details/128147870