使用socketcan接收大量数据,用户层调用read函数,偶发报
CAN_ERR_CRTL_RX_OVERFLOW,
ifconfig can0 出现RX packets:1614320 errors:1 dropped:0 overruns:0 frame:1
官方linux/can/error.h 宏定义
#define CAN_ERR_CRTL_RX_OVERFLOW 0x01 /* RX buffer overflow */
#define CAN_ERR_CRTL_TX_OVERFLOW 0x02 /* TX buffer overflow */
#define CAN_ERR_CRTL_RX_WARNING 0x04 /* reached warning level for RX errors */
#define CAN_ERR_CRTL_TX_WARNING 0x08 /* reached warning level for TX errors */
#define CAN_ERR_CRTL_RX_PASSIVE 0x10 /* reached error passive status RX */
#define CAN_ERR_CRTL_TX_PASSIVE 0x20 /* reached error passive status TX */
尝试修改socket缓存区看起来无法解决此类情况
参考GPT和自己的思路:
根据您提供的信息,CAN_ERR_CRTL_RX_OVERFLOW 表示 CAN 控制器的接收缓冲区溢出,而 ifconfig can0 中的 RX packets 和 errors 字段也显示了接收到的数据包数量和错误数量。从这些信息来看,您的 CAN 控制器接收缓冲区溢出的问题可能是由于接收数据包数量过多而导致的。
您尝试修改 socket 缓存区来解决问题,但似乎没有解决该问题。除了增加缓存区以外,还有一些其他的解决方法。例如,您可以尝试修改 CAN 控制器的波特率、调整数据包的发送频率、减少占用总线时间的设备数量等等。
另外,您也可以尝试更改 CAN 控制器的接收策略,例如采用混合模式接收数据包或者修改接受过滤规则等等。这些解决方法需要结合具体的设备和场景来考虑。最好的方法就是通过实验来进行测试和优化。