CANUnit
CAN Unit 用于通过 CAN 总线进行通信。支持以下产品:
UiFlow2 应用示例
TX 示例
在 UiFlow2 中打开 stickc_plus2_can_tx_example.m5f2 项目。
该示例演示如何使用 CAN Unit 发送数据。
点击 BtnA 以更改要发送的数据。
UiFlow2 代码块:
示例输出:
None
RX 示例
在 UiFlow2 中打开 dial_can_rx_example.m5f2 项目。
该示例演示如何使用 CAN Unit 接收数据。
UiFlow2 代码块:
示例输出:
屏幕将显示接收到的 CAN 数据。
MicroPython 应用示例
TX 示例
该示例演示如何使用 CAN Unit 发送数据。
MicroPython 代码块:
1# SPDX-FileCopyrightText: 2024 M5Stack Technology CO LTD 2# 3# SPDX-License-Identifier: MIT 4 5import os, sys, io 6import M5 7from M5 import * 8from unit import CANUnit 9from hardware import * 10 11 12label0 = None 13label1 = None 14label2 = None 15label3 = None 16label4 = None 17label5 = None 18label6 = None 19label7 = None 20label8 = None 21can_0 = None 22 23 24import random 25 26id2 = None 27payload = None 28 29 30def setup(): 31 global \ 32 label0, \ 33 label1, \ 34 label2, \ 35 label3, \ 36 label4, \ 37 label5, \ 38 label6, \ 39 label7, \ 40 label8, \ 41 can_0, \ 42 id2, \ 43 payload 44 45 M5.begin() 46 label0 = Widgets.Label("Master", 35, 4, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18) 47 label1 = Widgets.Label("ID:", 4, 39, 1.0, 0xF5A41D, 0x080808, Widgets.FONTS.DejaVu18) 48 label2 = Widgets.Label("RTR:", 4, 90, 1.0, 0xF5A41D, 0x000000, Widgets.FONTS.DejaVu18) 49 label3 = Widgets.Label("Ext:", 4, 141, 1.0, 0xF5A41D, 0x000000, Widgets.FONTS.DejaVu18) 50 label4 = Widgets.Label("Msg:", 3, 192, 1.0, 0xF5A41D, 0x000000, Widgets.FONTS.DejaVu18) 51 label5 = Widgets.Label("label5", 3, 64, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18) 52 label6 = Widgets.Label("label6", 4, 115, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18) 53 label7 = Widgets.Label("label7", 4, 166, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18) 54 label8 = Widgets.Label("label8", 4, 217, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18) 55 56 can_0 = CANUnit((33, 32), CANUnit.NORMAL, baudrate=25000) 57 id2 = 123 58 payload = "uiflow2" 59 label5.setText(str(id2)) 60 label6.setText(str(False)) 61 label7.setText(str(False)) 62 label0.setText(str(payload)) 63 64 65def loop(): 66 global \ 67 label0, \ 68 label1, \ 69 label2, \ 70 label3, \ 71 label4, \ 72 label5, \ 73 label6, \ 74 label7, \ 75 label8, \ 76 can_0, \ 77 id2, \ 78 payload 79 M5.update() 80 can_0.send(payload, id2, timeout=0, rtr=False, extframe=False) 81 if BtnA.wasClicked(): 82 id2 = random.randint(1, 100) 83 label5.setText(str(id2)) 84 payload = str((random.randint(32, 126))) 85 label8.setText(str(payload)) 86 87 88if __name__ == "__main__": 89 try: 90 setup() 91 while True: 92 loop() 93 except (Exception, KeyboardInterrupt) as e: 94 try: 95 from utility import print_error_msg 96 97 print_error_msg(e) 98 except ImportError: 99 print("please update to latest firmware")
示例输出:
None
RX 示例
该示例演示如何使用 CAN Unit 接收数据。
MicroPython 代码块:
1# SPDX-FileCopyrightText: 2024 M5Stack Technology CO LTD 2# 3# SPDX-License-Identifier: MIT 4 5import os, sys, io 6import M5 7from M5 import * 8from unit import MiniCANUnit 9 10 11label0 = None 12label1 = None 13label2 = None 14label3 = None 15label4 = None 16label5 = None 17label6 = None 18label7 = None 19label8 = None 20minican_0 = None 21 22 23frame = None 24 25 26def setup(): 27 global label0, label1, label2, label3, label4, label5, label6, label7, label8, minican_0, frame 28 29 M5.begin() 30 label0 = Widgets.Label("Slaver", 90, 13, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18) 31 label1 = Widgets.Label("ID:", 35, 60, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18) 32 label2 = Widgets.Label("Ext:", 25, 150, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18) 33 label3 = Widgets.Label("RTR:", 20, 120, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18) 34 label4 = Widgets.Label("Msg:", 18, 90, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18) 35 label5 = Widgets.Label("label5", 72, 60, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18) 36 label6 = Widgets.Label("label6", 72, 89, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18) 37 label7 = Widgets.Label("label7", 72, 120, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18) 38 label8 = Widgets.Label("label8", 72, 150, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18) 39 40 minican_0 = MiniCANUnit((1, 2), MiniCANUnit.NORMAL, baudrate=25000) 41 42 43def loop(): 44 global label0, label1, label2, label3, label4, label5, label6, label7, label8, minican_0, frame 45 M5.update() 46 if minican_0.any(0): 47 frame = minican_0.recv(0, timeout=5000) 48 label5.setText(str(frame[0])) 49 label6.setText(str(frame[4])) 50 label7.setText(str(frame[2])) 51 label8.setText(str(frame[1])) 52 53 54if __name__ == "__main__": 55 try: 56 setup() 57 while True: 58 loop() 59 except (Exception, KeyboardInterrupt) as e: 60 try: 61 from utility import print_error_msg 62 63 print_error_msg(e) 64 except ImportError: 65 print("please update to latest firmware")
示例输出:
屏幕将显示接收到的 CAN 数据。
API参考
CANUnit
- class unit.CANUnit(port, mode, baudrate=125000)
创建一个 CANUnit 对象。
- 参数:
UiFlow2 代码块:

