微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在linux中发送没有数据的CAN总线J1939消息

如何解决在linux中发送没有数据的CAN总线J1939消息

我需要使用 socketcan 发送一个没有数据的 CAN 总线 J1939 消息。需要发送无数据消息的原因是遵循规范 J1939-73 DM11 (PGN=0x00FED3)。

当发送长度至少为 1 个字节的数据时,下面的 C 代码工作正常。当 sizeof(dat) == 0 时,sendto() 函数根本不发送消息。我们可以用 candump vcan0 验证这一点。

有没有办法使用 socket(PF_CAN,SOCK_DGRAM,CAN_J1939) 发送 0 字节数据的消息?它可以确认它可以使用 socket(AF_CAN,SOCK_RAW,CAN_RAW) 在原始 CAN 中完成,但我需要它与 J1939 协议套接字一起使用。

我们如何联系内核开发人员提交错误/增强请求?

可以在此处找到 J1939 linux 内核文档:https://www.kernel.org/doc/html/v5.8/networking/j1939.html

谢谢。

#include <inttypes.h>
#include <linux/can/j1939.h>
#include <sys/socket.h>
#include <net/if.h>

int main() {
    int sock;
    const char device[] = "vcan0";
    uint8_t dat[2];
    dat[0] = 0;
    dat[1] = 1; 

    struct sockaddr_can baddr = {
        .can_family = AF_CAN,.can_addr.j1939 = {
            .name = J1939_NO_NAME,.addr = 0x20,.pgn = J1939_NO_PGN,},.can_ifindex = if_nametoindex(device),};

    sock = socket(PF_CAN,CAN_J1939);
    bind(sock,(void *)&baddr,sizeof(baddr));

    struct sockaddr_can saddr = {
        .can_family = AF_CAN,.addr = 0x30,.pgn = 0xFED3,};

    // sendto(sock,dat,sizeof(dat),(const struct sockaddr *)&saddr,sizeof(saddr));
    sendto(sock,sizeof(saddr));

    return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。