当然有!下面是一个简单的 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>
是你要使用的网络接口(例如 eth0
或 wlan0
),<message>
是你要发送的消息(例如 Hello, World!
)。请注意,你可能需要根据你的系统调整示例代码中的网络接口名称。