【问题标题】:CANBUS frames not send throught codeCAN BUS 帧不通过代码发送
【发布时间】:2018-05-15 06:37:26
【问题描述】:

我有一个 Raspberry Pi,它通过 SPI 连接 CAN 总线。我已经安装了canutils,如果我执行 cansend,则消息会被控制器接收并应用,但如果我通过代码执行此操作,则不会。这一定是我在构建框架时做错了什么,所以如果有人能帮助我指出我的错误,我会很感激。

这是我发送的 cansend 消息。

cansend can0 01f801f2#1212121223232323

这是我发送相同消息的代码。代码在 pthread 中运行。

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);
    }
}

【问题讨论】:

    标签: c++ raspberry-pi3 can-bus debian-stretch


    【解决方案1】:

    代码基本上有两个问题。 1. 我应该使用 canfd_frame 结构,并且应该将值设为 0。这是最后工作的代码

    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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-16
      • 1970-01-01
      相关资源
      最近更新 更多