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

C Discussion :

Conversion pour réduire la taille d'une trame


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 171
    Par défaut Conversion pour réduire la taille d'une trame
    Bonjour, pour un projet je recupere des trames de la forme suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //Date, Heure, Latitude, Longitude, Nombre de satellites captes, Altitude, Temperature 1, Temperature 2
     
    => 70618,93101,Lat:50.103366,Long:14.391946,NbSat:12,Alt:250,T1:27.443226,T2:26.556774 <=
    => 70618,93112,Lat:50.103366,Long:14.391901,NbSat:12,Alt:254,T1:27.362640,T2:25.267401 <=
    => 70618,93123,Lat:50.103348,Long:14.391873,NbSat:12,Alt:256,T1:27.120874,T2:25.106226 <=
    Je souhaite reduire la taille de cette trame et j'ai les contraintes suivantes:

    The Longitude, latitude, and elevation were obtained from GGA sentence.
    The longitude and Latitude were firstly transformed to degrees (<0,360)
    degrees) and then represented by 3 bytes unsigned fixed-point number.
    number, 0 deg corresponds to 0x000000 and 360 deg to 0x1000000.
    The altitude was rounded to meters and transmitted by two bytes number.
    The range is 0 to 65536 meters.
    J'ai deja recupere les GGA sentences et je les ait converties en degres.

    Maintenant j'aimerais faire la conversion pour que la latitude et la longitude tiennent sur 3 bytes et que l'altitude tienne sur 2 bytes. Je vois bien que je vais devoir faire une table de 3 (enfin je pense) mais une fois que j'aurais, admettons une latitude convertie en 0x038765 (juste un exemple), je ne vois pas dans quel type de variable le stocker ni comment l'ecrire pour qu'il prenne reellement un taille de 3 bytes

    Enfin comme vous voyez c'est un peu confus pour moi a partir du moment ou je dois convertir en byte, auriez vous des pistes, solutions ?

    Merci

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Généralement, un type au byte près, ça veut dire des données binaires brutes.
    En gros, un tableau de unsigned char dans lequel tu écris au fur et à mesure (renseigne-toi sur le boutisme (endianness) des nombres, aussi).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Tu souhaites transmettre un flux (réseau ? fichier ?). Ce flux est constitué d'octets.
    Pour construire la valeur sur 3 octets, tu as pleins de solutions. Tu peux par exemple utiliser un int sur 4 octets mais tu vas t'assurer que la valeur stockée ne dépasse pas la valeur max de 3 octets.
    Ensuite, tu vas écrire les 3 octets dans le flux en faisant un décalage de bit et un masque :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int entier = 342;
    unsigned char octet1 = entier & 0xFF;
    unsigned char octet2 = (entier >> 8) & 0xFF;
    unsigned char octet3 = (entier >> 16) & 0xFF;
    EDIT : trop lent
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 171
    Par défaut
    Salut, merci pour vos reponses.

    Je veux transmettre un message via l'uart de mon microcontrolleur (stm32l152re) qui est connecte a un module Sigfox et ce dernier n'accepte "que" des messages de 12 octets.

    Parmi ces 12 octets le debut de ma trame doit etre:
    -3 octet pour la longitude
    -3 octet pour la latitude
    -2 octet pour l'altitude (elevation)

    Je recupere ces donnees via un module GPS (neo 6m).

    La longitude est exprimee en degree de -90 a 90.
    La latitude est exprimee en degree de -180 a 180.
    L'altitude est exprimee en metres de 0 a ?? (au moins 50 000) car le gps va etre envoye dans la stratosphere)

    Par exemple pour le cas de l'altitude, j'aimerais que -180 degres corresponde a la valeur 0x000000 et que +180 degres corresponde a 0xFFFFFF

    Je vois pas trop le rapport entre ce que je viens de decrire les "unsigned", je suis oblige de faire un decalage de flux et un masque?
    Je peux pas directement convertir mes valeurs?

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Tu veux représenter [-180, 180] sur [0,16777215], donc sur une valeur non signé.
    C'est une simple projection, il faut résoudre ANGLE = A * NOMBRE pour retrouver ton angle à partir du nombre envoyé sur le réseau, et bien entendu NOMBRE = ANGLE / A pour trouver le nombre correspondant à l'angle.
    Et vu que tu connais les valeurs pour -180 et 180, c'est une équation de niveau collège(?) à résoudre pour le coefficient.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 171
    Par défaut
    Salut, effectivement le probleme ce n'est pas l'equation mais plutot la mise en pratique au niveau des variables, j'ai ecris cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    char str_frame[7];
    void sigfox_send_frame(long latitude, long longitude, uint16_t altitude)
    {
    	double lat_precision = 360/0xFFFFFF;
    	double long_precision = 180/0xFFFFFF;
    	double alt_precision = 65536/0xFFFF;
     
    	unsigned long lat_unsigned = lat_precision*latitude;
    	unsigned long long_unsigned = long_precision*longitude;
    	unsigned int alt_unsigned = alt_precision*altitude;
    	sprintf(str_frame,"AT$SF=%lu%lu%u\r",lat_unsigned,long_unsigned,alt_unsigned);
    	UART_puts(UART3_ID, (uint8_t*)str, sizeof(str));
    }
    Rien qu'au debut mes variables "precision" me retourne 0. Je pourrais remplacer les 0xFFFFFF par des nombres reels (16 777 215) mais je veux que dans str_frame, le resultat soit du genre: "AT$SF=1010AF0101FA4532\r" et non pas des nombres entiers.

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Rien qu'au debut mes variables "precision" me retourne 0.
    Tu fais des divisions entières donc oui tes résultats valent 0..
    Je pourrais remplacer les 0xFFFFFF par des nombres reels (16 777 215)
    Ce qui n'a strictement aucun intérêt et ne changerait rien, sauf à lire des nombres décimaux si t'es plus à l'aise avec.

    Le but c'est de sérialiser/compresser des valeurs flottantes avec une virgule fixe (technique classique de sérialisation et compression).
    Si je décide de sérialiser avec 1 décimal, je prends ma valeur, la multiplie par 10, et je peux couvrir les valeurs [0, 180] avec une précision à 0.1 par un intervale [0, 1800].
    Je ne vois pas comment l'expliquer plus clairement à ce stade..

    je veux que dans str_frame, le resultat soit du genre: "AT$SF=1010AF0101FA4532\r"
    D'où sort ce résultat et que signifie-t-il ?

    et non pas des nombres entiers.
    L'énoncé stipule clairement que tu dois sérialiser sur des valeurs non signées. Qu'espères-tu avoir d'autre que des nombres entiers ?!

    Et d'où sort ce format texte de trame ? Pourquoi ne pas simplement manipuler du binaire ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

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

Discussions similaires

  1. Utiliser l'api GDi+ pour réduire la taille d'une image
    Par deepshark dans le forum WinDev
    Réponses: 3
    Dernier message: 04/06/2010, 09h31
  2. Possibilités pour réduir la taille d'une BDD
    Par farenheiit dans le forum Administration
    Réponses: 6
    Dernier message: 04/06/2009, 16h50
  3. Réponses: 2
    Dernier message: 09/06/2006, 14h49
  4. Réduire la taille d'une Lite déroulante, mais ...
    Par Joe Le Mort dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 18/05/2006, 15h17
  5. [Oracle 8i] réduire la taille d'une base de test
    Par delphim dans le forum Oracle
    Réponses: 2
    Dernier message: 04/07/2005, 11h59

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