提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
翻译|行业资讯|编辑:颜馨|2023-04-21 14:28:21.590|阅读 143 次
概述:本文将为大家介绍最新的Qt 6.5版本引入的许多新功能,欢迎下载相关组件体验~
# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>
Qt 是目前最先进、最完整的跨平台C++开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。
The Qt Company是Digia Plc旗下的全资子公司。负责所有Qt活动,包括产品开发,商业和开源授权模式以及在开放管理模式下的Qt工程。其许可、支持和服务能力能够和开发者紧密合作以确保他们的Qt项目准时部署,不超预算并拥有竞争优势。
Qt CAN总线模块始终提供API用于CAN总线的高级操作:
CAN总线帧由帧ID和有效负载组成。在现有的 API 中,FrameId 表示为无符号整数,有效负载只是一个保存一些原始字节的 QByteArray。
实际上,更高级别的协议应用于CAN总线帧之上。这克服了任意有效负载和 FrameId 的通用定义,该定义将其替换为可能发生的总线设备、消息和信号类型的唯一标识符,并为信号中的值提供类型信息。
在Qt 6.5之前,用户必须提供自己的实现来提取这些值。在Qt 6.5中,我们引入了一组API来简化此过程。
新的 API 提供了一种描述顶级协议的方法。稍后,这些规则可用于解码传入的CAN帧,以及在将数据发送到设备之前将数据编码为CAN帧。
让我们仔细看看 API:
QCanFrameProcessor 类使用其他新类提供的描述。它提供了两种主要方法来编码和解码帧:
让我们开发一个小示例来演示运行中的新 API。
让我们考虑一个具有以下格式的协议:
可以使用下图可视化此格式。
让我们看看如何用新的 API 来描述这个协议。
唯一标识符
让我们从唯一标识符开始。
QCanUniqueIdDescription uid; uid.setSource(QtCanBus::DataSource::FrameId); uid.setEndian(QSysInfo::Endian::LittleEndian); uid.setStartBit(0); uid.setBitLength(11);
我们定义源(FrameId),字节序(Little-Endian),起始位和唯一标识符的位长度。
源定义了CAN帧的一部分,该帧将用于提取值。它可以是帧 ID 或有效负载。
信号和消息描述
接下来,让我们定义信号描述。
QCanSignalDescription s0; s0.setName(u"signal 0"_s); s0.setDataSource(QtCanBus::DataSource::Payload); s0.setDataEndian(QSysInfo::Endian::LittleEndian); s0.setDataFormat(QtCanBus::DataFormat::UnsignedInteger); s0.setStartBit(0); s0.setBitLength(16); QCanSignalDescription s1; s1.setName(u"signal 1"_s); s1.setDataSource(QtCanBus::DataSource::Payload); s1.setDataEndian(QSysInfo::Endian::LittleEndian); s1.setDataFormat(QtCanBus::DataFormat::SignedInteger); s1.setStartBit(16); s1.setBitLength(32);
对于这两个信号,我们定义信号名称、源(有效载荷)、字节序(小端)、数据类型、起始位和位长度。请注意,对于整个有效负载,位编号是连续的。位 0 表示字节 0 的第一个位,位 63 表示字节 7 的最后一位。信号名称在消息描述中必须是唯一的。信号名称用于在解析帧时提供有意义的结果,并标识将值编码到新生成的帧中的正确规则。允许您指定更多参数。有关完整列表,请参阅文档。
指定信号描述后,我们可以定义消息描述。
QCanMessageDescription msg; msg.setName(u"example message"_s); msg.setSize(8); msg.setUniqueId(QtCanBus::UniqueId{0x123}); msg.setSignalDescriptions({s0, s1});
对于消息描述,我们指定有效负载大小、此消息中包含的信号描述列表以及唯一标识符。唯一标识符将用于在解码传入CAN帧时选择正确的消息描述。与信号描述一样,QCanMessageDescription 类允许您指定更多参数,因此请务必查看文档。
帧处理器
一旦我们为唯一标识符和消息创建了描述,我们就可以创建 QCanFrameProcessor 的实例。
QCanFrameProcessor processor; processor.setUniqueIdDescription(uid); processor.setMessageDescriptions({msg});
帧处理器使用先前生成的唯一 ID 描述和消息描述列表进行初始化。在我们的例子中,列表只包含一个元素。
处理 CAN 帧
本节介绍如何使用上述消息描述来解析传入帧和对新帧进行编码。
为简单起见,让我们手动创建一个CAN帧。
QCanBusFrame frame(0x123, QByteArray::fromHex("ABCD123456780000"));
实际上,这样的帧将从QCanBusDevice接收。请注意,框架具有与之前创建的消息描述的唯一标识符匹配的唯一标识符。
要解析此帧,只需调用 parseFrame() 方法:
QCanFrameProcessor::ParseResult result = processor.parseFrame(frame); qDebug() << Qt::hex << Qt::showbase << Qt::uppercasedigits << "Unique ID:" << result.uniqueId << Qt::endl << "Values:" << result.signalValues;
此方法返回一个 ParseResult 结构,其中包含一个唯一标识符和一个保存信号名称和信号值的映射。qDebug() 调用的输出如下所示。
Unique ID: 0x123 Values: QMap(("signal 0", QVariant(qulonglong, 0xCDAB))("signal 1", QVariant(qlonglong, 0x78563412)))
要生成帧,我们需要调用 prepareFrame() 方法,并将唯一标识符以及信号名称和信号值的映射作为参数传递。信号名称必须与信号描述的名称匹配。对于此示例,我们将重用 parseFrame() 方法返回的值。
QCanBusFrame generated = processor.prepareFrame(result.uniqueId, result.signalValues); qDebug() << Qt::hex << Qt::showbase << Qt::uppercasedigits << generated.frameId() << generated.payload().toHex().toUpper();
生成的帧应与初始帧相似。这就是我们在 qDebug() 输出中看到的。
上一节中的示例演示如何手动指定CAN报文描述。这种方法相当冗长且容易出错。
我们能做得更好吗?
幸运的是,已经有一些众所周知的描述CAN总线参数的标准。其中一个标准是DBC。它是一种基于文本的格式,广泛用于各个行业。
在Qt 6.5中,我们引入了QCanDbcFileParser类。此类分析输入 DBC 文件,并自动生成消息说明。DBC 格式还包含对唯一标识符的明确定义要求,因此该类还具有生成唯一标识符描述的静态方法。
此示例可以说明使用此类的典型模式。
QCanDbcFileParser dbcParser; if (dbcParser.parse("path/to/file.dbc")) { QCanFrameProcessor processor; processor.setUniqueIdDescription(QCanDbcFileParser::uniqueIdDescription()); processor.setMessageDescriptions(dbcParser.messageDescriptions()); // Do the actual processing } else { // Failed to extract data from DBC file qDebug() << "Got error:" << dbcParser.error(); qDebug() << "Error details:" << dbcParser.errorString(); }
如果DBC文件解析成功,我们可以使用生成的消息和唯一标识符描述来创建帧处理器并开始处理。如果解析失败,API 会提供一些方便的方法来处理错误。
欢迎下载|体验更多Qt相关组件
获取更多信息请咨询 ;Qt技术交流群:166830288
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@cahobeh.cn
通过提供强大的3D CAD数据访问工具并适用于桌面、移动和Web的高级环境3D可视化发动机,HOOPS在提升造船设计和制造流程的效率方面发挥了重要作用。
HOOPS Luminate在汽车行业中的应用具有广泛的潜力和深远的影响。它通过提供高效的3D可视化、虚拟装配与拆解、性能分析、客户定制等功能,帮助汽车制造商在设计、生产和销售过程中提升效率、降低成本并提高产品质量。
在不断发展的软件开发世界中,使工具和框架与最新的平台版本保持同步至关重要,欢迎查阅~
全球航运业对国际贸易至关重要,全球 90% 以上的商品通过海运运输。准确监控和控制这些集装箱的移动对于维持高效的供应链至关重要。手动输入集装箱号码是这一程序的关键部分,它带来了相当大的挑战,例如人为错误和效率低下。
一个独特的Qt开发框架产品,吸收了Delphi、C++以及其他语言的优点
QtitanRibbon专业全面 & 实现Qt技术的跨平台Ribbon UI组件
QtitanChart性能优异的跨平台Qt类图表组件
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@cahobeh.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