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。

仓库地址

Qt 学习(3)的更多相关文章

  1. QT学习第1天

    QT学习第一天  坚持住!! 一 Qt概述 1.Qt发展历史 (1)1991年诞生(Haavard Nord/Eirik Chambe-Eng), (2)1994年创立Troll Tech(奇趣科技) ...

  2. 【转载】分享一些Qt学习资源,欢迎下载

    资源来源:http://bbs.csdn.net/topics/390358737 经过我一翻整理,把一些我收集到的Qt学习资源分享给大家,主要适合新手,老鸟可以直接忽略我.要说明一下,很多资源都是在 ...

  3. QT学习之路--创建一个对话框

    Q_OBJECT:这是一个宏,凡是定义信号槽的类都必须声明这个宏. 函数tr()全名是QObject::tr(),被他处理过的字符串可以使用工具提取出来翻译成其他语言,也就是做国际化使用. 对于QT学 ...

  4. 转载: Qt 学习之路 2归档

    Qt 学习之路 2归档 http://www.devbean.net/2012/08/qt-study-road-2-catelog/

  5. Qt 学习资料

    Qter开源社区http://www.qter.org/ [Qt教程], 作者yafeilinux [视频] QT学习之路:从入门到精通 <C++ Qt 编程视频教程>

  6. qt学习笔记(五) QGraphicsPixmapItem与QGraphicsScene的编程实例 图标拖动渐变效果

    应大家的要求,还是把完整的project文件贴出来,大家省点事:http://www.kuaipan.cn/file/id_48923272389086450.htm 先看看执行效果,我用的群创7寸屏 ...

  7. Qt学习博客推荐

    附录C Qt资源 C.1 Qt 官方资源 全 球各大公司以及独立开发人员每天都在加入 Qt 的开发社区.他们已经认识到了Qt 的架构本身便可加快应用程序开发进度.这些开发人员,无论是想开发单平台软件. ...

  8. qt学习教程1.qt开发环境搭建

    qt学习教程1.qt开发环境搭建 首先下载qt 下载地址:http://download.qt.io/archive/qt/ 此教程使用的版本为5.1.1 下载好后,打开安装包,然后点下一步 选择一个 ...

  9. QT学习教程

    原地址:http://www.devbean.NET/2012/08/qt-study-road-2-catelog/ 网上看到的不错的教程 本教程以qt5为主,部分地方会涉及qt4.据说非常适合qt ...

  10. Qt学习之路

      Qt学习之路_14(简易音乐播放器)   Qt学习之路_13(简易俄罗斯方块)   Qt学习之路_12(简易数据管理系统)   Qt学习之路_11(简易多文档编辑器)   Qt学习之路_10(Qt ...

随机推荐

  1. android studio中使用recyclerview小白篇(一)

    本人就是小白,昨天在使用listview时,看到说有更好的控件出来了,在V7包中,需要SDK21及以上,那就试着用用吧,今天试了一天,终于弄的能简单使用了,分享一下. 怎么导入这个recycleyvi ...

  2. javascript使用ajax方式

    ajax请回和回应实例: function showContent(type) { //create obj var xmlhttp; if (window.XMLHttpRequest) { //c ...

  3. git 使用那些事儿

    本文来自网易云社区 作者:孙有军 工欲善其事,必先利其器,git是一个开源的分布式版本控制工具,很多文章都写的太长,或者资料太多,难以一时间看完.在此总结了git的一些使用方式,因此该文不是鸿篇巨著, ...

  4. Github加载慢,显示不完整问题解决

    问题: 在访问Github网站的时候,可能会遇到网站响应超时,图片加载不出,排版错误等情况(大部分情况下是可以正常打开的). 解决方法: 修改 C:\Windows\System32\drivers\ ...

  5. Python——用os模块寻找指定目录(包括子目录)下所有图片文件

    import os # 导入os模块 def search_file(start_dir): img_list = [] extend_name = ['.jpg', '.png', '.gif'] ...

  6. [BZOJ4916]神犇和蒟蒻 杜教筛/Min_25筛

    题目大意: 给定\(n\le 10^9\),求: 1.\(\sum_{i=1}^n\mu(i^2)\) 2.\(\sum_{i=1}^n\varphi(i^2)\) 解释 1.\(\sum_{i=1} ...

  7. STL用法

    map.find(key) 获取map容器中指定键值x的元素,如果找到,返回此元素的迭代器,否则返回map::end()的迭代器(即查找到容器的末尾都没有找到此元素).

  8. 过河卒 NOIp 2002 dp

    题目描述 棋盘上AAA点有一个过河卒,需要走到目标BBB点.卒行走的规则:可以向下.或者向右.同时在棋盘上CCC点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为“马拦 ...

  9. PHPExcel类库的使用

    首先下载PHPEXCEL 下载地址:https://github.com/PHPOffice/PHPExcel 一.生成Excel <?php require "PHPExcel-1. ...

  10. Kibana6.x.x——【Running "run:optimizeBuild" (run) task】出现警告信息

    Warning: non-zero exit code 64 Use --force to continue. 还未找到解决方法,先记录下来.