IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MATLAB Discussion :

Récupération de données d'une trame CAN


Sujet :

MATLAB

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2015
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2015
    Messages : 55
    Points : 25
    Points
    25
    Par défaut Récupération de données d'une trame CAN
    Bonjour à tous,
    J'ai voulu poser une question concernant la récupération de données d'une trame CAN avec matlab.
    Ci-dessous une figure qui explique l'organisation de données dans la trame CAN.
    En fait, cette trame contient 64 bits, numérotés dans la figure de 1 à 64.
    J'aurais besoin seulement de bits qui sont en bleu (17 à 22 et 30 à 32), sachant que le bit 30 est le LSB et le bit 22 est le MSB.
    Pusique je n'ai pas trouvé comment faire les opérations logiques et la concaténation de bits (and, or...) en matlab, j'ai essayé avec cette méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    D1=int16(0);  % Initialisation d'un entier sur 16 bit pour l'operation de shift 
    D2=int16(0);
    D3=int16(0);
     
    D1 =  int16(messagein.Data(5)); % quelques opérations pour récuperer les données, messagein.Data(5) est uint8 (sur 8 bits)
    D2 =  int16(messagein.Data(6));
     
     D1 = bitshift(D1,3); % shift les bits de 17 à 22, 3 bits à gauche 
     D2 = bitshift(D2,-5); % shift les bits de 30 à 32, 5 bits à droite
     D3 = D1 +D2;  % faire la somme , concaténation de données
    Alors qu'est ce que vous en pensez ?
    Merci.

    Nom : tramecan.jpg
Affichages : 354
Taille : 57,7 Ko

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 163
    Points
    53 163
    Par défaut
    Comment est stockée la trame de 64 bits ? Avec 8 variables int8 ?
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2015
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2015
    Messages : 55
    Points : 25
    Points
    25
    Par défaut
    Oui, 8 octets , chaque octet est de type uint8 (unsigned int 8) .

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 163
    Points
    53 163
    Par défaut
    Tout d'abord, convertir les données de int8 en int16 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    D5 =  int16(messagein.Data(5));
    D6 =  int16(messagein.Data(6));
    Pour la ligne qui contient les 6 bits utiles, il faut faire un ET logique avec la valeur 00111111 (63) puis un décalage à gauche de 3 bits 00000000??XXXXXX => 00000XXXXXX000 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bitshift(bitand(D6, 63), 3)
    Pour la ligne qui contient les 3 bits utiles, il faut faire un ET logique avec la valeur 11100000 (224) puis un décalage à droite de 5 bits 00000000XXX????? => 0000000000000XXX :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bitshift(bitand(D5, 224), -5)
    On somme ensuite les deux résultats :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    D = bitshift(bitand(D5, 224), -5) + bitshift(bitand(D6, 63), 3)
    Une autre solution consiste à utiliser les fonctions bitset et bitget sans convertir les données initiales :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    D5 =  messagein.Data(5);
    D6 =  messagein.Data(6);
     
    D = int16(0);
     
    for n = 1:3
        b = bitget(messagein.Data(6), n+5);
        D = bitset(D, n, b);
    end
     
    for n = 1:6
        b = bitget(messagein.Data(5), n);
        D = bitset(D, n+3, b);
    end
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2015
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2015
    Messages : 55
    Points : 25
    Points
    25
    Par défaut
    Merci Jerome.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [D6 => XML] Récupération de données dans une balise
    Par Bason_sensei dans le forum Delphi
    Réponses: 10
    Dernier message: 22/05/2006, 17h15
  2. récupération de données sur une disquette
    Par olilacta dans le forum Ordinateurs
    Réponses: 3
    Dernier message: 21/04/2006, 13h41
  3. Problème de récupérations de données dans une table mysql
    Par Helpine dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 09/03/2006, 19h07
  4. récupération des données via une liste déroulante
    Par rahan_dave dans le forum Access
    Réponses: 1
    Dernier message: 13/10/2005, 12h27
  5. Réponses: 4
    Dernier message: 05/04/2004, 10h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo