canio
– CAN 总线访问¶
该 canio
模块包含支持 CAN 总线协议的低级类。
CAN 和 Listener 类更改硬件状态,如果程序在使用后继续,则在不再需要它们时应取消初始化。为此,请调用deinit()
或使用上下文管理器。有关更多信息,请参阅
Lifetime 和 ContextManagers。
例如:
import canio
from board import *
can = canio.CAN(board.CAN_RX, board.CAN_TX, baudrate=1000000)
message = canio.Message(id=0x0408, data=b"adafruit")
can.send(message)
can.deinit()
此示例将数据“adafruit”写入到 CAN 总线上的任何侦听消息 ID 0x0408 的设备。
CAN 总线涉及一个收发器,它通常是一个带有“待机”引脚的独立芯片。如果您的电路板有 CAN_STANDBY 引脚,请确保将其设置为值为 False 的输出以启用收发器。
可能存在 CAN 设备的其他实现(例如,通过 SPI 总线连接)。如果是这样,它们的构造函数参数可能会有所不同,但除此之外,我们鼓励实现者遵循核心使用的 API。
在这些板上可用
-
class
canio.
BusState
¶ CAN总线状态
-
ERROR_ACTIVE
:object¶ 总线处于正常(活动)状态
-
ERROR_WARNING
:object¶ 总线处于正常(活动)状态,但最近发生了中等数量的错误。
笔记
并非所有实现都可以使用
ERROR_WARNING
. 不要依赖看到ERROR_WARNING
之前ERROR_PASSIVE
.
-
ERROR_PASSIVE
:object¶ 由于最近发生的错误数量,总线处于被动状态。
该设备将确认它收到的数据包,但不能传输消息。如果出现其他错误,该设备可能会进入 BUS_OFF。如果它成功确认总线上的其他数据包,它可以返回到 ERROR_WARNING 或 ERROR_ACTIVE 并传输数据包。
-
BUS_OFF
:object¶ 由于最近发生的错误数量,总线已关闭。它必须重新启动才能发送或接收数据包。该设备不会在总线上发送或确认数据包。
-
-
class
canio.
CAN
(tx: microcontroller.Pin, rx: microcontroller.Pin, *, baudrate: int = 250000, loopback: bool = False, silent: bool = False, auto_restart: bool = False)¶ CAN总线协议
通用共享总线协议。rx 和 tx 引脚通常连接到一个收发器,该收发器控制共享总线上的 H 和 L 引脚。
- 参数
-
auto_restart
:bool¶ 如果为 True,将在进入总线关闭状态后重新开始通信
-
baudrate
:int¶ 波特率(只读)
-
transmit_error_count
:int¶ 传输错误的数量(只读)。检测到传输错误时增加,成功传输时减少。限制在 0 到 255 的范围内。也称为 TEC。
-
receive_error_count
:int¶ 接收错误的数量(只读)。检测到接收错误时增加,成功接收时减少。限制在 0 到 255 的范围内。也称为 REC。
-
state
:BusState¶ 总线的当前状态。(只读)
-
loopback
:bool¶ 如果设备是在环回模式下创建的,则为 True,否则为 False(只读)
-
silent
:bool¶ 如果设备是在静默模式下创建的,则为 True,否则为 False(只读)
-
listen
(self, matches: Optional[Sequence[Match]] = None, *, timeout: float = 10) → Listener¶ 开始接收与任一过滤器匹配的消息。
创建侦听器是一项代价高昂的操作,并且会干扰其他侦听器对消息的接收。
存在实现定义的最大侦听器数量和过滤器复杂性的限制。
如果硬件不能支持所有请求的匹配项,则会引发 ValueError。请注意,通常在所有 fifo 之间共享一定数量的硬件过滤器。
一条消息最多可以被一个 Listener 接收。如果有多个侦听器匹配一条消息,则不确定哪个侦听器实际接收到它。
空过滤器列表会导致接受所有消息。
超时决定了 receive() 和 next() 将阻塞多长时间。
平台特定说明:
SAM E5x 支持两个监听器。过滤器块在两个侦听器之间共享。有4个标准过滤器块和4个扩展过滤器块。每个块可以匹配 2 个单个地址或地址掩码。通过重建 CircuitPython,可以将过滤器块的数量增加到硬件最大值,但这会减少 CircuitPython 可用内存,即使不使用 canio。
STM32F405 支持两个监听器。过滤器块在两个侦听器之间共享。有 14 个过滤块。每个块可以匹配 2 个带掩码的标准地址或 1 个带掩码的扩展地址。
ESP32S2 支持 1 个 Listener。有一个过滤器块,它可以匹配带掩码的标准地址或带掩码的扩展地址。
-
send
(self, message: Union[RemoteTransmissionRequest, Message]) → None¶ 使用给定的数据和 ID 在总线上发送消息。如果由于完整的 fifo 或总线错误条件而无法发送消息,则会引发 RuntimeError。
-
__enter__
(self) → CAN¶ 返回self,允许对象在资源控制语句中使用
The with statement
-
__exit__
(self, unused1: Optional[Type[BaseException]], unused2: Optional[BaseException], unused3: Optional[types.TracebackType]) → None¶ 调用 deinit()
-
class
canio.
Listener
¶ 侦听 CAN 消息
canio.Listener
不是直接构造的,而是通过调用canio.CAN.listen
.除了使用该
receive
方法检索消息或in_waiting
检查可用消息的方法之外,侦听器还可以用作可迭代的,产生消息,直到self.timeout
几秒钟内没有消息到达。-
timeout
:float¶
-
receive
(self) → Optional[Union[RemoteTransmissionRequest, Message]]¶ 等待
self.timeout
数秒后阅读消息如果没有及时收到消息,
None
则返回。否则,返回一个Message
或RemoteTransmissionRequest
。
-
__next__
(self) → Union[RemoteTransmissionRequest, Message]¶ 在等待 self.timeout 秒后读取消息
如果没有及时收到消息,则引发 StopIteration。否则,返回 Message 或 。
此方法使
Listener
能够用作可迭代对象,例如在 for 循环中。
-
__enter__
(self) → CAN¶ 返回self,允许对象在资源控制语句中使用
The with statement
-
__exit__
(self, unused1: Optional[Type[BaseException]], unused2: Optional[BaseException], unused3: Optional[types.TracebackType]) → None¶ 调用 deinit()
-
-
class
canio.
Match
(id: int, *, mask: Optional[int] = None, extended: bool = False)¶ 描述要匹配的 CAN 总线消息
构造具有给定属性的 Match。
如果掩码不是无,则过滤器适用于匹配掩码中所有非零位的任何 id。否则,它与给定的 id 完全匹配。如果extended 为真,则只匹配扩展id,否则只匹配标准id。
-
id
:int¶ 要匹配的 id
-
mask
:int¶ 要匹配的可选 ID 掩码
-
extended
:bool¶ True 匹配扩展 id,False 匹配标准 ide
-
-
class
canio.
Message
(id: int, data: bytes, *, extended: bool = False)¶ 构造要在 CAN 总线上发送的消息。
- 参数
在 CAN 中,消息的长度可以从 0 到 8 个字节。
-
id
:int¶ 消息的数字 ID
-
data
:bytes¶ 消息内容
-
extended
:bool¶ 如果消息的 id 是扩展 id,则为真