【问题标题】:can socket printf format可以socket printf格式
【发布时间】:2015-10-09 09:02:15
【问题描述】:

显示我的 CAN ID 时出现问题。我正在通过 ID 为 0x18FF11F3 的 CAN bus 发送一条消息。我的程序收到此消息以及所有数据字段,只有 ID 不完全匹配

    void set_can_listener(uint16 *s16_Socket, struct can_frame *Frame) {
    /* Create the socket */
    *s16_Socket = socket(PF_CAN, SOCK_RAW, CAN_RAW);

    /* Locate the interface you wish to use */
    struct ifreq t_Ifr;
    strcpy(t_Ifr.ifr_name, "can0");
    ioctl(*s16_Socket, SIOCGIFINDEX, &t_Ifr); /* Ifr.ifr_ifindex gets filled with that device's index*/

    /* Select that CAN interface, and bind the socket to it.*/
    struct sockaddr_can t_Addr;
    t_Addr.can_family = AF_CAN;
    t_Addr.can_ifindex = t_Ifr.ifr_ifindex;
    bind(*s16_Socket, (struct sockaddr*) &t_Addr, sizeof(t_Addr));
}


void can_listener(uint16 *s16_Socket, struct can_frame *Frame) {
    /* Read message from CAN */
    unsigned int i;
    uint16 s16_BytesRead = read(*s16_Socket, Frame, sizeof(*Frame));
    if (s16_BytesRead >= 0) {
        printf("\nMessage received!\nID: 0x%X\nDLC: %X\n", Frame->can_id,
                Frame->can_dlc);
    }
}

我的输出如下:

Message received! 
ID: 0x98FF11F3 
DLC: 8

【问题讨论】:

  • 如果 read() 返回零,则不应打印任何内容。很难相信有一点被神奇地设置在某个地方。你确定你发送正确吗?为什么此代码中没有正确的错误检查?这和primtf()有什么关系?

标签: c sockets can-bus


【解决方案1】:

您正在读取带有CAN_EFF_FLAG过滤器集的ID,定义为

#define CAN_EFF_FLAG 0x80000000U

HERE

代码没问题,收到的消息也没问题。发件人在套接字上启用了EFF 过滤器。

THIS链接可以为您解释SocketCAN的一切

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-21
    • 2010-10-06
    • 2019-07-01
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 2023-03-25
    相关资源
    最近更新 更多