can20-bus-scanner.ino

Ordinateur industriel monocarte BPI-5202 Loongson 2K1000LAi · Fichier : can20-bus-scanner.ino · Langage : C · Usage : Scanner le bus CAN2.0 pour détecter les nœuds actifs et afficher les trames reçues.

Programme C utilisant l'API SocketCAN du noyau Linux pour lire les trames sur les ports CAN2.0 de la carte.

Le BPI-5202 possède deux ports CAN2.0. Sous Loongnix, activez l'interface avec 'ip link set can0 up type can bitrate 500000'. Compilez avec gcc. Ce scanner est essentiel pour le débogage des réseaux industriels 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;
}

← Retour à la fiche