【发布时间】:2020-03-18 09:48:58
【问题描述】:
众所周知,在CAN总线通信协议中,发送方知道数据是否发送成功。我发送socketcan数据如下。
ret = write (socket, frame, sizeof (struct can_frame));
但是,即使CAN通讯线断开,ret的返回值仍然是16(=sizeof(struct can_frame))。查询资料,发现问题是由于使用的网络栈的tx_queue通过 socketcan。多次调用write时,缓冲区已满,ret的返回值为-1。 但这不是我所期望的行为,我希望发送的每一帧数据都会立即获得成功或失败的状态。 由
echo 0> / sys / class / net / can0 / tx_queue_len
我想取消 tx_queue,但它不起作用。 我想问的是,有没有办法取消socketcan的tx_queue,或者通过API(如libsocketcan)获取关于控制器的每个发送帧的状态。 谢谢。
【问题讨论】:
-
“电缆已断开”是什么意思?总线上是否有接收节点?如果没有接收节点,则无法进行 CAN 通信。总线依赖于至少一个其他节点来确认每个发送的帧。
-
@Lundin "cable is disconnected" 表示总线上没有其他节点。当然,socketcan 会发送帧失败。我期望的行为是获取数据帧发送失败的状态,但我不知道如何获取状态。
标签: linux-device-driver embedded-linux can-bus zynq socketcan