在CAN总线发送端能否读取自身通过CAN socket发送的字节数据?
CAN Socket自发自收问题解答
核心结论
默认情况下无法从同一个CAN Socket读取到自身写入的数据,可通过配置开启该功能。
原理说明
- CAN总线硬件层面本身支持获取自身发送的有效数据:CAN协议要求发送节点在发送过程中实时采样总线电平,和自身发送的比特做校验,因此源节点可以感知到自己成功发到总线上的报文。
- Linux SocketCAN默认关闭了本地回环的上报逻辑,避免上层应用收到冗余的自发报文,因此默认配置下自发报文不会被同一个Socket读取到。
开启自发自收的方法
如果需要读取自身发送的报文,可通过setsockopt配置CAN_RAW_RECV_OWN_MSGS参数开启,示例代码如下:
int recv_own_enable = 1; setsockopt(can_socket, SOL_CAN_RAW, CAN_RAW_RECV_OWN_MSGS, &recv_own_enable, sizeof(recv_own_enable));
配置开启后,只要报文成功发送到CAN总线(无发送错误、仲裁丢失、总线离线等异常),就能从同一个Socket读取到和写入内容完全一致的CAN报文。
注意事项
- 回环上报的报文和其他节点发送的报文格式完全一致,没有特殊标识,上层应用需要自行区分来源。
- 若没有读取自发报文的需求,建议保持默认关闭状态,减少不必要的报文处理开销。
内容的提问来源于stack exchange,提问作者juggler
相关产品推荐
相关产品推荐

