常见问题
接收线程打印导致丢帧问题
如果接收线程中存在打印,那么当总线波特率较高,发送数据较多时,易出现丢帧问题。
问题原因:打印速率较慢,接收的一帧CAN数据还没打印完,后续的CAN数据又接收了,容易发生overflow,导致丢帧。
解决办法:在接收线程中不要加打印。SDK中示例demo的接收线程有打印只是为了展示是否有接收到数据。
RTT硬件过滤器hdr设置
在RT-Thread的CAN框架中,hdr用来表示硬件过滤器的编号。该CAN模块硬件上不支持过滤器编号,所以在接收时, rxmsg.hdr 只能设置为-1。如下图
c
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));
...
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14