J1939 不适用于 yocto Linux 5.4 内核版本

问题描述

我正在 linux 上开发 J1939 r/w 功能。我是这个 J1939 的新手,我需要从 j1939 开发 r/w 应用程序。我在 yocto 中添加了 can-utils,启用了 CONfig_CAN_J1939。

#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <assert.h>
#include <complex.h>
#include <ctype.h>
#include <errno.h>
#include <fenv.h>
#include <float.h>
#include <inttypes.h>
#include <iso646.h>
#include <limits.h>
#include <locale.h>
#include <math.h>
#include <setjmp.h>
#include <signal.h>
#include <stdalign.h>
#include <stdarg.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <stdnoreturn.h>
#include <string.h>
#include <tgmath.h>
#include <pthread.h>
#include <time.h>
#include <uchar.h>
#include <wchar.h>
#include <wctype.h>
#include <pthread.h>

#define CAN_SOCKET_NAME "can0"

#include <net/if.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <linux/can.h>
#include <linux/can/raw.h>
#include <libsocketcan.h>
#include <sys/select.h>
int open_j1939_socket(const char *ifname) {
    uint8_t fd;
    int ret;
    int todo_broadcast = 0;
    struct timeval tv;
    uint dat[128];
    socklen_t peernamelen;
    struct ifreq ifr;
    struct sockaddr_can sockname = {
        .can_family = AF_CAN,.can_addr.j1939 = {
            .addr = J1939_NO_ADDR,.name = J1939_NO_NAME,.pgn = J1939_NO_PGN,},peername = {
        .can_family = AF_CAN,.can_addr.j1939 = {
            .addr = 0x30,.pgn = 0x1230,};

    if((fd = socket(PF_CAN,SOCK_DGRAM,CAN_J1939)) < 0) {
        printf("Fail to create Socket Name ....\n");
        ret = CAN_OPEN_SOC_ERROR;
    }
    else
    {
      strcpy(ifr.ifr_name,ifname);
      ioctl(fd,SIocgIFINDEX,&ifr);
      sockname.can_family  = AF_CAN;
      sockname.can_ifindex = ifr.ifr_ifindex;

      printf("%s at index %d\n",ifname,ifr.ifr_ifindex);

      if(bind(fd,(void *)&sockname,sizeof(sockname)) < 0)
      {
          ret = CAN_OPEN_SOC_BIND_ERROR;
      }
else
      {
        connect(fd,(void *)&peername,sizeof(peername));
        tv.tv_sec = 0;
        tv.tv_usec = 2000;
        if (setsockopt(fd,SOL_SOCKET,SO_broADCAST,&todo_broadcast,sizeof(todo_broadcast)) < 0)
        {
             ret = CAN_SOC_SET_TIMEOUT_ERROR;
        }
      }
      printf("pgn_name:%016llx \n",sockname.can_addr.j1939.name);
      printf("j1939_addr:%02x pgn:%05x:\n",sockname.can_addr.j1939.addr,sockname.can_addr.j1939.pgn);
 recvfrom(sock,dat,sizeof(dat),&peernamelen);
    }
   ret = fd;
   return fd;
}

我无法从使用 PCAN 的 busmaster 读取数据 在 busmaster 输入 pgn:0x12300,dlc:8 请帮助我在这里犯错的地方。 非常感谢您的建议。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)