最近在做can方面的应用,但是出现了缓冲区方面的问题:
1. 出现缓冲区不足错误后,can会出现无法接收数据的现象,且无法恢复
2. 数据发送后,若总线上无其他设备,发送的数据帧会缓存与系统中,待下次有设备加入总线后会发送上总线,缓存没有实际用处,反而会影响通讯流程
3. 没有有效接口清空缓冲区
4. 重新打开出现缓冲区错误的设备后,没有报错,也无法收发数据
所以就想知道如何清除CAN缓冲区里面的数据,希望大神们能够给与帮助。
shengquan ye:
打印出要执行的函数名字
情况一:
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 availablewrite: No buffer space availablewrite: No buffer space availablewrite: No buffer space availablewrite: No buffer space available
因为不可预知另外的can有没有连线,或者有没有挂载上等待接受,如果单方不断发送数据,是不是就会把缓冲区占满,那么有什么比较好的解决办法可以克服这样的情况。
Dendi:
回复 shengquan ye:
您好 我最近也遇到了类似的问题
我两块am335x的板子进can通信,刚开始我只启动发送的节点往总线上发数据,然后发着发着就会阻塞在write函数那里,当我打开接收节点接收数据时,发送节点才能恢复正常发送; 这时我把接收节点的接收关掉(并未断电只是不接收总线的数据),发送端发送已然正常;但我把接收节点给断电了,又会出现阻塞现象,重新上电后(并未打开接收程序,只是板子上电)发送端恢复正常发送。
请问您知道这是什么原因么?