MicroPython 代码块:
from unit import CANUnit can = CANUnit(id=0, port=(13, 14), mode=CANUnit.NORMAL, baudrate=125000)
备注
CANUnit 类继承自 CAN 类。更多详情请参阅
hardware.CAN。
- class unit.CANUnit(tx, rx, mode, prescaler=32, sjw=3, bs1=15, bs2=4, triple_sampling=False)
使用给定参数初始化 CAN 总线。
- 参数:
id (int) – CAN ID。
port (tuple) – 端口引脚(tx、rx)。
mode (int) – CAN.NORMAL、CAN.NO_ACKNOWLEDGE、CAN.LISTEN_ONLY 之一。
prescaler (int) – CAN 输入时钟被分频以生成标称位时间量子(time quanta)的分频值。对于经典 CAN,预分频器的取值范围为 1 到 1024(含)。
sjw (int) – 用于标称位(nominal bits)的重同步跳宽(resynchronisation jump width),单位为时间量子(time quanta);对于经典 CAN,其取值范围为 1 到 4(含)之间。
bs1 (int) – 定义标称位中采样点的位置,单位为时间量子;对于经典 CAN,其取值范围为 1 到 16(含)。
bs2 (int) – 以标称位的时间量子为单位定义发送点的位置;对于经典 CAN,其取值范围为 1 到 8(含)。
triple_sampling (bool) – 启用三重采样,当 TWAI 控制器对一个位进行采样时。
UiFlow2 代码块:

MicroPython 代码块:
from unit import CANUnit can = CANUnit(id=0, port=(13, 14), mode=CANUnit.NORMAL, prescaler=128, sjw=3, bs1=16, bs2=8, triple_sampling=False)
备注
CANUnit 类继承自 CAN 类。更多详情请参阅
hardware.CAN。



