4. CAN 总线应用层收发测试
实验目的
学习 Linux 环境下 SocketCAN 的应用层编程,掌握通过 C 语言完成 CAN 报文的构造、发送以及接收校验,验证开发板 CAN 控制器的底层驱动及 API 调用逻辑。
硬件与底层说明
本开发板 CAN 接口(CN1)内部已集成 120Ω 终端电阻。
单板自环测试:请使用杜邦线将接线端子的 CAN_H 与 CAN_L 物理短接,并确保接触良好。若未形成有效闭环(如缺乏对端 ACK 应答),底层 CAN 控制器会触发保护机制(BUS-OFF),导致无法接收数据。
源码解析
配套的 can_perf.c 采用标准 Linux SocketCAN 接口(socket(PF_CAN, SOCK_RAW, CAN_RAW))实现。
- 发送端(
-w):通过write()向内核注入封装好的can_frame结构体。代码内部包含了对ENOBUFS(内核缓冲区满)的错误重试处理机制。 - 接收端(
-r):使用select()阻塞等待数据,通过read()读取报文,并利用累加器j对接收到的数据进行严格的递增校验,最终计算并打印误码率。
源码获取
请在网盘 软件资料/demo/base-demos/can_perf/src 目录下获取.
交叉编译与传输
make clean
make CC=arm-linux-gnueabihf-gcc
scp can_perf root@192.168.5.10:/root/运行程序
1. 配置并启用 CAN 接口
在开发板终端执行以下命令,设置波特率为 250Kbps 并拉起接口:
ip link set can0 down
ip link set can0 type can bitrate 250000
ip link set can0 up2. 运行发送端测试
在开发板终端执行发送命令(以 2ms 的间隔发送 1000 帧):
./can_perf -d can0 -w -f 1000 -i 20003. 运行接收端校验
在另一终端或另一台设备上执行接收模式(需确保物理总线已闭环):
./can_perf -d can0 -r -f 1000正常现象
发送端现象:
终端顺利打印发送进度,结束时输出 Send completed. 以及 Retry times: 0。这证明应用层 API 调用与底层发送链路完全畅通,无阻塞。
接收端现象:
在物理闭环完美的情况下,收满 1000 帧后终端将打印误码率统计,显示 Error data rate: 0.00%。
注:若在执行接收测试时,终端出现 read time out 或收到数据为 0,请在底层检查 CAN 物理状态:
ip -details -statistics link show can0若显示 can state BUS-OFF 或 TX carrier 报错计数升高,说明物理总线未形成有效闭环(杜邦线未接好、未共地或缺乏 ACK 应答)。请重新检查接线端子,或改用两块开发板进行真实总线对测。重置接口可用 ip link set can0 down 后再执行 up。
最后编辑:林晓燕 更新时间:2026-11-05 14:56