Qt 学习(3)

Qt 修改 Windows 注册表项

在使用 FT232R 驱动(usb转串口设备)连接电脑时,下位机发送的数据会被转换器缓存起来,由串口转换器驱动设定的延时定时发送到 PC,这样就造成了一个问题:上位机和下位机同时发送数据时将会导致电平冲突(乱码)。为了解决这个问题就需要进入设备管理器中将设备的延时调小。然而每次设置设备管理器的延时都比较麻烦,已知设备延时的值是在注册表中存储,那么直接修改注册表项就可以将延时调小。

延时所在的注册表项为 HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Enum\\FTDIBUS\\device-id\\0000\\Device Parameters\\LatencyTimer,其中 device-id 与实际使用的设备有关。

Qt 读写注册表可以通过 QSettings 实现。

// RegisterModifier.cpp
const int maxLatency = 3;
const QString registerPath = QString("HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Enum\\FTDIBUS");
const QString latencyKey   = QString("LatencyTimer");

void RegisterModifier::modify()
{
    QFile file("./modifierLog.txt");
    file.open(QFile::WriteOnly);
    QTextStream ts(&file);

    QSettings set( registerPath, QSettings::NativeFormat );
    int latency = 0;
    bool needModify = false;
    foreach (QString device, set.allKeys()) {
        if( device.endsWith( latencyKey ) ) {
            latency = set.value( device ).toInt();
            if( latency > maxLatency ) {
                set.setValue( device, maxLatency );
                set.sync();
                latency = set.value( device ).toInt();
                ts << device << " ==> " << latency;
                qDebug() << device << " ==> " << latency;
                needModify = true;
            }
        }
    }
    if( !needModify ) {
        ts << "No need to modify.";
        qDebug() << "No need to modify.";
    }
    file.close();
}

由于 device-id 与设备有关,因此注册表只能读到 HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Enum\\FTDIBUS 这个位置,然后通过 QSettings::allKeys() 方法遍历所有的设备。
实际使用过程中这个方法会直接返回每一个子项,例如:HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Enum\\FTDIBUS\\VID_0403+PID_6001+A400ha5MA\\0000\\Device Parameters\\LatencyTimer 就是其中的一个 key,所以遍历所有 key 之后判断该 key 是否以 LatencyTimer 结尾即可(注意大小写)。

得到延时的值之后判断值是否足够小,若延时较大,则更新延时的值。

运行程序

构建并运行程序后,发现无法修改注册表中的值,分析验证后猜测是程序运行权限较低,无法修改注册表 HKEY_LOCAL_MACHINE 中的值,因此程序需要以管理员权限运行。

添加管理员权限

添加权限的方法比较多,一种是只适合 msvc 编译器的方法:在 .pro 文件中添加以下内容:

win32 {
  QMAKE_LFLAGS += /MANIFESTUAC:\"level=\'requireAdministrator\' uiAccess=\'false\'\"
}

构建后的程序图标右下角将会有个盾牌:

还有一种 方法 适合 MingW 编译器,这种方法比前面一种要稍微麻烦一点,建议直接参考原文 https://www.devbean.net/2016/03/enable-qt-app-admin-on-win/。

再次运行程序

添加了管理员权限的程序运行后,所有串口转 usb 设备的延时都变成了 3ms。

仓库地址

posted @ 2018-08-29 09:21  brifuture  阅读(331)  评论(0编辑  收藏  举报