QCanSignalDescription Class
QCanSignalDescription 类描述了从 CAN 帧中提取一个值并以应用程序定义的格式表示它的规则。更多
头文件: | #include <QCanSignalDescription> |
CMake.QCanSignalDescription 类 | find_package(Qt6 REQUIRED COMPONENTS SerialBus) target_link_libraries(mytarget PRIVATE Qt6::SerialBus) |
qmake: | QT += serialbus |
自 | Qt 6.5 |
状态: | 初步 |
该类正在开发中,可能会有变动。
公共类型
(since 6.5) struct | MultiplexValueRange |
MultiplexSignalValues | |
MultiplexValues |
公共函数
QCanSignalDescription() | |
QCanSignalDescription(const QCanSignalDescription &other) | |
QCanSignalDescription(QCanSignalDescription &&other) | |
~QCanSignalDescription() | |
void | addMultiplexSignal(const QString &name, const QCanSignalDescription::MultiplexValues &ranges) |
void | addMultiplexSignal(const QString &name, const QVariant &value) |
quint16 | bitLength() const |
void | clearMultiplexSignals() |
QString | comment() const |
QSysInfo::Endian | dataEndian() const |
QtCanBus::DataFormat | dataFormat() const |
QtCanBus::DataSource | dataSource() const |
double | factor() const |
bool | isValid() const |
double | maximum() const |
double | minimum() const |
QCanSignalDescription::MultiplexSignalValues | multiplexSignals() const |
QtCanBus::MultiplexState | multiplexState() const |
QString | name() const |
double | offset() const |
QString | physicalUnit() const |
QString | receiver() const |
double | scaling() const |
void | setBitLength(quint16 length) |
void | setComment(const QString &text) |
void | setDataEndian(QSysInfo::Endian endian) |
void | setDataFormat(QtCanBus::DataFormat format) |
void | setDataSource(QtCanBus::DataSource source) |
void | setFactor(double factor) |
void | setMultiplexSignals(const QCanSignalDescription::MultiplexSignalValues &multiplexorSignals) |
void | setMultiplexState(QtCanBus::MultiplexState state) |
void | setName(const QString &name) |
void | setOffset(double offset) |
void | setPhysicalUnit(const QString &unit) |
void | setRange(double minimum, double maximum) |
void | setReceiver(const QString &receiver) |
void | setScaling(double scaling) |
void | setStartBit(quint16 bit) |
quint16 | startBit() const |
QCanSignalDescription & | operator=(QCanSignalDescription &&other) |
QCanSignalDescription & | operator=(const QCanSignalDescription &other) |
详细描述
QCanSignalDescription 类可用于提供信号描述,随后用它对接收到的QCanBusFrame 进行解码,或将输入数据编码成QCanBusFrame 发送给接收器。
一般描述
每个 CAN 帧可以包含多个值。从 CAN 帧中提取值的规则如下:
- 数据源(帧 ID 或有效载荷)。
- 数据字节序。详见Data Endianness Processing 部分。
- 数据格式。
- 起始位位置。
- 数据长度(位)。
- 多路复用选项。
相对于所选数据源指定起始位位置。位从 LSB 开始计数。
提取数据后,可能需要将其转换为应用程序定义的格式。以下参数可用于此目的:
- 将提取值转换为物理值的各种参数(因子、偏移、比例)。
- 预期数据范围。
- 数据单位。
QCanSignalDescription 类提供了控制所有这些参数的方法。
数据内位处理
小端和大端数据的编码方式不同。对于 big endian 值,起始位位置为最有效位。对于小端码值,起始位位置是最小有效位。
我们来看两个例子。在这两个例子中,我们都将在 3 字节有效载荷中编码两个 12 位的值。
小端位
对于小端模式,数据布局可用下图表示:
LSB
表示值的第一位(最小有效位),MSB
表示值的最后一位(最有效位)。蓝色表示第一个值,橙色表示第二个值。
这些值的相关信息将按以下方式在 QCanSignalDescription 中编码:
QCanSignalDescription signal1; signal1.setDataEndian(QSysInfo::Endian::LittleEndian); signal1.setStartBit(0); signal1.setBitLength(12); // other parameters for signal1 QCanSignalDescription signal2; signal2.setDataEndian(QSysInfo::Endian::LittleEndian); signal2.setStartBit(12); signal2.setBitLength(12); // other parameters for signal2
大尾数
下图表示大底情况下的值布局:
这些值可按以下方式在 QCanSignalDescription 中表示:
QCanSignalDescription signal1; signal1.setDataEndian(QSysInfo::Endian::BigEndian); signal1.setStartBit(7); signal1.setBitLength(12); // other parameters for signal1 QCanSignalDescription signal2; signal2.setDataEndian(QSysInfo::Endian::BigEndian); signal2.setStartBit(11); signal2.setBitLength(12); // other parameters for signal2
请注意起始位与小端位的不同。此外,数值的对齐方式也不同。
多路复用信号解释
CAN 有效载荷中有两种常见的数据编码方式:
- 每个比特范围始终代表相同的信号。例如,有效载荷中的
Bytes 0-1
可以代表发动机转速(单位为 rpm),而Bytes 2-3
可以代表车速(单位为 km/h)。 - 同一比特范围可以代表不同的数据,这取决于有效载荷中其他一些比特的值。例如,如果
Byte 0
的值为0
,则Bytes 1-2
代表发动机转速(以 rpm 为单位),如果Byte 0
的值为1
,则Bytes 1-2
代表车速(以 km/h 为单位)。
第二种情况使用信号复用。在所提供的示例中,我们将有三个信号。第一个信号代表Byte 0
的值,起复用器信号的作用。另外两个信号分别代表发动机转速和车速,但每次只能从 CAN 有效载荷中提取其中一个。提取哪个信号由多路复用器信号的值决定。
在更复杂的情况下,有效载荷可能有多个多路复用器信号。在这种情况下,只有当所有多路复用器都包含预期值时,才能从有效载荷中提取信号。
数值转换
在许多情况下,CAN 总线上传输的信号无法保留其所代表的全部物理值。为了克服这些限制,物理值在传输前会转换为较小的范围,并可在接收端恢复。
物理值和信号值之间的转换公式如下:
physicalValue = scaling * (signalValue * factor + offset); signalValue = (physicalValue / scaling - offset) / factor;
因子和缩放参数不能等于0
。
如果任何一个参数等于qQNaN() ,则在转换过程中不会使用。如果所有参数都等于qQNaN() (默认值),则不执行转换。
成员类型文档
[alias]
QCanSignalDescription::MultiplexSignalValues
[alias]
QCanSignalDescription::MultiplexValues
成员函数文档
QCanSignalDescription::QCanSignalDescription()
创建一个空的信号描述。
QCanSignalDescription::QCanSignalDescription(const QCanSignalDescription &other)
使用从other 复制的值创建信号描述。
[noexcept]
QCanSignalDescription::QCanSignalDescription(QCanSignalDescription &&other)
通过移动other 创建信号描述。
注意: 移入的 QCanSignalDescription 对象只能被销毁或赋值。调用析构函数或赋值操作符之外的其他函数的效果未定义。
[noexcept]
QCanSignalDescription::~QCanSignalDescription()
销毁该信号描述。
void QCanSignalDescription::addMultiplexSignal(const QString &name, const QCanSignalDescription::MultiplexValues &ranges)
为该信号添加新的multiplexor signal 。name 参数包含多路复用器信号的名称,ranges 参数包含预期值范围。
如果多路复用器信号name 已有预期值范围,则这些范围将被覆盖。
另请参阅 multiplexState()、multiplexSignals()、clearMultiplexSignals() 和setMultiplexSignals() 。
void QCanSignalDescription::addMultiplexSignal(const QString &name, const QVariant &value)
这是一个重载函数。
这是一个方便的重载函数,适用于只期望多路复用器信号具有一个特定值而不是一系列值的情况。
name 参数包含多路复用器信号的名称,value 参数包含期望值。
如果多路复用器信号name 已有预期值范围,该信号的预期值范围将被覆盖。
另请参阅 multiplexState()、multiplexSignals()、clearMultiplexSignals() 和setMultiplexSignals() 。
quint16 QCanSignalDescription::bitLength() const
返回信号值的位长。
另请参阅 setBitLength()、startBit() 和setStartBit()。
void QCanSignalDescription::clearMultiplexSignals()
删除该信号的所有multiplexor signals 。
另请参阅 multiplexSignals()、setMultiplexSignals() 和addMultiplexSignal()。
QString QCanSignalDescription::comment() const
返回信号的注释。
该参数仅用于额外说明。在信号处理过程中不会使用。
另请参见 setComment().
QSysInfo::Endian QCanSignalDescription::dataEndian() const
返回信号值的数据 endian。
默认使用BigEndian 。
注意: 如果dataFormat() 设置为AsciiString ,数据的 endian 值将被忽略。
另请参阅 setDataEndian() 和QSysInfo::Endian 。
QtCanBus::DataFormat QCanSignalDescription::dataFormat() const
返回信号值的数据格式。
默认使用SignedInteger 。
另请参阅 setDataFormat() 和QtCanBus::DataFormat 。
QtCanBus::DataSource QCanSignalDescription::dataSource() const
返回信号值的数据源。
默认使用Payload 。
另请参阅 setDataSource() 和QtCanBus::DataSource 。
double QCanSignalDescription::factor() const
返回用于将信号值转换为物理值的因子。
默认情况下,函数返回qQNaN() ,即不使用系数。
Value Conversions 部分将解释如何使用该参数。
另请参阅 setFactor()、offset() 和scaling()。
bool QCanSignalDescription::isValid() const
如果信号描述有效,则返回true
,否则返回false
。
有效的信号描述必须满足以下条件:
- 有一个非空的name()
- 如果dataFormat() 是,则有bitLength()
== 32
Float - 有bitLength()
== 64
,如果dataFormat() 是Double - bitLength()必须是
8
的倍数,如果dataFormat() 是AsciiString - 则bitLength()必须大于
0
,小于或等于64
。
另请参见 bitLength()、dataFormat() 和name()。
double QCanSignalDescription::maximum() const
返回信号的最大支持值。
默认情况下,函数返回qQNaN() ,即没有最大值。
double QCanSignalDescription::minimum() const
返回信号的最小支持值。
默认情况下,函数返回qQNaN() ,即没有最小值。
QCanSignalDescription::MultiplexSignalValues QCanSignalDescription::multiplexSignals() const
返回用于正确标识该信号的multiplexor signals 及其期望值。
返回的哈希值包含作为键的信号名称和作为值的各自期望值范围。
只有当散列中的所有信号都具有预期值时,才能从有效负载中提取该信号的值。
另请参见 multiplexState()、clearMultiplexSignals()、setMultiplexSignals() 和addMultiplexSignal()。
QtCanBus::MultiplexState QCanSignalDescription::multiplexState() const
返回信号的多路复用状态。
有关多路复用信号的更多详情,请参阅Multiplexed Signals Explained 部分。
默认情况下,该方法返回None 。
另请参阅 setMultiplexState() 和QtCanBus::MultiplexState 。
QString QCanSignalDescription::name() const
返回信号的名称。
double QCanSignalDescription::offset() const
返回用于将信号值转换为物理值的偏移量。
默认情况下,函数返回qQNaN() 表示不使用偏移量。
Value Conversions 部分将解释如何使用该参数。
另请参阅 setOffset()、factor() 和scaling()。
QString QCanSignalDescription::physicalUnit() const
返回信号值的物理单位(如 km/h),如果未设置单位,则返回空字符串。
该参数仅用于额外说明。在信号处理过程中不会使用。
另请参阅 setPhysicalUnit().
QString QCanSignalDescription::receiver() const
返回该信号的接收节点。
该参数仅用于额外说明。在信号处理过程中不会使用。
另请参见 setReceiver()。
double QCanSignalDescription::scaling() const
返回将信号值转换为物理值时使用的缩放。
默认情况下,函数返回qQNaN() 表示不使用缩放。
Value Conversions 部分将解释如何使用该参数。
另请参阅 setScaling()、offset() 和factor()。
void QCanSignalDescription::setBitLength(quint16 length)
将信号值的位长设置为length 。
另请参阅 bitLength()、startBit() 和setStartBit()。
void QCanSignalDescription::setComment(const QString &text)
将信号的注释设置为text 。
该参数仅用于额外说明。在信号处理过程中不会使用。
另请参阅 comment() 。
void QCanSignalDescription::setDataEndian(QSysInfo::Endian endian)
将信号值的数据字节序设置为endian 。
另请参见 dataEndian() 和QSysInfo::Endian 。
void QCanSignalDescription::setDataFormat(QtCanBus::DataFormat format)
将信号值的数据格式设置为format 。
另请参阅 dataFormat() 和QtCanBus::DataFormat 。
void QCanSignalDescription::setDataSource(QtCanBus::DataSource source)
将信号值的数据源设置为source 。
另请参阅 dataSource() 和QtCanBus::DataSource 。
void QCanSignalDescription::setFactor(double factor)
设置用于将信号值转换为物理值并返回factor 的因子。
向该方法传递qQNaN() 可在转换过程中跳过该参数。
系数不能为 0。试图设置零系数相当于将其设置为qQNaN()。
Value Conversions 部分解释了如何使用此参数。
另请参阅 factor()、setOffset() 和setScaling()。
void QCanSignalDescription::setMultiplexSignals(const QCanSignalDescription::MultiplexSignalValues &multiplexorSignals)
将此信号的multiplexor signals 设置为multiplexorSignals 。
multiplexorSignals 哈希值必须包含作为键的信号名称和作为值的各自所需值范围。
另请参阅 multiplexState()、multiplexSignals()、clearMultiplexSignals() 和addMultiplexSignal()。
void QCanSignalDescription::setMultiplexState(QtCanBus::MultiplexState state)
将信号的多路复用状态设置为state 。
有关多路复用信号的更多详情,请参阅Multiplexed Signals Explained 部分。
另请参阅 multiplexState() 和QtCanBus::MultiplexState 。
void QCanSignalDescription::setName(const QString &name)
将信号名称设置为name 。
信号名称在 CAN 报文中必须是唯一的。
另请参阅 name() 。
void QCanSignalDescription::setOffset(double offset)
设置偏移量,用于将信号值转换为物理值并返回offset 。
向该方法传递qQNaN() 可在转换过程中跳过该参数。
Value Conversions 部分将解释如何使用该参数。
另请参阅 offset()、setFactor() 和setScaling()。
void QCanSignalDescription::setPhysicalUnit(const QString &unit)
设置信号值的物理unit (例如 km/h)。
该参数仅用于额外说明。在信号处理过程中不会使用。
另请参阅 physicalUnit().
void QCanSignalDescription::setRange(double minimum, double maximum)
设置信号值的minimum 和maximum 。
将一个或两个参数设置为qQNaN() 意味着不使用相应的限值。
void QCanSignalDescription::setReceiver(const QString &receiver)
为该信号设置receiver 节点。
该参数仅用于额外说明。在信号处理过程中不会使用。
另请参阅 receiver().
void QCanSignalDescription::setScaling(double scaling)
设置将信号值转换为物理值并返回scaling 时使用的缩放比例。
向该方法传递qQNaN() 可在转换过程中跳过该参数。
缩放比例不能为 0。尝试设置零缩放比例相当于将其设置为qQNaN()。
Value Conversions 部分解释了如何使用该参数。
另请参阅 scaling()、setOffset() 和setFactor()。
void QCanSignalDescription::setStartBit(quint16 bit)
将dataSource() 中信号值的起始位设置为bit 。
另请参阅 startBit()、bitLength() 和setBitLength()。
quint16 QCanSignalDescription::startBit() const
返回dataSource() 中信号值的起始位。
另请参阅 setStartBit()、bitLength() 和setBitLength()。
[noexcept]
QCanSignalDescription &QCanSignalDescription::operator=(QCanSignalDescription &&other)
移动--将other 中的值赋值给该信号描述。
注意: 移动后的QCanSignalDescription 对象只能被销毁或赋值。调用析构函数或赋值操作符之外的其他函数的效果未定义。
QCanSignalDescription &QCanSignalDescription::operator=(const QCanSignalDescription &other)
将other 中的值分配给该信号描述。
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.