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。
Qt 学习(3)的更多相关文章
- QT学习第1天
QT学习第一天 坚持住!! 一 Qt概述 1.Qt发展历史 (1)1991年诞生(Haavard Nord/Eirik Chambe-Eng), (2)1994年创立Troll Tech(奇趣科技) ...
- 【转载】分享一些Qt学习资源,欢迎下载
资源来源:http://bbs.csdn.net/topics/390358737 经过我一翻整理,把一些我收集到的Qt学习资源分享给大家,主要适合新手,老鸟可以直接忽略我.要说明一下,很多资源都是在 ...
- QT学习之路--创建一个对话框
Q_OBJECT:这是一个宏,凡是定义信号槽的类都必须声明这个宏. 函数tr()全名是QObject::tr(),被他处理过的字符串可以使用工具提取出来翻译成其他语言,也就是做国际化使用. 对于QT学 ...
- 转载: Qt 学习之路 2归档
Qt 学习之路 2归档 http://www.devbean.net/2012/08/qt-study-road-2-catelog/
- Qt 学习资料
Qter开源社区http://www.qter.org/ [Qt教程], 作者yafeilinux [视频] QT学习之路:从入门到精通 <C++ Qt 编程视频教程>
- qt学习笔记(五) QGraphicsPixmapItem与QGraphicsScene的编程实例 图标拖动渐变效果
应大家的要求,还是把完整的project文件贴出来,大家省点事:http://www.kuaipan.cn/file/id_48923272389086450.htm 先看看执行效果,我用的群创7寸屏 ...
- Qt学习博客推荐
附录C Qt资源 C.1 Qt 官方资源 全 球各大公司以及独立开发人员每天都在加入 Qt 的开发社区.他们已经认识到了Qt 的架构本身便可加快应用程序开发进度.这些开发人员,无论是想开发单平台软件. ...
- qt学习教程1.qt开发环境搭建
qt学习教程1.qt开发环境搭建 首先下载qt 下载地址:http://download.qt.io/archive/qt/ 此教程使用的版本为5.1.1 下载好后,打开安装包,然后点下一步 选择一个 ...
- QT学习教程
原地址:http://www.devbean.NET/2012/08/qt-study-road-2-catelog/ 网上看到的不错的教程 本教程以qt5为主,部分地方会涉及qt4.据说非常适合qt ...
- Qt学习之路
Qt学习之路_14(简易音乐播放器) Qt学习之路_13(简易俄罗斯方块) Qt学习之路_12(简易数据管理系统) Qt学习之路_11(简易多文档编辑器) Qt学习之路_10(Qt ...
随机推荐
- android studio中使用recyclerview小白篇(一)
本人就是小白,昨天在使用listview时,看到说有更好的控件出来了,在V7包中,需要SDK21及以上,那就试着用用吧,今天试了一天,终于弄的能简单使用了,分享一下. 怎么导入这个recycleyvi ...
- javascript使用ajax方式
ajax请回和回应实例: function showContent(type) { //create obj var xmlhttp; if (window.XMLHttpRequest) { //c ...
- git 使用那些事儿
本文来自网易云社区 作者:孙有军 工欲善其事,必先利其器,git是一个开源的分布式版本控制工具,很多文章都写的太长,或者资料太多,难以一时间看完.在此总结了git的一些使用方式,因此该文不是鸿篇巨著, ...
- Github加载慢,显示不完整问题解决
问题: 在访问Github网站的时候,可能会遇到网站响应超时,图片加载不出,排版错误等情况(大部分情况下是可以正常打开的). 解决方法: 修改 C:\Windows\System32\drivers\ ...
- Python——用os模块寻找指定目录(包括子目录)下所有图片文件
import os # 导入os模块 def search_file(start_dir): img_list = [] extend_name = ['.jpg', '.png', '.gif'] ...
- [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} ...
- STL用法
map.find(key) 获取map容器中指定键值x的元素,如果找到,返回此元素的迭代器,否则返回map::end()的迭代器(即查找到容器的末尾都没有找到此元素).
- 过河卒 NOIp 2002 dp
题目描述 棋盘上AAA点有一个过河卒,需要走到目标BBB点.卒行走的规则:可以向下.或者向右.同时在棋盘上CCC点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为“马拦 ...
- PHPExcel类库的使用
首先下载PHPEXCEL 下载地址:https://github.com/PHPOffice/PHPExcel 一.生成Excel <?php require "PHPExcel-1. ...
- Kibana6.x.x——【Running "run:optimizeBuild" (run) task】出现警告信息
Warning: non-zero exit code 64 Use --force to continue. 还未找到解决方法,先记录下来.