can20-bus-scanner.ino

Computador industrial de placa única BPI-5202 Loongson 2K1000LAi · Archivo : can20-bus-scanner.ino · Lenguaje : C · Uso : Scanner le bus CAN2.0 pour détecter les nœuds actifs et afficher les trames reçues.

Programa en C que utiliza la API SocketCAN del kernel Linux para leer tramas en los puertos CAN2.0 de la placa.

El BPI-5202 tiene dos puertos CAN2.0. Bajo Loongnix, active la interfaz con 'ip link set can0 up type can bitrate 500000'. Compile con gcc. Este escáner es esencial para depurar redes industriales CAN.

can20-bus-scanner.ino

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

int main() {
    int s;
    struct ifreq ifr;
    struct can_frame frame;
    struct sockaddr_can addr;

    // Créer une socket CAN brute
    s = socket(PF_CAN, SOCK_RAW, CAN_RAW);
    if (s < 0) {
        perror("Socket");
        return 1;
    }

    // Configurer l'interface CAN (ex: can0)
    strcpy(ifr.ifr_name, "can0");
    if (ioctl(s, SIOCGIFINDEX, &ifr) < 0) {
        perror("SIOCGIFINDEX");
        close(s);
        return 1;
    }

    addr.can_family = AF_CAN;
    addr.can_ifindex = ifr.ifr_ifindex;

    if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
        perror("Bind");
        close(s);
        return 1;
    }

    printf("Scanner CAN activé sur can0...\n");
    printf("ID       DLC  Data\n");
    printf("-------------------\n");

    while (1) {
        int nbytes = read(s, &frame, sizeof(frame));
        if (nbytes < 0) {
            perror("Read");
            break;
        }
        if (nbytes == sizeof(struct can_frame)) {
            printf("%03X   %d    ", frame.can_id, frame.can_dlc);
            for (int i = 0; i < frame.can_dlc; i++) {
                printf("%02X ", frame.data[i]);
            }
            printf("\n");
        }
    }

    close(s);
    return 0;
}

← Volver a la ficha