外观
CAN 示例
2025-10-29
概述
本文将介绍如何通过 can 总线实现发送消息,通过 USBCANFD-200U 以 ZCANPRO 上位机为例演示数据发送,并验证数据一致性,帮助读者掌握 can 外设控制方法。
硬件连接
开发板的 CAN 与 USBCANFD200U 需要连接

软件环境
ZCANPRO
ZCANPRO是广州致远电子有限公司出品的 CAN/CANFD 系列产品的配套软件,可进行原始数据收发、数据回放、高层协议分析等操作,进行 CAN 总线测试、监控、诊断、开发工具,配套的工具为 USBCANFD200U。
下载
设置 ZCANPRO 上位机
打开软件选择设备类型为USBCANFD-200U,打开设备,选择连接的通道(这里示例是通道 0),点击启动,配置关注波特率为500kbps:

创建工程点击展开
依次点击 “文件” -> “新建” -> "RT-Thread RuiChing App 项目"。

在弹出新建向导中选择 开发版 、BSP: 、示例 、 调试器/下载器。选择好之后点击 “完成”。

点击 “完成” 后,等待工程创建完成。

创建完成。

构建工程点击展开
单击工程使工程进入 Active-Debug 模式。

点击工具栏上的构建按钮进行工程编译。

构建成功后,会显示构建成功的信息。

固件下载点击展开
固化设备树

固化 APP

核心示例代码
can_send.c
// can 发送消息:该函数读取通过函数返回值判断消息是否发送成功。
static rt_err_t can_send_func(rt_device_t dev, struct rt_can_msg *msg)
{
rt_err_t status = RT_EOK;
status = rt_device_write(dev, 0, msg, 1);
if (status < 0)
{
rt_kprintf("send err(0x%d) id = 0x%X fd = %d sync = %d\n", status,
msg->id, msg->fdf, msg->sync);
CAN_HEX("err", 16, msg->data, msg->len);
}
else if (msg->sync == CAN_SYNC)
{
rt_kprintf("send ok id = 0x%X fd = %d sync = %d\n", msg->id, msg->fdf,
msg->sync);
CAN_HEX("success", 16, msg->data, msg->len);
}
return RT_EOK;
}
static void can_demo_device_init(rt_device_t dev)
{
rt_err_t ret = RT_NULL;
// can 设置发送回调函数:该函数实现了标准的 can 发送数据成功后的回调函数,用于判断消息发送结束后的状态。
// Set event callback mask
ret = rt_device_control(dev, RT_CAN_CTL_SET_EVENT_CALLBACK_MASK,
(void *)(RT_CAN_EVENT_SEND_SUCCESS | RT_CAN_EVENT_SEND_FAILURE |
RT_CAN_EVENT_SEND_TIMEOUT));
if (ret != RT_EOK)
{
rt_kprintf("set event callback mask faild\n");
}
// can 设置波特率:该函数实现了标准的 can 设置仲裁波特率。
ret = rt_device_control(dev, RT_CAN_CTL_SET_BAUD, (void *)baud_rate);
if (ret != RT_EOK)
{
rt_kprintf("set baud faild\n");
}
ret = rt_device_open(dev, RT_DEVICE_FLAG_INT_TX | RT_DEVICE_FLAG_INT_RX);
if (ret != RT_EOK)
{
rt_kprintf("can0 open faild\n");
return;
}
can_send(dev, CAN_20);
}运行程序
开发板运行程序后,然后在终端输入 can_send_test can0 命令,结果如下:
在整个命令执行期间,系统将执行以下操作:
can 发送指定数据;
对每个数据进行加 1 操作;
稍作延时再次发送;

msh />can_send_test can0
info: 500000 bitrate acceptable error 0.1%
info: 2000000 bitrate acceptable error 0.3%
send ok id = 0x7FF fd = 0 sync = 1
[success] Hex Dump (8 bytes):
00 01 02 03 04 05 06 07
send ok id = 0x7FF fd = 0 sync = 1
[success] Hex Dump (8 bytes):
00 01 02 03 04 05 06 07
send ok id = 0x7FF fd = 0 sync = 1
[success] Hex Dump (8 bytes):
01 02 03 04 05 06 07 08
send ok id = 0x7FF fd = 0 sync = 1
[success] Hex Dump (8 bytes):
02 03 04 05 06 07 08 09
send ok id = 0x7FF fd = 0 sync = 1
[success] Hex Dump (8 bytes):
03 04 05 06 07 08 09 0A
send ok id = 0x7FF fd = 0 sync = 1
[success] Hex Dump (8 bytes):
04 05 06 07 08 09 0A 0B
send ok id = 0x7FF fd = 0 sync = 1
[success] Hex Dump (8 bytes):
05 06 07 08 09 0A 0B 0C
send ok id = 0x7FF fd = 0 sync = 1
[success] Hex Dump (8 bytes):
06 07 08 09 0A 0B 0C 0D
send ok id = 0x7FF fd = 0 sync = 1
[success] Hex Dump (8 bytes):
07 08 09 0A 0B 0C 0D 0E
send ok id = 0x7FF fd = 0 sync = 1
[success] Hex Dump (8 bytes):
08 09 0A 0B 0C 0D 0E 0F