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 ...
随机推荐
- JS中setTimeout()的用法详解
1. SetTimeOut() 1.1 SetTimeOut()语法例子 1.2 用SetTimeOut()执行Function 1.3 SetTimeOut()语法例子 1.4 设定条件使SetTi ...
- The Controls collection cannot be modified because the control contains code blocks (i.e. <% ... %>).
刚才Insus.NET有尝试改一段代码,是让用户能动态变更网页背景图片的小功能.当Insus.NET去执行铵钮Click事件时,它却出现标题的错误.代码是这样的: 此代码,原本是没有什么问题的,但现在 ...
- Go语言环境安装-Mac
1.环境安装 Go SDK下载和安装,下载地址为:https://golang.org/dl/ Visual Studio Code下载和安装,下载地址为:https://code.visualstu ...
- springboot junit单元测试报错
1.测试类中如下方框为主函数 2.application.yml注意如下2个地方 3.主函数
- [USACO08OPEN]农场周围的道路Roads Around The Farm BZOJ 1621 DFS
Farmer John's cows have taken an interest in exploring the territory around the farm. Initially, all ...
- flask-SocketIO
本文来源:https://www.jianshu.com/p/d81397edd2b1 websocket是html5中实现了服务端和客户端进行双向文本或二进制数据通信的一种新协议,其实已经低于HTT ...
- filter防止xxs攻击
什么是XSS攻击? XSS攻击使用Javascript脚本注入进行攻击 例如在表单中注入: <script>location.href='http://www.itmayiedu.com' ...
- zookeeper客户端使用原生JavaApi操作节点
1.引入依赖 <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zook ...
- crm web ui
1:View中的field对应于model中的attribute. 2:custom controller具有更长的生存时间,能够在view中共享一些数据. 3:window是component的一个 ...
- HttpServletResponse 解决中文乱码
response.setHeader("Content-type", "text/html;charset=UTF-8"); response.setChara ...