单片机/MCUwilliam hill官网
直播中

gvxiaot

13年用户 1149经验值
私信 关注

CAN FD在发送报文时会有发不出去的现象怎么解决?

现象描述:
在发送多帧报文数据时,出现了较为严重的报文丢失现象。编写测试程序,在for循环中循环发送id为0-7ff的报文,对返回值进行了判断。期待收到的报文id为连续的,且步长为1。但实际id并不连续,增加的步长并不是1(如附件 现象.jpg)
自我分析:
发送函数如附件 代码.jpg,发送方式为对32个msgbuf状态进行查询,状态ok再调用UpdataAndTransmitMsgBuffer()函数,由该函数的返回状态判断此次报文发送是否成功。但是由前面的现象(发出去的报文id不连续),明显看出UpdataAndTransmitMsgBuffer()返回了SUCCESS,但实际并未发送成功。
问题:
为什么UpdataAndTransmitMsgBuffer()函数返回了SUCCESS,填充已经成功,但是实际有大概率的未发送成功的情况(Can总线状态正常,两个节点)。
                                                                                                                                                                                             

回帖(2)

王思敏

2024-2-2 10:15:21
可以尝试在发送代码里加一些延时,看看是不是接收的频率跟不上发送所导致的。
举报

小麦地

2024-2-2 11:47:39
根据现象描述和自我分析,可能的原因和解决方法如下:

1. 帧发送速率过快:CAN FD的数据传输速率较高,如果发送速率过快可能会导致报文丢失。可以尝试通过增加发送延时或控制发送速率来解决。

2. 硬件限制:硬件设备可能存在发送缓冲区大小限制,当发送缓冲区已满时,可能会导致报文丢失。可以尝试增加硬件设备的发送缓冲区大小或使用更高性能的硬件设备。

3. 软件优化:检查发送程序的实现逻辑,确保在报文发送之前正确处理和更新发送缓冲区以及传输相关的状态。同时,确保错误处理机制能够正确处理发送失败的情况。

4. 总线负载过重:如果总线上存在大量的报文传输,可能会导致发送冲突和丢失。可以尝试优化总线负载或调整报文发送顺序以减少冲突。

5. 确保报文发送函数正确返回成功状态:确认报文发送函数UpdataAndTransmitMsgBuffer()的返回状态的定义和实现是否正确。可以根据返回状态进一步判断发送是否成功。

6. 可能存在其他硬件或软件相关问题:例如电缆连接质量、驱动程序或操作系统相关问题等。可以检查和排除这些问题。

建议逐步排查和调试,可以先确认发送速率和总线负载是否合适,检查报文发送函数的实现和返回值的准确性,以及硬件相关问题。如果问题依然存在,可以考虑使用相关调试工具或咨询供应商进行进一步的支持。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分