我们的产品在Ubuntu14.04LTS下运行的基于Beaglebone Black的嵌入式系统上使用了一个著名的CANopen堆栈,该堆栈使用socketCAN。但由于某些原因,即使我们使用的堆栈将检测到CAN总线何时进入被动状态,甚至总线关闭状态,它也从不指示CAN总线何时从错误中恢复,何时退出被动或警告状态,以及何时进入非错误状态。
如果我直接查询socketCAN驱动程序(通过ioctl调用),我是否能够检测CAN总线何时进入和退出警告状态(小于127个错误)、进入和退出被动状态(大于127个错误)或总线关闭(大于255个错误)?
我想知道这样做是在浪费时间,还是有更好的方法来准确、实时地检测CAN总线的所有情况?
发布于 2019-11-18 22:13:09
我对这个问题只有一个部分的解决方案。由于您使用的是socketCAN,因此该接口被视为标准的网络接口,我们可以在该接口上查询状态。基于How to check Ethernet in Linux? (将eth0替换为can0),可以查看链路状态。这不是实时的,但可以在周期性线程中执行,以检查总线状态。
发布于 2020-06-17 16:59:24
所以,虽然这是一个古老的问题,但我只是碰巧发现了它(在搜索一些仅有轻微相关的东西时)。
SocketCAN提供了检测错误帧OOB的所有手段。假设您的代码如下所示:
int readFromCan(int socketFd, unsigned char* data, unsigned int* rxId) {
int32_t bytesRead = -1;
struct can_frame canFrame = {0};
bytesRead = (int32_t)read(socketFd, &canFrame, sizeof(can_frame));
if (bytesRead >= 0) {
bytesRead = canFrame.can_dlc;
if (data) {
memcpy(data, canFrame.data, readBytes);
}
if (rxId) {
*rxId = canFrame.can_id; // This will come in handy
}
}
return bytesRead;
}
void doStuffWithMessage() {
int32_t mySocketFd = fooGetSocketFd();
int32_t receiveId = 0;
unsigned char myData[8] = {0};
int32_t dataLength = 0;
if ((dataLength = readFromCan(mySocketFd, myData, &receiveId) == -1) {
// Handle error
return;
}
if (receiveId & CAN_ERR_MASK != 0) {
// Handle error frame
return;
}
// Do stuff with your data
}https://stackoverflow.com/questions/52613468
复制相似问题