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

Réseau C Discussion :

Comment dissocier des trames en réception ?


Sujet :

Réseau C

  1. #1
    Candidat au Club
    Homme Profil pro
    autre
    Inscrit en
    Juin 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : autre
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Comment dissocier des trames en réception ?
    Bonjour,

    Alors je vais essayer d'exposer au mieux mon problème. J'étudie actuellement un réseau Bluetooth en scatternet via un kit de développement. L'un de mes device est en passerelle et reçoit les données de deux autres devices en mode multiplex.

    Je m'explique : sur ce device différentes trames de données arrivent des autres modules connectés. Ces trames sont de la forme suivante :

    [8bits] de start of frame fixé à 0xBF
    [8bits] de link ID
    [6bits] frame flags tjrs a 0x00
    [10bits] taille des données
    [0-1023bits] Données
    [8bits] link Xor 0xFF

    Elles arrivent bien sur de façon aléatoire et s'entre-mêlent ! Bon les mots que j'utilise ne sont pas tres techniques ....
    Je vais essayer de donner un exemple : un materiel envoie le mot BONJOUR et un autre CIAO. A la réception les trames vont etre de la forme BF XX XX 03 BON XX / BF XX XX 04 CI AO XX / BF XX XX 04 JO UR XX

    Je voudrai pouvoir dissocier les trames en fonction donc du link ID puis recoller les morceaux pour les afficher. Alors c'est là que tout se corse !
    J'envisage donc de bufferiser les données pour ensuite découper la chaîne de donnée suivant le délimiteur 0xBF et par la suite extraire une sous-chaîne (DATA) de la chaine restante. Le code me semble tres lourd pour la tache à réaliser, je me demande donc si il n'y a pas d'autres moyens connus des développeurs ??!!! Ou peut etre que je me complique la tâche et que je ne cerne pas bien la problématique...

    Pouvez vous me conseiller sur la possibilité de ce choix ?

    Merci d'avance !!!

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 678
    Points
    13 678
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    La réponse à "comment stocker les données" dépend un peu de ce que tu veux en faire. Souhaites-tu seulement les afficher ou les converser pour plus tard ? Est-ce que chaque trame venant d'un appareil est indépendante des autres ou y a t-il des trames liées (comme ici, BON et JOUR sont séparés mais constituent en fait un seul message) ? D'autres champs des trames t'intéressent à part les données ?

    Tu veux afficher les trames mais à quel moment décideras-tu d'afficher ? Souhaites-tu afficher les trames au fur et à mesure ? Toutes les 10 trames reçues de chaque appareil ?

    Précise-nous un peu ton problème stp

  3. #3
    Membre confirmé
    Avatar de deletme
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2011
    Messages : 257
    Points : 519
    Points
    519
    Par défaut
    Salut,

    Peux tu te servir du flag de la trame pour indiquer la numéro de séquence de la trame ?

    Je m'explique : Tu pourrais t'en servir pour numéroter les trames quand l'information est découpé comme tu le présentes dans ton exemple.

    Suite à ça, une petite liste chainée par série de trames devrait faire l'affaire pour les parcourir. Il faudra cependant penser, dans le cas où tu es dans un environnement restreint en mémoire, à vider au fur et à mesure cette liste (au fur et à mesure de la lecture par exemple).

    Ce n'est peut-être pas la meilleure solution, mais c'est comme cela que j'aurai fait.

    Cdlt, deltme
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    - Martin Golding
    Traduction obligatoire : "Toujours écrire du code en gardant en tête que le mec qui en assurera la maintenance est un psychopathe violent qui connait votre adresse"

  4. #4
    Candidat au Club
    Homme Profil pro
    autre
    Inscrit en
    Juin 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : autre
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Je commence d'abord par vous remercier d'avoir pris le temps de me répondre !


    Pour ce qui est de stocker les données j'ai déjà un buffer circulaire dans le programme du PIC18 qui gère par interruption la lecture des données.
    Les trames de DATA sont les plus importantes mais la partie LINK_ID est aussi nécessaire pour pouvoir classer les données envoyées par chaque device.

    Une des voies est effectivement affichée et l'autre voie contient des données qui devront êtres mise en commun. Je vais essayer de vous schématiser un peu la totalité du problème:

    Disons que j'ai un matériel qui communique via bluetooth avec deux appareils de mesure. L'un prends la taille d'un objet et l'autre son poids. L'appareil qui réceptionne ces données contient un module bluetooth qui en mode multiplex a les trames suivantes

    [8bits] de start of frame fixé à 0xBF
    [8bits] de link ID
    [6bits] frame flags tjrs a 0x00
    [10bits] taille des données
    [0-1023bits] Données
    [8bits] link Xor 0xFF

    Donc les 8bits Link_ID me renseigne sur le module qui m'envoie les données ( soit longueur soit le poids) Seulement ces données arrivent par paquet qu'il faut reconstituer ! Et la longueur elle est affiché mais le poids lui est stocké .

    Je n'arrive pas trouver une fonction me permettant de découper correctement les trames pour que je puisse après les classées vu que leur taille varie tout le temps. Bien sur les 10 bits " taille des données " doivent me permettrent de résoudre mon problème mais je n'arrive a élaborer mon plan d'action

    J'ai peut être pas été très élégant dans la présentation de mon problème mais j'espère que vous me mettrez sur la bonne voie !!!!

    Encore un grand merci !

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 678
    Points
    13 678
    Billets dans le blog
    1
    Par défaut
    Il y a juste quelque chose qui me chagrine dans ton histoire, c'est la longueur du champ DATA. Il est possible que ce ne soit pas un multiple de 8 auquel cas ta trame ne rentre pas dans un nombre entier d'octets ? Que se passe t-il dans un tel cas ?

    Pour le mode op :
    - lire un char : START. On peut vérifier sa valeur et donc l'intégrité de la trame.
    - lire un char : LINK ID. On sait alors ce qu'on fera des données extraites.
    - lire deux char (C18 donne des int sur 16 bits non ? si oui, un int) : LENGTH + FLAGS. FLAGS est toujours à zéro donc on peut en sortir la longueur des données.
    - lire un nombre variable d'octets dépendant de LENGTH. Tu n'auras pas le choix. Attention à la remarque que j'ai émise au début du message.
    - lire un char : LINK XOR. Tu peux encore une fois vérifier la valeur et donc l'intégrité de la trame.

    Avec le LINK ID, tu sais d'où vient le message, tu peux donc l'afficher ou le stocker selon ton besoin. Pour la méthode de stockage, pas de solution appropriée sans un contexte clarifié, comme par exemple le nombre que tu dois en garder.

  6. #6
    Candidat au Club
    Homme Profil pro
    autre
    Inscrit en
    Juin 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : autre
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Oula oui désolé j'ai fait une faute grossière ! Les DATA sont en bytes et non en bits !!! Donc pas de problème de ce coté là.

    Là ou je pêche, c'est pour la découpe ... Comment séparer toute ces trames si elles varient ?
    Je vais faire une première approche aujourd'hui et mettre le code ce soir...

    Encore merci !

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 678
    Points
    13 678
    Billets dans le blog
    1
    Par défaut
    Elle varie mais tu sais comment, en lisant le champ LENGTH.

    Voici un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef unsigned char octet;
     
    int main(void)
    {
        octet frame[] = {0xBF, 0x01, 0x00, 0x04, 0x01, 0x02, 0x03, 0x04, 0xFF};
     
        octet start = frame[0];
        octet link_id = frame[1];
     
        octet msb = frame[2] & 0x04;
        octet lsb = frame[3];
        octet length = (msb << 8) + lsb;
     
        printf("0x%.2X | Frame from 0x%.2X, length 0x%.2X\n", start, link_id, length);
     
        for(size_t i=4; i < 4+length; i++)
            printf("0x%.2X ", frame[i]);
     
        octet link_xor = frame[4+length];
     
        return link_xor;
    }

Discussions similaires

  1. Réponses: 3
    Dernier message: 20/12/2013, 11h08
  2. comment obtenir des trames conditionnelles
    Par cpe81 dans le forum Excel
    Réponses: 12
    Dernier message: 08/07/2008, 12h52
  3. Comment dissocier le code des swing?
    Par chriscoolletoubibe dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 03/11/2006, 12h24
  4. Réponses: 3
    Dernier message: 18/07/2006, 14h37
  5. [langage] comment créer des fichiers ?
    Par Anonymous dans le forum Langage
    Réponses: 3
    Dernier message: 05/05/2002, 17h33

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