CAN总线开发

硬件接口

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

CAN CAN

一个简单的 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;
}