本页内容

QCanBusFrame Class

QCanBusFrame 是一个表示单个 CAN 帧的容器类。更多内容...

头文件: #include <QCanBusFrame>
CMake: find_package(Qt6 REQUIRED COMPONENTS SerialBus)
target_link_libraries(mytarget PRIVATE Qt6::SerialBus)
qmake: QT += serialbus

公共类型

class TimeStamp
enum FrameError { NoError, TransmissionTimeoutError, LostArbitrationError, ControllerError, ProtocolViolationError, …, AnyError }
flags FrameErrors
FrameId
enum FrameType { UnknownFrame, DataFrame, ErrorFrame, RemoteRequestFrame, InvalidFrame }

公共函数

QCanBusFrame(QCanBusFrame::FrameType type = DataFrame)
QCanBusFrame(QCanBusFrame::FrameId identifier, const QByteArray &data)
QCanBusFrame::FrameErrors error() const
QCanBusFrame::FrameId frameId() const
QCanBusFrame::FrameType frameType() const
bool hasBitrateSwitch() const
bool hasErrorStateIndicator() const
bool hasExtendedFrameFormat() const
bool hasFlexibleDataRateFormat() const
bool hasLocalEcho() const
bool isValid() const
QByteArray payload() const
void setBitrateSwitch(bool bitrateSwitch)
void setError(QCanBusFrame::FrameErrors error)
void setErrorStateIndicator(bool errorStateIndicator)
void setExtendedFrameFormat(bool isExtended)
void setFlexibleDataRateFormat(bool isFlexibleData)
void setFrameId(QCanBusFrame::FrameId newFrameId)
void setFrameType(QCanBusFrame::FrameType newType)
void setLocalEcho(bool echo)
void setPayload(const QByteArray &data)
void setTimeStamp(QCanBusFrame::TimeStamp ts)
QCanBusFrame::TimeStamp timeStamp() const
QString toString() const
QDataStream &operator<<(QDataStream &out, const QCanBusFrame &frame)
QDataStream &operator>>(QDataStream &in, QCanBusFrame &frame)

详细说明

QCanBusDevice 可使用 QCanBusFrame 进行读写操作。它包含帧标识符和数据有效载荷。QCanBusFrame 包含其被读取时的时刻时间戳。

另请参阅 QCanBusFrame::FrameId 、QCanBusFrame::TimeStamp 以及payload()。

成员类型文档

enum QCanBusFrame::FrameError
flags QCanBusFrame::FrameErrors

此枚举描述了可能的错误类型。

常量值描述
QCanBusFrame::NoError0未发生错误。
QCanBusFrame::TransmissionTimeoutError(1 << 0)传输超时。
QCanBusFrame::LostArbitrationError(1 << 1)由于总线仲裁失败,无法发送该帧。
QCanBusFrame::ControllerError(1 << 2)控制器遇到错误。
QCanBusFrame::ProtocolViolationError(1 << 3)发生了协议违规。
QCanBusFrame::TransceiverError(1 << 4)发生收发器错误
QCanBusFrame::MissingAcknowledgmentError(1 << 5)传输未收到确认。
QCanBusFrame::BusOffError(1 << 6)CAN 总线处于离线状态。
QCanBusFrame::BusError(1 << 7)发生 CAN 总线错误。
QCanBusFrame::ControllerRestartError(1 << 8)控制器已重启。
QCanBusFrame::UnknownError(1 << 9)发生了一个未知错误。
QCanBusFrame::AnyError0x1FFFFFFFU匹配所有其他错误类型。

FrameErrors 类型是QFlags<FrameError> 的 typedef。它存储 FrameError 值的或(OR)组合。

另请参阅 error() 和setError()。

[alias] QCanBusFrame::FrameId

一种专门用于表示11位或29位CAN总线帧标识符的类型。

另请参阅 frameId() 和setFrameId()。

enum QCanBusFrame::FrameType

该枚举描述了 CAN 帧的类型。

常量值描述
QCanBusFrame::UnknownFrame0x0帧类型未知。
QCanBusFrame::DataFrame0x1该值表示数据帧。
QCanBusFrame::ErrorFrame0x2该值表示一个错误数据框。
QCanBusFrame::RemoteRequestFrame0x3此值表示一个远程请求。
QCanBusFrame::InvalidFrame0x4该值表示一个无效帧。此类型用于错误报告。

另请参阅 frameType() 和setFrameType()。

成员函数文档

[explicit noexcept] QCanBusFrame::QCanBusFrame(QCanBusFrame::FrameType type = DataFrame)

根据指定的type 构建一个CAN帧。

