QCanBusDevice Class
QCanBusDevice 类是 CAN 总线的接口类。更多内容...
| 头文件: | #include <QCanBusDevice> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS SerialBus) target_link_libraries(mytarget PRIVATE Qt6::SerialBus) |
| qmake: | QT += serialbus |
| 继承自: | QObject |
公共类型
| struct | Filter |
| enum | CanBusDeviceState { UnconnectedState, ConnectingState, ConnectedState, ClosingState } |
| enum | CanBusError { NoError, ReadError, WriteError, ConnectionError, ConfigurationError, …, TimeoutError } |
| enum class | CanBusStatus { Unknown, Good, Warning, Error, BusOff } |
| enum | ConfigurationKey { RawFilterKey, ErrorFilterKey, LoopbackKey, ReceiveOwnKey, BitRateKey, …, UserKey } |
| enum | Direction { Input, Output, AllDirections } |
| flags | Directions |
公共函数
| QCanBusDevice(QObject *parent = nullptr) | |
| virtual QCanBusDevice::CanBusStatus | busStatus() |
| void | clear(QCanBusDevice::Directions direction = Direction::AllDirections) |
| QList<QCanBusDevice::ConfigurationKey> | configurationKeys() const |
| QVariant | configurationParameter(QCanBusDevice::ConfigurationKey key) const |
| bool | connectDevice() |
(since 6.2) virtual QCanBusDeviceInfo | deviceInfo() const |
| void | disconnectDevice() |
| QCanBusDevice::CanBusError | error() const |
| QString | errorString() const |
| qint64 | framesAvailable() const |
| qint64 | framesToWrite() const |
| virtual bool | hasBusStatus() const |
| virtual QString | interpretErrorFrame(const QCanBusFrame &frame) = 0 |
| QList<QCanBusFrame> | readAllFrames() |
| QCanBusFrame | readFrame() |
| virtual void | resetController() |
| virtual void | setConfigurationParameter(QCanBusDevice::ConfigurationKey key, const QVariant &value) |
| QCanBusDevice::CanBusDeviceState | state() const |
| virtual bool | waitForFramesReceived(int msecs) |
| virtual bool | waitForFramesWritten(int msecs) |
| virtual bool | writeFrame(const QCanBusFrame &frame) = 0 |
信号
| void | errorOccurred(QCanBusDevice::CanBusError) |
| void | framesReceived() |
| void | framesWritten(qint64 framesCount) |
| void | stateChanged(QCanBusDevice::CanBusDeviceState state) |
受保护函数
| void | clearError() |
| virtual void | close() = 0 |
| QCanBusFrame | dequeueOutgoingFrame() |
| void | enqueueOutgoingFrame(const QCanBusFrame &newFrame) |
| void | enqueueReceivedFrames(const QList<QCanBusFrame> &newFrames) |
| bool | hasOutgoingFrames() const |
| virtual bool | open() = 0 |
| void | setError(const QString &errorText, QCanBusDevice::CanBusError errorId) |
| void | setState(QCanBusDevice::CanBusDeviceState newState) |
成员类型文档
enum QCanBusDevice::CanBusDeviceState
此枚举描述了所有可能的设备状态。
| 常量 | 值 | 描述 |
|---|---|---|
QCanBusDevice::UnconnectedState | 0 | 设备已断开连接。 |
QCanBusDevice::ConnectingState | 1 | 设备正在连接中。 |
QCanBusDevice::ConnectedState | 2 | 设备已连接到 CAN 总线。 |
QCanBusDevice::ClosingState | 3 | 设备正在关闭。 |
enum QCanBusDevice::CanBusError
该枚举描述了所有可能的错误情况。
| 常量 | 值 | 描述 |
|---|---|---|
QCanBusDevice::NoError | 0 | 未发生任何错误。 |
QCanBusDevice::ReadError | 1 | 读取操作期间发生错误。 |
QCanBusDevice::WriteError | 2 | 写入操作期间发生错误。 |
QCanBusDevice::ConnectionError | 3 | 尝试打开插件时发生错误。 |
QCanBusDevice::ConfigurationError | 4 | 尝试设置配置参数时发生错误。 |
QCanBusDevice::UnknownError | 5 | 发生了一个未知错误。 |
QCanBusDevice::OperationError | 6 | 在设备处于不允许执行该操作的状态下尝试执行了该操作。此枚举类型在 Qt 5.14 中引入。 |
QCanBusDevice::TimeoutError | 7 | 在等待写入或接收帧时发生超时。该枚举在 Qt 5.14 中引入。 |
enum class QCanBusDevice::CanBusStatus
该枚举描述了CAN总线可能的状态值。
| 常量 | 值 | 描述 |
|---|---|---|
QCanBusDevice::CanBusStatus::Unknown | 0 | CAN 总线状态未知(例如,不被 CAN 插件支持)。 |
QCanBusDevice::CanBusStatus::Good | 1 | CAN 控制器完全正常运行 |
QCanBusDevice::CanBusStatus::Warning | 2 | CAN 控制器处于警告状态 |
QCanBusDevice::CanBusStatus::Error | 3 | CAN 控制器处于错误状态(不再发送 CAN 帧) |
QCanBusDevice::CanBusStatus::BusOff | 4 | CAN 控制器处于总线断开状态(已与 CAN 总线断开连接) |
enum QCanBusDevice::ConfigurationKey
此枚举描述了 CAN 总线连接的可能配置选项。
| 常量 | 值 | 描述 |
|---|---|---|
QCanBusDevice::RawFilterKey | 0 | 此配置用于确定当前设备接受的 CAN 总线帧类型。预期值为QList<QCanBusDevice::Filter> 。传递一个空列表将清除所有先前设置的过滤器(包括默认过滤器)。更多详细信息请参见QCanBusDevice::Filter 。 |
QCanBusDevice::ErrorFilterKey | 1 | 此键定义应通过当前连接转发的错误类型。相关值应为QCanBusFrame::FrameErrors 类型。 |
QCanBusDevice::LoopbackKey | 2 | 此键定义 CAN 总线设备是否应以环回模式运行。环回模式意味着,每当在 CAN 总线上传输一个 CAN 帧时,该帧的本地回显将被发送至所有连接到此 CAN 设备的应用程序。此键的预期值为bool 。 |
QCanBusDevice::ReceiveOwnKey | 3 | 该键定义了该 CAN 设备是否接收其自身发送的帧。这可用于检查传输是否成功。该键的预期值为bool 。 |
QCanBusDevice::BitRateKey | 4 | 该键定义了以比特每秒为单位的 CAN 波特率。在启用 CAN FD 且设置了QCanBusFrame::hasBitrateSwitch() 的情况下,有效载荷可采用更高的数据波特率进行传输。此时,QCanBusDevice::BitRateKey 仅用于 CAN ID 仲裁阶段。另请参阅QCanBusDevice::DataBitRateKey |
QCanBusDevice::CanFdKey | 5 | 该键用于定义是否应启用 CAN FD 帧的发送和接收。该键的预期值为bool 。 |
QCanBusDevice::DataBitRateKey | 6 | 该键定义了 CAN FD 有效载荷的比特率(单位:比特/秒)。CAN FD 允许在以标称比特率完成的仲裁阶段之后,以更高的数据比特率传输带有QCanBusFrame::hasBitrateSwitch() 标志的帧的有效载荷。该枚举值自 Qt 5.9 起引入。另请参阅QCanBusDevice::BitRateKey |
QCanBusDevice::ProtocolKey | 7 | 该键用于指定其他协议。目前,此参数仅可在 SocketCAN 插件中设置和使用。该枚举值自 Qt 5.14 起引入。 |
QCanBusDevice::UserKey | 30 | 此键定义了自定义键的起始范围。其最常见的用途是支持平台特定的配置选项。 |
另请参阅 configurationParameter()。
enum QCanBusDevice::Direction
flags QCanBusDevice::Directions
此枚举描述了可能的数据传输方向。
| 常量 | 值 | 描述 |
|---|---|---|
QCanBusDevice::Input | 1 | 输入方向。 |
QCanBusDevice::Output | 2 | 输出方向。 |
QCanBusDevice::AllDirections | Input | Output | 双向,即输入和输出。 |
Directions 类型是QFlags<Direction> 的 typedef 定义。它存储 Direction 值的按“或”运算组合。
成员函数文档
[explicit] QCanBusDevice::QCanBusDevice(QObject *parent = nullptr)
使用指定的parent 构建一个串行总线设备。
[virtual] QCanBusDevice::CanBusStatus QCanBusDevice::busStatus()
返回当前的 CAN 总线状态。如果无法查询状态,则返回 QCanBusDevice::UnknownStatus。
注意: 并非所有 CAN 插件都实现了此 函数。更多信息请参阅插件的帮助页面。可在运行时使用函数hasBusStatus() 来检查所使用的 CAN 插件是否支持查询 CAN 总线状态。
另请参阅 hasBusStatus() 和resetController()。
void QCanBusDevice::clear(QCanBusDevice::Directions direction = Direction::AllDirections)
根据direction ,清空设备的输入或输出缓冲区。
该函数仅对QCanBusDevice 缓冲区进行操作。已写入CAN驱动程序或CAN硬件层,或尚未从这些层读取的帧,不会被该函数清除。
注意: 仅对具有缓冲功能的设备才能清空 输出缓冲区。
另请参阅 framesAvailable()、readFrame()、framesToWrite() 和writeFrame()。
[protected] void QCanBusDevice::clearError()
清除上次设备错误的错误 ID 及其通俗易懂的描述。
CAN总线实现必须使用此函数来更新设备的错误状态。
另请参阅 error()、errorOccurred() 和setError()。
[pure virtual protected] void QCanBusDevice::close()
该函数负责关闭CAN总线连接。实现时必须确保该实例的state()被设置为QCanBusDevice::UnconnectedState 。
该函数最重要的任务是关闭与 CAN 设备的套接字连接,并调用QCanBusDevice::setState()。
另请参阅 disconnectDevice()。
QList<QCanBusDevice::ConfigurationKey> QCanBusDevice::configurationKeys() const
返回 CAN 总线连接所使用的键列表。
这些键的含义与ConfigurationKey 中的定义一致。如果未明确指定某个键,则使用平台对该键的默认设置。
QVariant QCanBusDevice::configurationParameter(QCanBusDevice::ConfigurationKey key) const
返回当前分配给 `ConfigurationKey ` 的值 `key`;否则返回无效的 `QVariant`。
另请参阅 setConfigurationParameter() 和configurationKeys()。
bool QCanBusDevice::connectDevice()
将设备连接到 CAN 总线。成功时返回 `true `;否则返回 `false`。
该函数在其实现过程中会调用open()。
另请参阅 disconnectDevice()。
[protected] QCanBusFrame QCanBusDevice::dequeueOutgoingFrame()
返回出站帧内部列表中的下一个QCanBusFrame ;否则返回一个无效的QCanBusFrame 。返回的帧将从内部列表中移除。
[virtual, since 6.2] QCanBusDeviceInfo QCanBusDevice::deviceInfo() const
返回当前QCanBusDevice 对应的QCanBusDeviceInfo 。如果该函数未由QCanBusDevice 的子类实现,则返回一个通过默认构造函数创建的对象。
该函数在 Qt 6.2 中引入。
void QCanBusDevice::disconnectDevice()
将设备从 CAN 总线上断开。
该函数的实现过程中会调用close()。
注意: 仅当connectDevice()返回true 时,才应调用此 函数。
另请参阅 connectDevice()。
[protected] void QCanBusDevice::enqueueOutgoingFrame(const QCanBusFrame &newFrame)
将 `newFrame ` 追加到待发送帧的内部列表中,该列表可通过 `writeFrame()` 访问。
子类在写入新帧时必须调用此函数。
[protected] void QCanBusDevice::enqueueReceivedFrames(const QList<QCanBusFrame> &newFrames)
将newFrames 添加到内部帧列表中(可通过readFrame()访问),并触发framesReceived()信号。
子类在接收帧时必须调用此函数。
QCanBusDevice::CanBusError QCanBusDevice::error() const
返回最近发生的错误。错误值始终设置为最近发生的错误,且不会被重置。
另请参阅 setError() 和errorString()。
[signal] void QCanBusDevice::errorOccurred(QCanBusDevice::CanBusError)
当发生错误时,会发出该信号。
QString QCanBusDevice::errorString() const
返回最近发生的设备错误的人类可读描述。
另请参阅 error()。
qint64 QCanBusDevice::framesAvailable() const
返回可用帧的数量。如果没有可用帧,该函数返回 0。
另请参阅 clear()、readFrame(),以及readAllFrames()。
[signal] void QCanBusDevice::framesReceived()
当接收到一个或多个帧时,会发出此信号。应使用readFrame() 和framesAvailable() 读取这些帧。
qint64 QCanBusDevice::framesToWrite() const
对于带缓冲的设备,该函数返回待写入的帧数。对于不带缓冲的设备,该函数始终返回零。
注意: CAN 驱动程序和 CAN 硬件层中可能还存在 额外的缓冲机制。因此,如果该函数返回零,并不意味着所有 CAN 帧都已写入 CAN 总线。
另请参见 clear() 和writeFrame()。
[signal] void QCanBusDevice::framesWritten(qint64 framesCount)
每当将一组帧写入 CAN 总线时,都会发出此信号。framesCount 参数的值设置为该组帧中写入的帧数。
[virtual] bool QCanBusDevice::hasBusStatus() const
如果 CAN 插件支持查询 CAN 总线状态,则返回 true。
另请参阅 busStatus()。
[protected] bool QCanBusDevice::hasOutgoingFrames() const
如果待发送帧的内部列表不为空,则返回true ;否则返回false 。
[pure virtual] QString QCanBusDevice::interpretErrorFrame(const QCanBusFrame &frame)
将frame 解释为错误帧,并返回该错误的人可读描述。
如果frame 不是错误帧,则返回的字符串为空。
[pure virtual protected] bool QCanBusDevice::open()
该函数由connectDevice()调用。子类必须提供一个实现:如果成功建立CAN总线连接,则返回true ;否则返回false 。QCanBusDevice 的实现确保在进入该函数时,设备的state()已设置为QCanBusDevice::ConnectingState 。
该实现必须确保在成功时,实例的state() 被设置为QCanBusDevice::ConnectedState ;否则应返回QCanBusDevice::UnconnectedState 。必须使用setState() 来设置新的设备状态。
自定义实现负责打开套接字、实例化可能需要的QSocketNotifier ,以及应用自定义和默认的QCanBusDevice::configurationParameter()。
另请参阅 connectDevice()。
QList<QCanBusFrame> QCanBusDevice::readAllFrames()
返回队列中的所有QCanBusFrame;否则返回一个空的QList 。返回的帧将从队列中移除。
该队列按照FIFO原则运行。
另请参阅 clear()、framesAvailable() 和readFrame()。
QCanBusFrame QCanBusDevice::readFrame()
返回队列中的下一个QCanBusFrame ;否则返回一个空的QCanBusFrame 。返回的帧将从队列中移除。
该队列遵循FIFO(先进先出)原则。
另请参阅 clear()、framesAvailable() 和readAllFrames()。
[virtual] void QCanBusDevice::resetController()
执行 CAN 控制器复位,以将 CAN 控制器从总线断开状态中释放(如果可能的话)。
注意:CAN 控制器重置会干扰正在进行的通信,且完成该操作可能需要长达一秒钟。仅在需要从总线错误中恢复时才调用此函数。
注意: 并非所有 CAN 插件都实现了此 功能。更多信息请参阅插件的帮助页面。
另请参阅 busStatus()。
[virtual] void QCanBusDevice::setConfigurationParameter(QCanBusDevice::ConfigurationKey key, const QVariant &value)
将CAN总线连接的配置参数key 设置为value 。可能的键值由ConfigurationKey 表示。
可以通过设置无效的QVariant 来取消该参数的配置。取消配置意味着该参数将恢复为默认设置。
注意:在 大多数情况下,配置更改只有在重新连接后才会生效。
另请参阅 configurationParameter()。
[protected] void QCanBusDevice::setError(const QString &errorText, QCanBusDevice::CanBusError errorId)
将上次设备错误的人机可读描述设置为errorText 。errorId 用于分类错误类型。
CAN总线实现必须使用此函数来更新设备的错误状态。
另请参见 error()、errorOccurred() 和clearError()。
[protected] void QCanBusDevice::setState(QCanBusDevice::CanBusDeviceState newState)
将设备状态设置为newState 。CAN总线实现必须使用此函数来更新设备状态。
另请参阅 state()。
QCanBusDevice::CanBusDeviceState QCanBusDevice::state() const
返回设备的当前状态。
另请参阅 setState() 和stateChanged()。
[signal] void QCanBusDevice::stateChanged(QCanBusDevice::CanBusDeviceState state)
每当设备状态发生变化时,都会发出此信号。新状态由state 表示。
[virtual] bool QCanBusDevice::waitForFramesReceived(int msecs)
该函数将阻塞,直到有新的帧可供读取且已发出framesReceived()信号,或者直到经过msecs 毫秒。如果msecs 的值为-1 ,则该函数不会超时。
如果可读取新帧且已发出framesReceived() 信号,则返回true ;否则返回false (如果操作超时或发生错误)。
注意:此 函数将启动一个本地事件循环。这可能会导致在该函数作用域执行阻塞期间,其他应用程序的槽被调用的情况。为避免问题,不应将该类的信号连接到槽。同样,绝不能在响应framesReceived() 或errorOccurred() 信号时调用此函数。
另请参阅 waitForFramesWritten()。
[virtual] bool QCanBusDevice::waitForFramesWritten(int msecs)
对于带缓冲的设备,该函数会等待直至所有缓冲帧均已写入设备且已发出framesWritten()信号,或者等待msecs 毫秒后返回。若msecs 为-1,则该函数不会超时。对于不带缓冲的设备,该函数会立即返回false ,因为writeFrame()不需要写入缓冲区。
如果触发了framesWritten()信号,则返回true ;否则返回false (即操作超时或发生错误时)。
注意:此 函数将启动一个本地事件循环。这可能会导致在该函数作用域执行处于阻塞状态时,其他应用程序插槽被调用的情况。为避免问题,不应将该类的信号连接到插槽。同样,绝不能在响应framesWritten() 或errorOccurred() 信号时调用此函数。
另请参阅 waitForFramesReceived()。
[pure virtual] bool QCanBusDevice::writeFrame(const QCanBusFrame &frame)
将frame 写入CAN总线,成功时返回true ;否则返回false 。
在某些平台上,帧可能会被放入队列中,而返回值可能仅表示已成功将帧插入队列。实际的帧将在稍后发送。因此,framesWritten() 信号是帧已移交至传输层的最终确认。如果发生错误,将发出errorOccurred() 信号。
根据 CAN 总线规范,类型为remote transfer request (RTR) 的帧不包含有效载荷,但具有 0 到 8(含)的长度。该长度表示预期来自远端节点的响应有效载荷长度。 因此,使用此函数发送 RTR 帧时,可能仍需在frame 上设置一个任意有效载荷。该任意有效载荷的长度即为 RTR 帧的预期大小。
另请参阅 QCanBusFrame::setPayload()。
© 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.