首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CANBUS帧不通过代码发送

CANBUS帧不通过代码发送
EN

Stack Overflow用户
提问于 2018-05-15 06:37:26
回答 1查看 201关注 0票数 1

我有一个Raspberry Pi接口,一个CAN总线通过SPI。我已经安装了canutils,如果我安装了一个接口,控制器就会接收到消息并应用它,但是如果我通过代码完成它,就不会了。这肯定是我在构建框架时做错了什么,所以如果有人能帮我指出我的错误,我会很感激的。

这是我发送的信。

代码语言:javascript
复制
cansend can0 01f801f2#1212121223232323

这是我的代码来发送同样的信息。代码在一个线程中运行。

代码语言:javascript
复制
void *CANUpdate(void *userParam)
{
    struct sockaddr_can addr;
    struct ifreq ifr;
    const char *ifname = "can0";
    int can_s;

    if ((can_s = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0)
    {
        LogEntry(LOG_ERR, "Error while opening socket\n");
        return 0;
    }

    strcpy(ifr.ifr_name, ifname);
    ioctl(can_s, SIOCGIFINDEX, &ifr);

    addr.can_family = AF_CAN;
    addr.can_ifindex = ifr.ifr_ifindex;

    if (bind(can_s, (struct sockaddr *)&addr, sizeof(addr)) < 0)
    {
        LogEntry(LOG_ERR, "Error in CAN socket bind\n");
        return 0;
    }

    while (!stopServer)
    {
        if (can_s)
        {
            struct can_frame frame;
            frame.can_id = 0x01f801f2;
            frame.can_dlc = 8;
            frame.data[0] = 0x12;
            frame.data[1] = 0x12;
            frame.data[2] = 0x12;
            frame.data[3] = 0x12;
            frame.data[4] = 0x34;
            frame.data[5] = 0x34;
            frame.data[6] = 0x34;
            frame.data[7] = 0x34;

            int res = write(can_s, &frame, sizeof(struct can_frame));
        }
        msleep(800);
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-18 06:47:42

代码基本上有两个问题。1.我应该使用canfd_frame结构,并且应该对值进行0‘编辑。下面是在最后起作用的代码

代码语言:javascript
复制
void *CANUpdate(void *userParam)
{
    struct sockaddr_can addr;
    struct ifreq ifr;
    const char *ifname = "can0";
    int can_s;

    if ((can_s = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0)
    {
        LogEntry(LOG_ERR, "Error while opening socket\n");
        return 0;
    }

    strcpy(ifr.ifr_name, ifname);
    ioctl(can_s, SIOCGIFINDEX, &ifr);

    addr.can_family = AF_CAN;
    addr.can_ifindex = ifr.ifr_ifindex;

    setsockopt(can_s, SOL_CAN_RAW, CAN_RAW_FILTER, NULL, 0);

    if (bind(can_s, (struct sockaddr *)&addr, sizeof(addr)) < 0)
    {
        LogEntry(LOG_ERR, "Error in CAN socket bind\n");
        return 0;
    }

    while (!stopServer)
    {
        if (can_s)
        {
        struct canfd_frame frame;
        memset(&frame, 0, sizeof(frame)); /* init CAN FD frame, e.g. LEN = 0 */
        frame.can_id = 0x01f801f2;
        frame.len = 8;

        if (!(frame.can_id & CAN_ERR_FLAG)) /* 8 digits but no errorframe?  */
            frame.can_id |= CAN_EFF_FLAG;   /* then it is an extended frame */

            frame.data[0] = 0x12;
            frame.data[1] = 0x12;
            frame.data[2] = 0x12;
            frame.data[3] = 0x12;
            frame.data[4] = 0x34;
            frame.data[5] = 0x34;
            frame.data[6] = 0x34;
            frame.data[7] = 0x34;

            if(write(can_s, &frame, sizeof(struct can_frame)) != sizeof(struct can_frame);
            LogEntry(LOG_ERR, "Unable to write CAN message\n");
        }
        msleep(800);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50343741

复制
相关文章

相似问题

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