另请参阅 QCanBusFrame::FrameType 以及setFrameType()。

[explicit] QCanBusFrame::QCanBusFrame(QCanBusFrame::FrameId identifier, const QByteArray &data)

使用identifier 作为帧标识符,data 作为有效载荷,构建一个CAN帧。

另请参阅 QCanBusFrame::FrameId 。

[constexpr noexcept] QCanBusFrame::FrameErrors QCanBusFrame::error() const

返回当前错误帧的错误。如果该帧不是ErrorFrame ,则此函数返回NoError 。

另请参阅 QCanBusFrame::FrameError 和setError()。

[constexpr noexcept] QCanBusFrame::FrameId QCanBusFrame::frameId() const

返回 CAN 帧标识符。如果 CAN 帧采用扩展帧格式,则该标识符的最大位数为 29 位;否则为 11 位。

如果帧属于ErrorFrame 类型,则该标识符始终为0。

另请参阅 QCanBusFrame::FrameId 、setFrameId() 和hasExtendedFrameFormat()。

[constexpr noexcept] QCanBusFrame::FrameType QCanBusFrame::frameType() const

返回帧的类型。

另请参阅 ` QCanBusFrame::FrameType ` 和 `setFrameType()`。

[constexpr noexcept] bool QCanBusFrame::hasBitrateSwitch() const

如果 CAN 采用“带比特率切换的 灵活数据速率”来以更高的数据比特率传输有效载荷数据,则返回true 。

另请参见 setBitrateSwitch() 和QCanBusDevice::DataBitRateKey 。

[constexpr noexcept] bool QCanBusFrame::hasErrorStateIndicator() const

如果 CAN 采用“灵活数据速率”且“错误状态指示器”已设置,则返回true 。

该标志由发送方的 CAN FD 硬件设置,用于指示发送方的错误状态。

另请参阅 setErrorStateIndicator()。

[constexpr noexcept] bool QCanBusFrame::hasExtendedFrameFormat() const

如果 CAN 帧使用 29 位标识符,则返回true ;否则返回false ,表示使用 11 位标识符。

另请参阅 setExtendedFrameFormat() 和frameId()。

[constexpr noexcept] bool QCanBusFrame::hasFlexibleDataRateFormat() const

如果 CAN 帧使用灵活数据速率(Flexible Data-Rate),且允许最多 64 个数据字节,则返回true ;否则返回false ,表示有效载荷最多为 8 字节。

另请参见 setFlexibleDataRateFormat() 和payload()。

[constexpr noexcept] bool QCanBusFrame::hasLocalEcho() const

如果帧是本地回显帧(即当内容相同的帧成功发送至 CAN 总线后,作为回显接收到的帧),则返回true 。该标志不仅适用于应用程序自身发送的帧,也适用于在同一系统上运行的其他应用程序发送的帧。

QCanBusDevice::ReceiveOwnKey 必须设置为 true 才能接收回显帧。

另请参阅 setLocalEcho()、QCanBusDevice::ReceiveOwnKey 以及QCanBusDevice::LoopbackKey 。

[noexcept] bool QCanBusFrame::isValid() const

如果frameType()的值为InvalidFrame ,且hasExtendedFrameFormat()未设置(尽管frameId()的长度超过11位),或者在灵活数据速率模式启用时有效载荷长度超过64字节(若该模式禁用则超过8字节)的上限,则返回false 。 如果frameType()的值为RemoteRequestFrame ,且同时启用了灵活数据速率模式,则还会返回false 。

否则,该函数返回true 。

QByteArray QCanBusFrame::payload() const

返回帧的数据负载。

另请参阅 setPayload()。

[constexpr noexcept] void QCanBusFrame::setBitrateSwitch(bool bitrateSwitch)

将“灵活数据速率”标志(Bitrate Switchflag)设置为bitrateSwitch 。带有此标志的帧的数据字段将以更高的数据比特率传输。

另请参阅 hasBitrateSwitch() 和QCanBusDevice::DataBitRateKey 。

[constexpr] void QCanBusFrame::setError(QCanBusFrame::FrameErrors error)

设置帧的error 类型。如果frameType()不是ErrorFrame ,则该函数不执行任何操作。

另请参阅 QCanBusFrame::FrameError 和error()。

[constexpr noexcept] void QCanBusFrame::setErrorStateIndicator(bool errorStateIndicator)

将“灵活数据速率”标志的“错误状态指示器”标志设置为errorStateIndicator 。

