常见问题
Read time: 1 minute(s)
接收线程打印导致丢帧问题
如果接收线程中存在打印,那么当总线波特率较高,发送数据较多时,易出现丢帧问题。
问题原因:打印速率较慢,接收的一帧 CAN 数据还没打印完,后续的 CAN 数据又接收了,容易发生 overflow,导致丢帧。
解决办法:在接收线程中不要加打印。SDK 中示例 demo 的接收线程有打印只是为了展示是否有接收到数据。
RTT 硬件过滤器 hdr 设置
在 RT-Thread 的 CAN 框架中,hdr 用来表示硬件过滤器的编号。该 CAN 模块硬件上不支持过滤器编号,所以在接收时,
rxmsg.hdr
只能设置为-1。如下图
static void can_rx_thread(void *parameter) { int i; rt_size_t size; struct rt_can_msg rxmsg = {0}; while (1) { rt_sem_take(&rx_sem, RT_WAITING_FOREVER); rxmsg.hdr = -1; size = rt_device_read(can_rx_dev, 0, &rxmsg, sizeof(rxmsg)); ... }