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

Arduino Discussion :

Comprendre ces lignes


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 222
    Par défaut Comprendre ces lignes
    Bonjour, j'ai cette ligne de code:
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        if((rxId & 0x80000000) == 0x80000000)     // Determine if ID is standard (11 bits) or extended (29 bits)
          sprintf(msgString, "Standard ID: 0x%.3lX       DLC: %1d  Data:", rxId, len);

    j'obtiens ce résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Standard ID: 0x5D7       DLC: 7  Data:--> 0x00 0x00 0x07 0xA4 0x8C 0x00 0x00
    je souhaite une explication sur la condition , que signifie le signe & dans la condition
    0x80000000 est t'il en hexa ?
    cette écriture m'est pour le moment indigeste pour un débutant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
          sprintf(msgString, "Standard ID: 0x%.3lX       DLC: %1d  Data:", rxId, len);
    merci de vos réponses

  2. #2
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 908
    Par défaut
    le & est une opération - c'est le ET binaire (bit à bit) -> cf la doc de "Bitwise and"

    donc on fait un masque avec 0x80000000 et on regarde si le résultat est identique au masque. Si c'est vrai c'est que tous les 1 du masque correspondent à des 1 dans rxId

    0x80000000 est t'il en hexa ?
    Oui la notation 0x introduit une constante numérique représentée en hexadécimal

    pour l'écriture indigeste, il faut lire la doc de sprintf() qui va écrire dans un buffer mémoire un chaîne de caractère formatée.

    En gros, Vous donnez en paramètre le buffer où mettre le résultat (msgString), et le contenu textuel à mettre dans le buffer
    "Standard ID: 0x%.3lX DLC: %1d Data:"
    Si vous voulez insérer dans le contenu textuel des valeurs de variables, alors dans le contenu textuel vous mettez une note commençant par % à l'endroit voulu et vous décrivez le format souhaité. Par exemple %.3lX va demander un nombre long sous forme heXadécimal et le .3 veut dire qu'on veut que ce champ tienne au moins sur 3 caractères en mettant des 0 à gauche si c'est trop court (padding)

    Si votre valeur à afficher est 0x5D7 alors vous verrez bien 0x5D7, si c'est 0xABCDEF vous verrez 0xABCDEF (on ne coupe pas s'il y a plus de 3 caractères) mais si c'est 0x3 vous verrez 0x003 (padding à gauche avec les 0 pour avoir 3 caractères).

    Notez aussi que le 0x ne vient pas de %.3lX, il est écrit littéralement dans la chaîne de formatage.

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 222
    Par défaut
    merci de la réponse

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     if((rxId & 0x80000000) == 0x80000000)
    on applique le masque sur le rxId avec un ET
    car pour le moment je le comprend

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int rxId = 1011
    if( (rxId & 0xB)  == 0x8) // soit 1001 avec un ET logique => 1011 & 1010 = 1010 
    //cela équivaut
    if(1010 == 1000)
    //ici on ne rentre pas dans la condition
    donc j'ai maintenant compris que pour le code initial cette condition ne sert à savoir que si le rx est bien au format du modèle à envoyé en paramètre.
    (c'est des données qui provient d'un bus CAN).

    Si par exemple j'ai ces paquet de données:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Standard ID: 0x080       DLC: 0  Data:-->
    Standard ID: 0x628       DLC: 3  Data:--> 0x00 0x00 0x00
    Standard ID: 0x196       DLC: 8  Data:--> 0x00 0xFF 0xE7 0x7F 0x70 0x38 0x0B 0x00
    Standard ID: 0x5D7       DLC: 7  Data:--> 0x00 0x00 0x07 0xA4 0x8C 0x00 0x00
    Standard ID: 0x155       DLC: 8  Data:--> 0x07 0x97 0xCE 0x54 0x5D 0x30 0x00 0x6D
    Standard ID: 0x196       DLC: 8  Data:--> 0x00 0xFF 0xE7 0x7F 0x70 0x38 0x0B 0x00
    Standard ID: 0x155       DLC: 8  Data:--> 0x07 0x97 0xCE 0x54 0x5D 0x30 0x00 0x6D
    Standard ID: 0x155       DLC: 8  Data:--> 0x07 0x97 0xCE 0x54 0x5D 0x30 0x00 0x6D
    Standard ID: 0x196       DLC: 8  Data:--> 0x00 0xFF 0xE7 0x7F 0x70 0x38 0x0B 0x00
    Standard ID: 0x155       DLC: 8  Data:--> 0x07 0x97 0xCE 0x54 0x5D 0x30 0x00 0x6D
    Standard ID: 0x155       DLC: 8  Data:--> 0x07 0x97 0xCE 0x54 0x5D 0x30 0x00 0x6D
    Standard ID: 0x155       DLC: 8  Data:--> 0x07 0x97 0xCE 0x54 0x5D 0x30 0x00 0x6D
    comment je me débrouille pour filtrer que les ligne "0x155" sans avoir à utiliser cette sorte de regex ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    %[flags][width][.precision][length]specifier
    récupérer que ces lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    Standard ID: 0x155       DLC: 8  Data:--> 0x07 0x97 0xCE 0x54 0x5D 0x30 0x00 0x6D
    Standard ID: 0x155       DLC: 8  Data:--> 0x07 0x97 0xCE 0x54 0x5D 0x30 0x00 0x6D
    Standard ID: 0x155       DLC: 8  Data:--> 0x07 0x97 0xCE 0x54 0x5D 0x30 0x00 0x6D

  4. #4
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 908
    Par défaut
    Attention pour écrire un nombre en binaire on commence par 0b. Par exemple sinon vous affectez mille onze en base 10. (si un nombre est noté directement en commençant par un 0 qui n'est pas suivi de la lettre b mais d'un chiffre alors la norme (du C et C++) c'est que c'est un nombre en base 8 (Octal).

    Dans vos exemples pour les paquets, on dirait que vous avez 2 octets qui sont un identifiant de la trame, suivi du nombre d'octets dans cette trame, suivi des données, puis un nouvel rxID et ça recommence et si je comprends bien vous ne voulez conserver que les paquets qui commencent par un rxId qui vaut 0x155, c'est cela?

    Pour ne pas courir le risque de confondre un rxId à 0x155 et deux octets de données dans une autre trame qui vaudraient 0x01 suivi de 0x55 il faut absolument décoder le protocole et donc le comprendre et ignorer les trames qui ne sont pas avec un rxID = 0x155

    y-a-t-il une séquence de démarrage pour se synchroniser?

  5. #5
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 632
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 632
    Par défaut C forever ?
    Bonjour,

    Citation Envoyé par keokaz Voir le message
    ...
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if((rxId & 0x80000000) == 0x80000000)     // Determine if ID is standard (11 bits) or extended (29 bits)
          sprintf(msgString, "Standard ID: 0x%.3lX       DLC: %1d  Data:", rxId, len);
    ...
    Bien connaître les expressions binaires est souvent utile en C.

    Ils auraient pu écrire également :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(rxId & 0x80000000)     // Determine if ID is standard (11 bits) or extended (29 bits)
          sprintf(msgString, "Standard ID: 0x%.3lX       DLC: %1d  Data:", rxId, len);
    Car avec un masquage avec & 0x80000000 la valeur résultante ne peut être que 0 ou 0x80000000. Or C considère que toute valeur non nulle est vraie...

    Plus simple encore avec des int en 32 bits car 0x80000000 = 231 en unsigned soit un nombre négatif si c'est un int;
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(rxId < 0)     // Determine if ID is standard (11 bits) or extended (29 bits)
          sprintf(msgString, "Standard ID: 0x%.3lX       DLC: %1d  Data:", rxId, len);
    Salutations

Discussions similaires

  1. Réponses: 5
    Dernier message: 09/01/2018, 19h51
  2. Réponses: 3
    Dernier message: 07/01/2018, 20h42
  3. Comment mieux écrire ces lignes ?
    Par cobolfingaz dans le forum C#
    Réponses: 5
    Dernier message: 16/02/2007, 10h02
  4. Réponses: 2
    Dernier message: 18/12/2006, 19h46
  5. Ces ligne sont elle équivalentes?
    Par Death83 dans le forum Langage
    Réponses: 3
    Dernier message: 26/09/2005, 22h48

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