溫馨提示×

linux socketcan有沒有示例代碼

小樊
97
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
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女