首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于socketCAN linux驱动的CAN总线错误检测

基于socketCAN linux驱动的CAN总线错误检测
EN

Stack Overflow用户
提问于 2018-10-03 01:30:22
回答 2查看 1.4K关注 1票数 3

我们的产品在Ubuntu14.04LTS下运行的基于Beaglebone Black的嵌入式系统上使用了一个著名的CANopen堆栈,该堆栈使用socketCAN。但由于某些原因,即使我们使用的堆栈将检测到CAN总线何时进入被动状态,甚至总线关闭状态,它也从不指示CAN总线何时从错误中恢复,何时退出被动或警告状态,以及何时进入非错误状态。

如果我直接查询socketCAN驱动程序(通过ioctl调用),我是否能够检测CAN总线何时进入和退出警告状态(小于127个错误)、进入和退出被动状态(大于127个错误)或总线关闭(大于255个错误)?

我想知道这样做是在浪费时间,还是有更好的方法来准确、实时地检测CAN总线的所有情况?

EN

回答 2

Stack Overflow用户

发布于 2019-11-18 22:13:09

我对这个问题只有一个部分的解决方案。由于您使用的是socketCAN,因此该接口被视为标准的网络接口,我们可以在该接口上查询状态。基于How to check Ethernet in Linux? (将eth0替换为can0),可以查看链路状态。这不是实时的,但可以在周期性线程中执行,以检查总线状态。

票数 1
EN

Stack Overflow用户

发布于 2020-06-17 16:59:24

所以,虽然这是一个古老的问题,但我只是碰巧发现了它(在搜索一些仅有轻微相关的东西时)。

SocketCAN提供了检测错误帧OOB的所有手段。假设您的代码如下所示:

代码语言:javascript
复制
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
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52613468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档