can.zip

  • xvjin
    了解作者
  • C/C++
    开发工具
  • 2KB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • 10 积分
    下载积分
  • 1
    下载次数
  • 2020-08-28 15:14
    上传日期
实现socket can 通信,接收数据同时对该数据进行发送
can.zip
  • Makefile
    258B
  • config.sh
    110B
  • can_test.c
    4KB
内容介绍
#include <stdio.h> #include <sys/ioctl.h> #include <arpa/inet.h rel='nofollow' onclick='return false;'> #include <net/if.h> #include <linux/socket.h> #include <linux/can.h> #include <linux/can/error.h> #include <linux/can/raw.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <time.h> #ifndef AF_CAN #define AF_CAN 29 #endif #ifndef PF_CAN #define PF_CAN AF_CAN #endif static void print_frame(struct can_frame *fr) { int i; printf("recv: can.id=0x%08x ", fr->can_id & CAN_EFF_MASK); //printf("%08x\n", fr->can_id); printf("dlc = %d ", fr->can_dlc); printf("data = "); for (i = 0; i < fr->can_dlc; i++) printf("%02x ", fr->data[i]); printf("\n"); } #define errout(_s) fprintf(stderr, "error class: %s\n", (_s)) #define errcode(_d) fprintf(stderr, "error code: %02x\n", (_d)) static void handle_err_frame(const struct can_frame *fr) { if (fr->can_id & CAN_ERR_TX_TIMEOUT) { errout("CAN_ERR_TX_TIMEOUT"); } if (fr->can_id & CAN_ERR_LOSTARB) { errout("CAN_ERR_LOSTARB"); errcode(fr->data[0]); } if (fr->can_id & CAN_ERR_CRTL) { errout("CAN_ERR_CRTL"); errcode(fr->data[1]); } if (fr->can_id & CAN_ERR_PROT) { errout("CAN_ERR_PROT"); errcode(fr->data[2]); errcode(fr->data[3]); } if (fr->can_id & CAN_ERR_TRX) { errout("CAN_ERR_TRX"); errcode(fr->data[4]); } if (fr->can_id & CAN_ERR_ACK) { errout("CAN_ERR_ACK"); } if (fr->can_id & CAN_ERR_BUSOFF) { errout("CAN_ERR_BUSOFF"); } if (fr->can_id & CAN_ERR_BUSERROR) { errout("CAN_ERR_BUSERROR"); } if (fr->can_id & CAN_ERR_RESTARTED) { errout("CAN_ERR_RESTARTED"); } } #define myerr(str) fprintf(stderr, "%s, %s, %d: %s\n", __FILE__, __func__, __LINE__, str) static int test_can_rw(int fd, int master) { int ret, i; struct can_frame fr, frdup; struct timeval tv; fd_set rset; while (1) { tv.tv_sec = 1; tv.tv_usec = 0; FD_ZERO(&rset); FD_SET(fd, &rset); ret = select(fd+1, &rset, NULL, NULL, NULL); if (ret == 0) { myerr("select time out"); return -1; } /* select调用无错返回时,表示有符合规则的数据帧到达 */ ret = read(fd, &frdup, sizeof(frdup)); if (ret < sizeof(frdup)) { myerr("read failed"); return -1; } if (frdup.can_id & CAN_ERR_FLAG) { /* 检查数据帧是否错误 */ handle_err_frame(&frdup); myerr("CAN device error"); continue; } print_frame(&frdup); /* 打印数据帧信息 */ ret = write(fd, &frdup, sizeof(frdup)); /* 把接收到的数据帧发送出去 */ if (ret < 0) { myerr("write failed"); return -1; } } return 0; } int main(int argc, char *argv[]) { int s; int ret; struct sockaddr_can addr; struct ifreq ifr; int master; srand(time(NULL)); s = socket(PF_CAN, SOCK_RAW, CAN_RAW); /* 创建套接字 */ if (s < 0) { perror("socket PF_CAN failed"); return 1; } /* 把套接字绑定到can0接口 */ strcpy(ifr.ifr_name, "can0"); ret = ioctl(s, SIOCGIFINDEX, &ifr); if (ret < 0) { perror("ioctl failed"); return 1; } addr.can_family = PF_CAN; addr.can_ifindex = ifr.ifr_ifindex; ret = bind(s, (struct sockaddr *)&addr, sizeof(addr)); if (ret < 0) { perror("bind failed"); return 1; } /* 设置过滤规则 */ if (0) { struct can_filter filter[2]; /* 第1个规则是可以接收ID为0x200 & 0xFFF的数据帧 */ filter[0].can_id = 0x200 | CAN_EFF_FLAG; filter[0].can_mask = 0xFFF; /* 第2个规则是可以接收ID为0x20F& 0xFFF的数据帧 */ filter[1].can_id = 0x20F | CAN_EFF_FLAG; filter[1].can_mask = 0xFFF; /* 启用过滤规则,只要CAN0接收到的数据帧满足上面2个规则中的任何一个也被接受*/ ret = setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, &filter, sizeof(filter)); if (ret < 0) { perror("setsockopt failed"); return 1; } } test_can_rw(s, master); /*进入测试*/ close(s); return 0; }
评论
    相关推荐
    • CANBUS_with_socketcan.zip
      Create client to pass signal through socket CAN
    • cannelloni:以太网上的SocketCAN隧道
      以太网上的SocketCAN隧道 cannelloni用C ++ 11编写,并使用UDP在两台计算机之间传输CAN帧。 特征: 以太网帧中的帧聚合(一个以太网帧中有多个CAN帧) 有效协议 可能有很高的数据速率(10 Mbit / s +) 某些ID的...
    • node-red-contrib-socketcan:一个socketcan接口
      节点红色贡献socketcan 这是几个节点,可使用socketcan从中读取CAN帧并将CAN帧发送到CAN总线。 是Linux上的标准CAN子系统。 Socketcan在Windows上不可用。 这个项目的灵感来自 (Rajesh Sola ),它几乎完成了我所...
    • socketcan-isobus-java:用于 Linux 内核 SocketCAN ISOBUS 模块的 JAVA JNI
      socketcan-isobus-java 用于 Linux 内核 SocketCAN ISOBUS 模块的 JAVA JNI 库
    • linux socketCAN.7z
      linux socketCAN,很不错的linux CAN资料,希望对你的工作学习有所帮助。
    • 2019RaspberryPi项目:Phoenix-Linux-SocketCAN-示例
      Phoenix-Linux-SocketCAN-示例 在Linux / RaspPi平台上使用CTRE Phoenix类库的一般示例。 演示了两个用例... 对于非FRC用例(将无线游戏手柄插入Raspberry PI中),运行没有roboRIO的机器人。 在FRC竞赛中使用...
    • java-socketcan
      java开发can接口,再linux环境下编译的jar,直接添加到lib使用即可。
    • socketcan-rs:Rust中Linux SocketCAN访问
      Rust SocketCAN支持 维护状态:该板条箱正在与续签新的联合维护。 请耐心等待一段时间以进行清理。 -@mbr。 Linux内核支持通过类似网络的API使用CAN设备(请参阅 )。 此板条箱可轻松访问此功能,而无需费解libc...
    • node-can:NodeJS SocketCAN扩展
      这是一个NodeJS SocketCAN扩展。 SocketCAN是用于Linux系统的CANbus协议的基于套接字的实现。 通过此扩展,可以使用简单的Javascript函数发送和接收CAN消息(扩展的远程传输)。 用法 基本的CAN示例: var can = ...
    • jnaCan:Java 的 CAN 总线,使用 JNA 访问 Linux SocketCan API
      Java 的 CAN 总线,使用 JNA 访问 Linux SocketCan API。 本软件为Alpha品质,请勿用于生产。 通过使用Java Native Access,无需编写本机代码即可访问SocketCan API。 这个项目是纯 Java 的(从技术上讲,JNA jar ...