Problème réception linux CAN

cocoldEF Messages postés 5 Statut Membre -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour, je dispose d'une raspberry pi 3 avec une interface shield CAN .
Je souhaite récupérer les données de retour. Pour celui j'utilise la library "can-utils" qui permet avec la commande candump de réaliser une scrutation de la ligne can.
Pour récupérer les données et les traiter j'avais pour idée de rediriger le candump sur un fichier texte afin de pouvoir récupérer les données sur le fichier texte crée et les traiter à l'aide d'un programme en c ou c++.
Le problème étant que le fichier texte doit être enregistré en permanence pour pouvoir récupérer en temps réel et pouvoir les traiter en interne. Comment faire ?Avez vous une autre idée pour récupérer les trames et les traiter ?

MERCI

4 réponses

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
     
    Bonjour,

    Il est inutile de passer par un fichier dans ton cas de figure. Un pipe peut faire l'affaire, il suffit que ton programme en c/c++ traite le flux lu sur
    stdin
    .

    candump | ./mon_programme


    Tu peux aussi faire un appel système à
    candump
    depuis traiter son flux de sortie à la volée (voir
    popen
    par exemple) mais ça a moins de cachet puisque ça rend ton programme dépendant de
    candump
    (au lieu de le rendre juste dépendant de la nature du flux).

    Bonne chance
    1
  2. cocoldEF Messages postés 5 Statut Membre
     
    Merci pour ta réponse ! je vais regarder ca :)
    0
  3. cocoldEF Messages postés 5 Statut Membre
     
    Du coup pour le
    popen
    , l'initialisation ce ferai comme ceci ?:

    File *sortie=NULL;
    sortie=popen("./candump","r");


    et je pourrai ensuite récupérer les lignes écrite par le candump dans un string "tab" comme ceci si j'ai bien compris ?

    File *sortie = NULL;
    
    void main(void) {
        sortie = popen("./candump","r");
        char tab[30];
        if(sortie != NULL) {
            while(fgets(tab,30,sortie)!=NULL) {
                fprintf("%s", tab);
            }
        }
        return 0;
    }
    0
  4. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
     
    Bonjour,

    Pas exactement. Déjà c'est
    FILE *
    et il faut éviter les variables globale. Ensuite tout open qui a fonctionné doit se conclure par un
    pclose
    .

    Un premier exemple ici :
    https://www.gnu.org/software/libc/manual/html_node/Pipe-to-a-Subprocess.html

    Ici un flux contenant des entiers de 1 à 100 est pipé dans la commande
    more
    . Ce n'est pas exactement ce que tu veux mais c'est un exemple assez minimal pour comprendre la logique.

    Ensuite, regarde ici :
    https://stackoverflow.com/questions/280571/how-to-control-popen-stdin-stdout-stderr-redirection

    N'oublie pas que sous linux ou dans google tu peux chercher "man popen" pour comprendre ce que font et comment s'utilisent les différentes fonctions de la libc.

    Bonne chance
    0