在发送 CAN FD 帧时,该标志会由 CAN FD 硬件自动设置。QCanBusFrame::setErrorStateIndicator() 仅应用于应用程序测试,例如在虚拟 CAN FD 总线上。

另请参阅 hasErrorStateIndicator()。

[constexpr noexcept] void QCanBusFrame::setExtendedFrameFormat(bool isExtended)

将扩展帧格式标志设置为isExtended 。

另请参阅 hasExtendedFrameFormat()。

[constexpr noexcept] void QCanBusFrame::setFlexibleDataRateFormat(bool isFlexibleData)

将“灵活数据速率”标志设置为isFlexibleData 。在支持该功能的控制器上,这些帧可以以更高的速度发送。此外,有效载荷长度限制提高到64字节。

另请参阅 hasFlexibleDataRateFormat()。

[constexpr] void QCanBusFrame::setFrameId(QCanBusFrame::FrameId newFrameId)

将CAN帧的标识符设置为newFrameId 。

CAN帧标识符的最大长度为11位,通过支持CAN扩展帧格式,可将其扩展至最多29位。当给定的newFrameId 长度超过11位时,CAN扩展帧格式设置将自动生效。

当格式被扩展且传入的newFrameId 长度不超过11位时,CAN扩展帧格式设置不会改变。

另请参阅 QCanBusFrame::FrameId 、frameId() 以及hasExtendedFrameFormat()。

[constexpr noexcept] void QCanBusFrame::setFrameType(QCanBusFrame::FrameType newType)

将帧类型设置为newType 。

另请参阅 QCanBusFrame::FrameType 和frameType()。

[constexpr noexcept] void QCanBusFrame::setLocalEcho(bool echo)

将“本地回显”标志设置为echo 。

当在启用QCanBusDevice::ReceiveOwnKey 的情况下发送CAN总线帧时,所有成功发送的帧都会被回显到接收队列中,并标记为本地回显帧。因此,QCanBusFrame::setLocalEcho 仅应用于应用程序测试,例如在虚拟CAN总线上进行测试。

另请参阅 hasLocalEcho()。

void QCanBusFrame::setPayload(const QByteArray &data)

将data 设置为CAN帧的有效载荷。有效载荷的最大大小为8字节,通过支持“灵活数据速率”功能,可将其扩展至最多64字节。如果data 包含超过8字节的数据,则会自动设置“灵活数据速率”标志。 必须通过设置QCanBusDevice::CanFdKey ,在QCanBusDevice 上启用灵活数据速率。

RemoteRequestFrame (RTR)类型的帧没有有效载荷。但是,它们必须提供响应预期有效载荷长度的指示。要设置预期长度,必须设置一个长度与响应预期有效载荷长度相匹配的伪有效载荷。实现此目的的一种方法如下:

QCanBusFrame frame(QCanBusFrame::RemoteRequestFrame);
int expectedResponseLength = ...;
frame.setPayload(QByteArray(expectedResponseLength, 0));

另请参阅 payload() 和hasFlexibleDataRateFormat()。

[constexpr noexcept] void QCanBusFrame::setTimeStamp(QCanBusFrame::TimeStamp ts)

将ts 设置为 CAN 帧的时间戳。通常情况下,无需调用此函数,因为时间戳是在读取操作期间生成的,而在写入操作期间则不需要。

另请参阅 timeStamp() 和QCanBusFrame::TimeStamp 。

[constexpr noexcept] QCanBusFrame::TimeStamp QCanBusFrame::timeStamp() const

返回该帧的时间戳。

另请参阅 QCanBusFrame::TimeStamp 和QCanBusFrame::setTimeStamp()。

QString QCanBusFrame::toString() const

将 CAN 帧作为格式化字符串返回。

输出包含以十六进制格式表示的 CAN 标识符(向右对齐至 32 位),后跟方括号内的数据长度以及以十六进制格式表示的有效载荷。

标准标识符用空格填充,而扩展标识符用零填充。

典型输出如下:

(Error)                                  - error frame
     7FF   [1]  01                       - data frame with standard identifier
1FFFFFFF   [8]  01 23 45 67 89 AB CD EF  - data frame with extended identifier
     400  [10]  01 23 45 67 ... EF 01 23 - CAN FD frame
     123   [5]  Remote Request           - remote frame with standard identifier
00000234   [0]  Remote Request           - remote frame with extended identifier

相关非会员

QDataStream &operator<<(QDataStream &out, const QCanBusFrame &frame)

将一个frame 写入流(out ),并返回对此对象的引用。

QDataStream &operator>>(QDataStream &in, QCanBusFrame &frame)

从流(in )中读取一个frame ,并返回对其的引用。

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