CAN总线开发
硬件接口

软件开发
将CAN的H/L链接到pcan工具的H/L,GND也都连接好,或周立功can
## can配置波特率并使能
ip link set can0 type can bitrate 500000
ifconfig can0 up
##发送数据
cansend can0 -i0x123 0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38
##接收数据
candump can0

一个简单的 C 语言示例
假设我们想用 libsocketcan 来:
1. 设置 can0 波特率为 500kbps
2. 启用 can0 接口
3. 然后收发一条 CAN 报文
代码示例 can_test.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <libsocketcan.h> // libsocketcan 头文件
#include <sys/types.h>
#include <sys/socket.h>
#include <linux/can.h>
#include <linux/can/raw.h>
#include <net/if.h>
int main()
{
const char *ifname = "can0";
// 1. 设置波特率为 500000
if (can_set_bitrate(ifname, 500000) < 0) {
perror("can_set_bitrate");
return 1;
}
// 2. 启用接口(up)
if (can_do_start(ifname) < 0) {
perror("can_do_start");
return 1;
}
printf("%s 启动完成,波特率设置为500kbps。\n", ifname);
// 3. 创建 Raw CAN socket
int s = socket(PF_CAN, SOCK_RAW, CAN_RAW);
if (s < 0) {
perror("socket");
return 1;
}
struct ifreq ifr;
strcpy(ifr.ifr_name, ifname);
if (ioctl(s, SIOCGIFINDEX, &ifr) < 0) {
perror("ioctl");
return 1;
}
struct sockaddr_can addr;
addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;
if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
perror("bind");
return 1;
}
// 4. 发送一帧
struct can_frame frame;
frame.can_id = 0x123; // 标准帧 ID
frame.can_dlc = 2; // 数据长度
frame.data[0] = 0x11;
frame.data[1] = 0x22;
if (write(s, &frame, sizeof(frame)) != sizeof(frame)) {
perror("write");
return 1;
}
printf("发送 CAN 帧: ID=0x%03X 数据=%02X %02X\n",
frame.can_id, frame.data[0], frame.data[1]);
// 5. 循环接收
printf("开始接收...\n");
while (1) {
struct can_frame rframe;
int nbytes = read(s, &rframe, sizeof(rframe));
if (nbytes < 0) {
perror("read");
break;
}
printf("收到 CAN 帧: ID=0x%03X DLC=%d 数据=",
rframe.can_id, rframe.can_dlc);
for (int i = 0; i < rframe.can_dlc; i++)
printf("%02X ", rframe.data[i]);
printf("\n");
}
close(s);
return 0;
}