马永锋 发表于 2024-5-23 18:17:24

为什么只能收到5帧 | CAN总线接收缓冲区 RXBUF 只有64字节,DLC=8的标准帧

我使用的屠龙刀例程中的代码,明明我发送了多帧,但是打印出来的最多只有5帧,在5帧以内正常,超过5帧就只显示5帧。

什么原因导致这种情况呢?下面是截图和代码。





乘风飞扬 发表于 2024-5-23 18:40:15

我用你的例子测试,使用工具接收一次性可以收到10帧报文:

如果你那里还是不行的话,将超时计数器改成16位/32位模式,增加超时计数试试:

乘风飞扬 发表于 2024-5-23 18:45:34

对了,忘了一件事,
你是使用CAN2接收CAN1发送的数据然后通过串口打印出来。
CAN总线接收缓冲区 RXBUF 只有64字节,
DLC=8的标准帧最多只能存放5帧,所以你收到5帧是正常的。

所以要尽快将收到的报文从缓冲区里读取出来,才能继续接收后续发来的报文。

马永锋 发表于 2024-5-23 18:56:27

乘风飞扬 发表于 2024-5-23 18:45
对了,忘了一件事,你是使用CAN2接收CAN1发送的数据然后通过串口打印出来。
CAN总线接收缓冲区 RXBUF 只有6 ...

收到

马永锋 发表于 2024-5-25 19:07:50

乘风飞扬 发表于 2024-5-23 18:45
对了,忘了一件事,
你是使用CAN2接收CAN1发送的数据然后通过串口打印出来。
CAN总线接收缓冲区 RXBUF 只有 ...





n = CanReadMsg(CAN2_Rx);   这句不应该已经把FIFO中的数据已经存入CAN_DataDef CAN1_Rx这个数组了吗?

n的大小不应该是由CAN_DataDef CAN1_Rx[]这个数组的大小决定吗?为什么还是不能超过FIFO的64字节,这还是有点懵。

乘风飞扬 发表于 2024-5-27 09:12:58

马永锋 发表于 2024-5-25 19:07
n = CanReadMsg(CAN2_Rx);   这句不应该已经把FIFO中的数据已经存入CAN_DataDef CAN1_Rx这个数组 ...CAN控制器自动将CAN总线上收到的报文存入FIFO,这是由硬件自动处理的,不需要占用CPU资源。
而CanReadMsg是通过软件将FIFO里面的数据读取到自定义的缓冲区里面,软件运行需要占用CPU资源,
如果从CAN总线一下子收到的报文数量超过FIFO上限,软件又没有及时从FIFO里面读取出来的话,
就会照成FIFO溢出,从而丢失报文。

桃花飞舞 发表于 2024-5-31 16:16:51

怎么我下载了你的程序却没有串口打印

马永锋 发表于 2024-5-31 16:42:38

桃花飞舞 发表于 2024-5-31 16:16
怎么我下载了你的程序却没有串口打印

我用的串口3.0 3.1,CAN用的0.0 0.1 0.2 0.3。
页: [1]
查看完整版本: 为什么只能收到5帧 | CAN总线接收缓冲区 RXBUF 只有64字节,DLC=8的标准帧