问题描述
我需要使用 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 (将#修改为@)