本页内容

QCanSignalDescription Class

QCanSignalDescription 类描述了从 CAN 帧中提取一个值并将其以应用程序定义的格式表示的规则。更多内容...

头文件: #include <QCanSignalDescription>
CMake: find_package(Qt6 REQUIRED COMPONENTS SerialBus)
target_link_libraries(mytarget PRIVATE Qt6::SerialBus)
qmake: QT += serialbus
自: Qt 6.5
状态: 技术预览版

该类处于技术预览阶段,内容可能会有变动。

公共类型

公共函数

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 类提供了用于控制所有这些参数的方法。

数据字节序处理

小端和大数据的编码方式不同。对于大数据值,起始位位置指最高有效位。对于小端值,起始位置是指最低有效位。

让我们来看两个示例。在这两个示例中,我们都将两个 12 位值编码在 3 字节的有效载荷中。

小端序

对于小端模式,数据布局可通过下图表示:

小端制 CAN 信号位布局:蓝色和橙色方块显示了字节 0-2 中的两个值,并标明了最低有效位(LSB)和最高有效位(MSB)的位置

此处,列代表位号,行代表字节号。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
大端序

下图展示了大端序情况下的值布局:

大端序 CAN 信号位布局:蓝色和橙色方块显示了字节 0-2 中的两个值,并标出了最高有效位(MSB)和最低有效位(LSB)的位置

这些值可在 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 复制的值。

[constexpr noexcept default] QCanSignalDescription::QCanSignalDescription(QCanSignalDescription &&other)

通过从other 中提取信息来创建一个信号描述。

注意: 被移动的 QCanSignalDescription对象 只能被销毁或被赋值。调用除析构函数或赋值运算符之外的其他函数,其行为未定义。

[constexpr noexcept default] 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

返回信号值的数据字节序。

默认情况下,使用BigEndian 。

注意: 如果将dataFormat()设置为AsciiString ,则会忽略数据字节序 。

另请参阅 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 。

有效的信号描述必须满足以下条件:

另请参阅 bitLength()、dataFormat() 和name()。

double QCanSignalDescription::maximum() const

返回该信号支持的最大值。

默认情况下,该函数返回qQNaN(),这意味着没有最大值。

另请参阅 setRange() 和minimum()。

double QCanSignalDescription::minimum() const

返回该信号支持的最小值。

默认情况下,该函数返回qQNaN(),这表示不存在最小值。

另请参阅 setRange() 和maximum()。

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

返回信号的名称。

另请参见 setName() 和isValid()。

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() 表示将不使用相应的限制。

另请参阅 minimum() 和maximum()。

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 中的值分配给此信号描述。

© 2026 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.