From 1e563e2b731d928942f43e1341c8c50b0faf1c01 Mon Sep 17 00:00:00 2001 From: guowenxue <guowenxue@gmail.com> Date: Fri, 31 May 2024 11:39:31 +0800 Subject: [PATCH] APPS:IGKBoard-IMX6ULL: Add test-apps source code: --- drivers/test-apps/can_test.c | 191 +++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 191 insertions(+), 0 deletions(-) diff --git a/drivers/test-apps/can_test.c b/drivers/test-apps/can_test.c new file mode 100644 index 0000000..7570d51 --- /dev/null +++ b/drivers/test-apps/can_test.c @@ -0,0 +1,191 @@ +/********************************************************************************* + * Copyright: (C) 2024 LingYun IoT System Studio + * All rights reserved. + * + * Filename: can_test.c + * Description: This file is socket CAN loop test program + * + * Version: 1.0.0(05/26/2024) + * Author: Guo Wenxue <guowenxue@gmail.com> + * ChangeLog: 1, Release initial version on "05/26/2024 05:42:49 PM" + * + ********************************************************************************/ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <sys/ioctl.h> +#include <net/if.h> +#include <sys/socket.h> +#include <linux/can.h> +#include <linux/can/raw.h> +#include <getopt.h> + +// 打印使用帮助信息 +void print_usage(const char *progname) +{ + printf("Usage: %s -i <can_interface> -m <mode>\n", progname); + printf("Options:\n"); + printf(" -i, --interface CAN interface (e.g., can0)\n"); + printf(" -m, --mode Mode: send or receive\n"); + printf(" -h, --help Display this help message\n"); +} + +void send_can_message(const char *ifname) +{ + int fd; + struct sockaddr_can addr; + struct ifreq ifr; + struct can_frame frame; + + // 创建socket + fd = socket(PF_CAN, SOCK_RAW, CAN_RAW); + if (fd < 0) + { + perror("socket"); + exit(1); + } + + // 指定CAN接口 + strcpy(ifr.ifr_name, ifname); + ioctl(fd, SIOCGIFINDEX, &ifr); + addr.can_family = AF_CAN; + addr.can_ifindex = ifr.ifr_ifindex; + + // 绑定socket到CAN接口 + if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) + { + perror("bind"); + exit(1); + } + + // 构造CAN帧 + frame.can_id = 0x123; // 设置CAN ID + frame.can_dlc = 2; // 数据长度 + frame.data[0] = 0x11; // 数据 + frame.data[1] = 0x22; // 数据 + + // 发送CAN帧 + if (write(fd, &frame, sizeof(struct can_frame)) != sizeof(struct can_frame)) + { + perror("write"); + exit(1); + } + + // 关闭socket + close(fd); +} + +void receive_can_message(const char *ifname) +{ + int fd; + struct sockaddr_can addr; + struct ifreq ifr; + struct can_frame frame; + + // 创建socket + fd = socket(PF_CAN, SOCK_RAW, CAN_RAW); + if (fd < 0) { + perror("socket"); + exit(1); + } + + // 指定CAN接口 + strcpy(ifr.ifr_name, ifname); + ioctl(fd, SIOCGIFINDEX, &ifr); + addr.can_family = AF_CAN; + addr.can_ifindex = ifr.ifr_ifindex; + + // 绑定socket到CAN接口 + if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) + { + perror("bind"); + exit(1); + } + + // 接收CAN帧 + while (1) + { + int nbytes = read(fd, &frame, sizeof(struct can_frame)); + if (nbytes < 0) + { + perror("read"); + exit(1); + } + + if (nbytes < sizeof(struct can_frame)) + { + fprintf(stderr, "read: incomplete CAN frame\n"); + exit(1); + } + + // 打印接收到的CAN帧 + printf("Received CAN frame: ID=0x%X DLC=%d data=", frame.can_id, frame.can_dlc); + for (int i = 0; i < frame.can_dlc; i++) + printf("%02X ", frame.data[i]); + + printf("\n"); + } + + // 关闭socket + close(fd); +} + +int main(int argc, char **argv) +{ + int opt, index = 0; + const char *ifname = NULL; + const char *mode = NULL; + + // 定义长选项 + static struct option long_options[] = + { + {"interface", required_argument, 0, 'i'}, + {"mode", required_argument, 0, 'm'}, + {"help", no_argument, 0, 'h'}, + {0, 0, 0, 0} + }; + + while ((opt = getopt_long(argc, argv, "i:m:h", long_options, &index)) != -1) + { + switch (opt) { + case 'i': + ifname = optarg; + break; + case 'm': + mode = optarg; + break; + case 'h': + print_usage(argv[0]); + return 0; + default: + print_usage(argv[0]); + return 1; + } + } + + if (ifname == NULL || mode == NULL) + { + print_usage(argv[0]); + return 1; + } + + if (strcmp(mode, "send") == 0) + { + send_can_message(ifname); + } + else if (strcmp(mode, "receive") == 0) + { + receive_can_message(ifname); + } + else + { + fprintf(stderr, "Invalid mode: %s\n", mode); + print_usage(argv[0]); + return 1; + } + + return 0; +} + -- Gitblit v1.9.1