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

Qt Discussion :

Conversion caractère spécial en ascii


Sujet :

Qt

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 63
    Points : 51
    Points
    51
    Par défaut Conversion caractère spécial en ascii
    Bonjour à tous!

    J'ai un soucis de dernière minute lors du test de mon appli.
    Je dois comparer une chaine de caractère avec un code ascii saisi en décimal.
    Exemple: 05 qui correspond à ENQ.
    Je voudrais comparer ceci avec une lettre QString par exemple mais je m'en sors pas avec les conversions.
    (entre QbyteArray, toAscii...)
    J'avoue que je suis perdu ...
    Quelqu'un a une idée?

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Points : 969
    Points
    969
    Par défaut
    Désolé, je comprends pas ta question.

    Essaie de nous donner un bout de code et de détailler un peu plus.

    G.
    Un problème avec Qt ? Vous trouverez votre réponse ici : http://doc.trolltech.com/4.6/overviews.html
    En français (traduction réalisée par l'équipe Qt de DVP) : http://qt.developpez.com/doc/4.6/vues-d-ensemble/

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 63
    Points : 51
    Points
    51
    Par défaut
    Salut,

    Effectivement c'est pas très compréhensible!
    En fait, je bufferise des trames arrivées sur un port série jusqu'à l'arrivée d'un certain caractère qui désigne la fin de trame.

    Ce caractère est configuré d'avance car il est récupéré depuis un fichier en valeur décimale du code ascii.

    Donc par exemple si j'ai "10", il s'agit du retour chariot, si j'ai "66", il s'agit de la lettre "B"...

    Mon problème: (Que je n'ai toujours pas réussi à résoudre malgré toutes mes recherches)

    Vu que les émissions séries sont un peu instables,je récupère chaque caractère de ma trame un à un et le compare avec ce caractère de fin (pour savoir quand je sors de ma boucle)
    Le caractère que je récupère est un QString.
    Je peux facilement le convertir grâce à la méthode toAscii() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    QString carRecup;
    carRecup.toAscii(); // Logiquement le caractère est en Ascii
    J'ai donc la boucle suivante sur la variable TrameRecue (de tête à peu près):
    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
     
    int cptCar; //Compteur de la boucle de comparaison
    QString TrameRecue; //Trame en entrée du port série
    Qstring TrameRecomp; //Trame recomposée des caractères reçus
    Qstring CarBoucle; // Caractère de chaque itération
    QString CarFin; //Caractère qui désigne la fin de la trame récupéré d'un fichier texte
     
     
    //Boucle de comparaison
     
    for (cptCar=0; cptCar<TrameRecue.length();cptCar++){
     
    CarBoucle = TrameRecue.mid(cptCar,1); //Récupération du caractère
    TrameRecomp = TrameRecomp.append(CarBoucle); // Ajout du dernier caractère reçu à la trame
     
    if (CarBoucle == CarFin){ //Ici est tout mon problème :(
    //Traitement de fin de trame
    }
     
    }
    J'aurais voulu faire un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if (CarBoucle.toAscii() == CarFin.toAscii()){
    //Traitement...
    }
    Mais je n'arrive jamais à mon traitement puisque en mode pas à pas un CarFin.toAscii() me donne tout simplement la même chose. Si c'était la valeur "10", je retrouve la valeur "10"...

    Voilà, et vu que j'ai un peu tout essayé je bloque...

    En espérant être un peu plus clair que sur mon premier post.
    Toute aide est la bienvenue

  4. #4
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 63
    Points : 51
    Points
    51
    Par défaut
    Bonjour,

    Hier j'ai encore cherché un moyen d'effectuer ma comparaison.
    Je me suis dit que j'allais un peu oublier le code ASCII et comparer en hexa.
    Cependant j'ai quelques incompréhensions...

    Tout d'abord, je stocke la valeur décimale du caractère de fin de trame dans un long.
    Ensuite, grâce à la méthode QString::number(CarFin,16) je récupère la valeur hexa de cette valeur décimale (d'après ce que j'ai compris)
    Elle est stockée dans une chaine QString :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QString StrCarFin = QString::number(CarFin,16);
    Et lorsque j'arrive à ma comparaison, je fais une conversion de ma chaine en cours :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     if (CarBoucle.toAscii().toHex() == StrCarFin) {
    }
    Pour moi il s'agit d'une comparaison de deux chaines de caractères qui contiennent un code hexa.
    C'est un petit peu tordu, mais cette comparaison marche... Pour des valeurs décimales > 15 !!

    En effet, pour les valeurs <15, le code héxa renvoyé dans la chaine StrCarFin supprime le "0" devant!
    Par exemple, la valeur 13 qui est le retour chariot devrait renvoyer "0d" mais il renvoie seulement "d".
    Par contre, CarBoucle.toAscii().toHex() renverra bien "0d" si il tombe sur un retour chariot.

    On arrive donc à une comparaison if ("0d" == "d") ce qui ne marche évidement pas.
    Déjà est-ce que quelqu'un sait pourquoi?

    Donc ayant identifié ce problème j'ai fait une fonction qui rajoute le "0" devant les correspondances Hexa des valeurs décimales inférieures ou égales à 15.

    Ca marche pour les différents tests que j'ai fait mais je trouve ça super moche!
    Personne n'a déjà été confronté à ce problème de conversion?
    J'avoue que deux trois conseils me seraient utiles...

  5. #5
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Pourquoi ne pas comparer les valeurs entières plutôt ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (CarBoucle[0] == CarFin) ...

  6. #6
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 63
    Points : 51
    Points
    51
    Par défaut
    Tu veux dire récupérer CarFin en int et le comparer à CarBoucle?

    Pourquoi ne pas comparer les valeurs entières plutôt ?
    Car pour cela je dois convertir CarBoucle (il s'agit d'un Qstring) et la conversion CarBoucle.toInt(&ok, 10) ne marche pas.

    J'y avais pensé mais ça s'est révélé sans succès...

  7. #7
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Oui, cela devrais fonctionner, chez moi ceci passe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    long CarFin = 13;
    QString CarBoucle("0d");
    if (CarBoucle.toInt(0, 16) == CarFin)
        ...

  8. #8
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 63
    Points : 51
    Points
    51
    Par défaut
    Oui ça fonctionne parce que en déclarant ceci :

    QString CarBoucle("0d");
    Le "0d" correspond déjà à un code Hexa.

    Hors les caractères qui arrivent dans CarBoucle sont des lettres. (genre A,B...) donc la conversion ne passe pas puisque pas de correspondance.

  9. #9
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Points : 969
    Points
    969
    Par défaut
    Comment faire compliqué quand on peut faire simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char fin = 67;//nombre que tu lis dans ton fichier (ici 67 correspond à "C")
    //si tu lis un int ou un long, tu peux le caster
    QString stringFin = QString::fromAscii(&fin,1);//Je crée un QString (Unicode) à partir de cette valeur Ascii
    	//...
    QString charLu = "C";// Caractère lu sur le port série (converti en QString, donc codé en Unicode)
     
    if(charLu == stringFin)
    	qDebug()<<"Fin de trame";
    G.
    Un problème avec Qt ? Vous trouverez votre réponse ici : http://doc.trolltech.com/4.6/overviews.html
    En français (traduction réalisée par l'équipe Qt de DVP) : http://qt.developpez.com/doc/4.6/vues-d-ensemble/

  10. #10
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    ca me parait super compliqué la manière dont tu veut faire...
    vue que ton QByteArray contiens des valeur en hexa, tu peut utiliser
    http://qt.developpez.com/doc/4.7/qbytearray/#fromhex à chaque nouvelle données reçus.

    Tu peut utiliser http://qt.developpez.com/doc/4.7/qbytearray/#split pour splitter ton QByteArray. En gros le dernier élément de list correspond au buffer à utiliser aprés le split.

    cela donnerai un truc comme cela
    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
    QByteArray m_buffer;
     
    ...
    QList<QByteArray> readNewData()
    {
        //on accumule les donnée sous forme binaire et non hexa
        m_buffer +=  QByteArray::fromHex( portCom.readAll());
     
        //split le buffer en fonction du caractère de fin
        QList<QByteArray> lb = m_buffer .split(...);
     
        //le dernier élément correspond au données qu'il faut garder dans le buffer
        m_buffer = lb.last();
     
        //on vire le dernier éléments
        lb.pop_back();
     
        //on retourne la list des trame lue.
       retrun lb;
    }
    [edit]
    vue que tu envoie les données en hexa, il faut lire un nombre de données multiple de 2 sinon la conversion hexa => binaire sera foireuse.

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

Discussions similaires

  1. Conversion caractère spécial
    Par nsqualli dans le forum Cobol
    Réponses: 4
    Dernier message: 23/05/2012, 16h10
  2. conversion Caractère vers ASCII
    Par tobba dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 09/11/2010, 18h44
  3. caractère spécial (ASCII étendu)
    Par Peanut dans le forum C#
    Réponses: 12
    Dernier message: 23/04/2008, 16h34
  4. Conversion caractère ascii
    Par Bass_Room dans le forum C
    Réponses: 9
    Dernier message: 25/04/2007, 17h30
  5. Réponses: 2
    Dernier message: 30/05/2006, 08h04

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