溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Qt獲取系統串口信息

發布時間:2020-06-12 01:10:39 來源:網絡 閱讀:1272 作者:小溢 欄目:開發技術

打開注冊表

菜單-》運行

輸入regedit

到目錄

HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM\\

中,該目錄下有的com口表示系統當前存在的com

//獲取系統串口注冊表中index索引位置的鍵名或鍵值
//QString為value字符串時為獲取鍵值,鍵值即com名
QString getcomm(int index, QString keyorvalue)
{
    QString commresult = "";
    QString strkey = "HARDWARE\\DEVICEMAP\\SERIALCOMM";//子鍵路徑
    int a = strkey.toWCharArray(subkey);

    subkey[a] = L'\0';
    if  (RegOpenKeyEx(HKEY_LOCAL_MACHINE, subkey, 0, KEY_READ|KEY_QUERY_VALUE, &hKey) != 0 )
    {
        QMessageBox::question(NULL, QString("錯誤"), QString("注冊表打開失敗\r\n請檢查注冊表路徑是否正確!"));
    }

    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 = QString::fromStdWString(keyname);
            keymessage.append(message);
        }
        //讀取鍵值
        for (int j = 0; j < valuesize; j++)
        {
            if (keyvalue[j] != 0x00 )
            {
                valuemessage.append(keyvalue[j]);
            }
        }

        if ( keyorvalue == "key" )
        {
            commresult = keymessage;
        }
        if ( keyorvalue == "value" )
        {
            commresult = valuemessage;
        }
    }
    else
    {
        commresult = "nokey";
    }
    ::RegCloseKey(hKey);    //關閉注冊表
    return commresult;
}

//系統存在串口以及其他所有串口放入到comboxcomlist列表中
void init_comlist(void)
{
    QString path = "HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM";
    QSettings *settings = new QSettings(path, QSettings::NativeFormat);
    QStringList key = settings->allKeys();

    //系統注冊表中com存在的個數
    int comkeycount = key.size();
    //qDebug() << comkeycount << key;    //2 ("/Device/Serial0", "/Device/VCP0")

    regcomlist.clear();
    comboxcomlist.clear();

    for ( int i = 0; i < comkeycount; i++ )
    {
        //將注冊表中有的com名字放入列表中
        //qDebug() << getcomm(i, "key");
        regcomlist << getcomm(i, "value");
        //qDebug() << regcomlist.value(i);
    }

    qDebug() << regcomlist;
    qDebug() << create_user_virtual_comlist;
    qDebug() << create_private_virtual_comlist;

    //兩種情況,第一種,系統注冊表此時有虛擬串口的信息,那么要將保存系統注冊表中串口信息的regcomlist列表中刪除掉虛擬串口,create_user_virtual_comlist,create_private_virtual_comlist已經保存了上次的虛擬串口列表

    //for ( int i = 0; create_user_virtual_comlist; )

    //第二種,系統注冊表此時沒有虛擬串口信息,只有本機串口信息,那么就不需要刪除

    bool findflag = false;
    for ( int i = 0; i < MOST_VIRTUAL_COM_NUM; i++ )//combox組件中添加255個com
    {
        findflag = false;
        //遍歷保存注冊表中com的列表
        for ( int j = 0 ; j < comkeycount; j++ )
        {
            if ( QString::compare(regcomlist.value(j), QString("COM%1").arg(i + 1)) == 0 )
            {
                comboxcomlist << QString(regcomlist.value(j) + QString(" (本機)"));
                findflag = true;
                break;
            }
        }
        if ( findflag == true )
            continue;
        comboxcomlist << QString("COM%1").arg(i + 1);
    }


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女