This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

am335x CAN缓冲区问题



最近在做can方面的应用,但是出现了缓冲区方面的问题:

1. 出现缓冲区不足错误后,can会出现无法接收数据的现象,且无法恢复
2. 数据发送后,若总线上无其他设备,发送的数据帧会缓存与系统中,待下次有设备加入总线后会发送上总线,缓存没有实际用处,反而会影响通讯流程
3. 没有有效接口清空缓冲区
4. 重新打开出现缓冲区错误的设备后,没有报错,也无法收发数据

所以就想知道如何清除CAN缓冲区里面的数据,希望大神们能够给与帮助。

  • 打印出要执行的函数名字

    情况一:

    Can0接收

    can1每隔0.1秒执行这个命令cansend can1 111#1111

    但是没有线连接

    情况二:

    can0 为挂在上等待接受状态

    can1每隔0.1秒执行这个命令cansend can1 111#1111

    都出现一下情况

    1

    [   92.739134] d_can_start_xmit  1

    [   92.742174] d_can_write_msg_object 1.1

    [   92.745742] d_can_object_put 1.1.1

    [   92.748800]  d_can_msg_obj_is_busy1.1.1.1

    [   92.752358] d_can_is_next_tx_obj_busy 1.2

    [   92.756184] irqreturn_t d_can_isr   //can_open

    [   92.759647] d_can_interrupts

    [   92.762675] d_can_poll

    [   92.765140]  d_can_handle_state_change

    [   92.769070] d_can_get_berr_counter

    [   92.772638]  d_can_handle_state_change

    [   92.776558] d_can_get_berr_counter

    [   92.780121] d_can_interrupts

    2

    [   92.895036] d_can_start_xmit

    [   92.898153] d_can_write_msg_object

    [   92.901707] d_can_object_put

    [   92.904715]  d_can_msg_obj_is_busy

    [   92.908282] d_can_is_next_tx_obj_busy

    .......................... 

    一直出现下面函数名字总计32次后出现报错信息write: No buffer space available

    [   92.895036] d_can_start_xmit

    [   92.898153] d_can_write_msg_object

    [   92.901707] d_can_object_put

    [   92.904715]  d_can_msg_obj_is_busy

    [   92.908282] d_can_is_next_tx_obj_busy

    write: No buffer space available
    write: No buffer space available
    write: No buffer space available
    write: No buffer space available
    write: No buffer space available

    因为不可预知另外的can有没有连线,或者有没有挂载上等待接受,如果单方不断发送数据,是不是就会把缓冲区占满,那么有什么比较好的解决办法可以克服这样的情况。

  • 经过这么多天的代码追踪,终于解决了这个问题。

    总结下:1、如果发现接收或者发送都没有反应,考虑是否进入bus进入离线状态,解决的办法可以初始化can

    2、缓冲区的问题我也没解决,但是只要不满足条件,就不让他把数据传进来就是了。

  • 您好 我最近也遇到了类似的问题

    我两块am335x的板子进can通信,刚开始我只启动发送的节点往总线上发数据,然后发着发着就会阻塞在write函数那里,当我打开接收节点接收数据时,发送节点才能恢复正常发送; 这时我把接收节点的接收关掉(并未断电只是不接收总线的数据),发送端发送已然正常;但我把接收节点给断电了,又会出现阻塞现象,重新上电后(并未打开接收程序,只是板子上电)发送端恢复正常发送。

    请问您知道这是什么原因么?