在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 (将#修改为@)