linux

linux socketcan有没有示例代码

小樊
83
2025-01-01 08:49:47
栏目: 智能运维

当然有!下面是一个简单的 Linux SocketCAN 示例代码,用于发送和接收数据

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <net/if.h>
#include <linux/can.h>
#include <linux/can/raw.h>

#define BUF_SIZE 256

int main(int argc, char *argv[]) {
    int sockfd;
    struct sockaddr_can addr;
    struct ifreq ifr;
    struct canmsg msg;
    char buf[BUF_SIZE];

    // 检查命令行参数
    if (argc != 3) {
        printf("Usage: %s <interface> <message>\n", argv[0]);
        exit(1);
    }

    // 获取网络接口
    strncpy(ifr.ifr_name, argv[1], IFNAMSIZ);
    if (ioctl(sockfd, SIOCGIFINDEX, &ifr) == -1) {
        perror("ioctl");
        exit(1);
    }

    // 创建 SocketCAN 套接字
    sockfd = socket(PF_CAN, SOCK_RAW, CAN_RAW);
    if (sockfd == -1) {
        perror("socket");
        exit(1);
    }

    // 设置套接字选项
    memset(&addr, 0, sizeof(addr));
    addr.can_family = AF_CAN;
    addr.can_ifindex = ifr.ifr_ifindex;

    if (bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
        perror("bind");
        exit(1);
    }

    // 准备发送数据
    memset(&msg, 0, sizeof(msg));
    msg.can_id = 0x123;
    msg.can_dlc = 8;
    memcpy(msg.data, argv[2], msg.can_dlc);

    // 发送数据
    if (write(sockfd, &msg, sizeof(msg)) == -1) {
        perror("write");
        exit(1);
    }

    // 准备接收数据
    memset(buf, 0, BUF_SIZE);
    msg.can_id = 0x123;
    msg.can_dlc = 8;

    // 接收数据
    while (1) {
        ssize_t len = read(sockfd, buf, BUF_SIZE);
        if (len == -1) {
            perror("read");
            exit(1);
        }

        printf("Received message: %s\n", buf);
    }

    // 关闭套接字
    close(sockfd);
    return 0;
}

要编译此代码,请使用以下命令:

gcc -o socketcan_example socketcan_example.c

然后,使用以下命令运行示例代码:

sudo ./socketcan_example <interface> <message>

其中 <interface> 是你要使用的网络接口(例如 eth0wlan0),<message> 是你要发送的消息(例如 Hello, World!)。请注意,你可能需要根据你的系统调整示例代码中的网络接口名称。

0
看了该问题的人还看了