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 :

[QSerialDevice] Problème de parité


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 32
    Par défaut [QSerialDevice] Problème de parité
    Bonjour, je suis en train d'interfacer un 16F886 avec un PC à l'aide d'une liaison RS232.
    Je suis débutant avec Qt et assez peu à l'aise avec l'orienté objet donc j'espère ne pas avoir fait d'erreur grossière.

    J'utilise la bibliothèque QSerialDevice pour piloter le port série du PC.

    Afin de tester ma liaison série, mon µC émet la chaine de caractère "ABCD" suivie d'un line feed lors de sa mise sous tension (j'utilise le line feed comme caractère de fin de transmission, je n'ai pas mis en place de contrôle de flux matériel).

    Afin d'être sûr que mon µC transmet bien les données, j'ai effectué un cat /dev/ttyS0 dans un terminal. Lors de la mise sous tension, le µC envoie bien la chaîne "ABCD"+LF.

    Jusqu'ici, tout fonctionne.

    Maintenant, on en vient à mon programme Qt. J'ai créé une classe pour gérer ma liaison série.
    Voilà le code de l'initialisation du port série (je ne pense pas avoir fait d'erreur d'étourderie dans l'initialisation et j'ai vérifié que ces paramètres étaient bien correct en utilisant Termite sous windows) :
    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
    26
    27
    28
    29
    30
    31
    RS232::RS232(QObject *parent) : QObject(parent)
    {
        // Initialisation de la connexion série
        port = new AbstractSerial(this);
        connect(port, SIGNAL(readyRead()), this, SLOT(slotRead()));
        port->setDeviceName("/dev/ttyS0");
        if (!port->open(AbstractSerial::ReadWrite))
        {
            qDebug() << "Opening device error.";
        }
        if (!port->setBaudRate(AbstractSerial::BaudRate9600))
        {
            qDebug() << "Set baud rate " <<  AbstractSerial::BaudRate9600 << " error.";
        }
        if (!port->setDataBits(AbstractSerial::DataBits8))
        {
            qDebug() << "Set data bits " <<  AbstractSerial::DataBits8 << " error.";
        }
        if (!port->setParity(AbstractSerial::ParityEven))
        {
            qDebug() << "Set parity " <<  AbstractSerial::ParityEven << " error.";
        }
        if (!port->setStopBits(AbstractSerial::StopBits1))
        {
            qDebug() << "Set stop bits " <<  AbstractSerial::StopBits1 << " error.";
        }
        if (!port->setFlowControl(AbstractSerial::FlowControlOff))
        {
            qDebug() << "Set flow " <<  AbstractSerial::FlowControlOff << " error.";
        }
    }
    Et le code tout bête de la lecture du port série :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void RS232::slotRead()
    {
        QByteArray ba = port->readAll();
        qDebug() << ba.toHex();
    }
    Pour rappel :
    'A' = 0x41
    'B' = 0x42
    'C' = 0x43
    'D' = 0x44
    LF = 0x0A

    Le qDebug de la fonction slotRead devrait donc me donner comme résultat "414243440a". Au lieu de ça, je récupère de façon systématique "414200440a".



    Est-ce que quelqu'un a une idée de la source possible du problème que je rencontre ?


    Merci d'avance pour vos réponses.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 32
    Par défaut
    Désolé pour le dérangement, y'avait une erreur de calcul de parité dans mon programme embarqué (non prise en compte par Termite ni par le terminal (?)).

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 32
    Par défaut
    Haaaaaa, je vais finir par devenir fou avec ces transmissions de données !!!

    La routine du PIC pour vérifier la parité n'était pas fausse (d'où le fait que mon programme embarqué fonctionnait avec terminal et termit...)

    En fait, ce qui semble se passer c'est que quand je choisis une parité paire dans QSerialDevice, les bits de parité émis sont systématiquement à 0 et ceux qui sont reçu doivent systématiquement être à 0 pour que l'octet soit considéré comme valide (même si du coup le nombre de bit à 1 dans l'octet + le bit de parité est impaire).
    Et quand je choisis une parité impaire, le même phénomène se produit sauf que le bit de parité est forcé/doit être forcé à 1.

    Du coup, je me permet de refaire un copier/coller de mon code sous Qt pour que vous puissiez me dire si y'a quelque chose qui vous semble louche (et si quelqu'un qui a déjà utilisé cette bibliothèque avec un contrôle de parité pouvait me confirmer que ça devrait normalement fonctionner sans problème, ça serait cool)

    RS232.h
    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
    #ifndef RS232_H
    #define RS232_H
     
    #include <QObject>
     
    class AbstractSerial;
     
    class RS232 : public QObject
    {
        Q_OBJECT
     
        public:
            RS232(QObject *parent = 0);
            virtual ~RS232();
            void sendData();
        private :
            AbstractSerial *port;
        private slots:
            void slotRead();
    };
     
    #endif // RS232_H
    RS232.c
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    #include <QDebug>
    #include <QSerialDevice/QSerialDevice/abstractserial.h>
    #include "RS232.h"
     
    RS232::RS232(QObject *parent) : QObject(parent)
    {
        // Initialisation de la connexion série
        port = new AbstractSerial(this);
        connect(port, SIGNAL(readyRead()), this, SLOT(slotRead()));
        port->setDeviceName("/dev/ttyS0");
        if (!port->open(AbstractSerial::ReadWrite))
        {
            qDebug() << "Opening device error.";
        }
        if (!port->setBaudRate(AbstractSerial::BaudRate9600))
        {
            qDebug() << "Set baud rate " <<  AbstractSerial::BaudRate9600 << " error.";
        }
        if (!port->setDataBits(AbstractSerial::DataBits8))
        {
            qDebug() << "Set data bits " <<  AbstractSerial::DataBits8 << " error.";
        }
        if (!port->setParity(AbstractSerial::ParityEven))
        {
            qDebug() << "Set parity " <<  AbstractSerial::ParityEven << " error.";
        }
        if (!port->setStopBits(AbstractSerial::StopBits1))
        {
            qDebug() << "Set stop bits " <<  AbstractSerial::StopBits1 << " error.";
        }
        if (!port->setFlowControl(AbstractSerial::FlowControlOff))
        {
            qDebug() << "Set flow " <<  AbstractSerial::FlowControlOff << " error.";
        }
        if (!port->setCharIntervalTimeout(50))
        {
            qDebug() << "Set timeout error.";
        }
    }
     
    RS232::~RS232()
    {
        port->close();
    }
     
    void RS232::slotRead()
    {
        QByteArray ba = port->readAll();
        QString str(ba);
        qDebug() << "Donnees recues : " << str << " -> " << ba.toHex();
    }
     
    void RS232::sendData()
    {
        QString temp = "ABCD";
        temp.append(QChar(0x0A));
        QByteArray ba = temp.toAscii();
        qDebug() << "Donnees envoyees : " << temp << " -> " << ba.toHex();
        port->write(ba);
    }
    RS232::sendData est appelée lors d'un clic sur un pushButton.
    Le constructeur de RS232 est appelé par l'instanciation d'un objet RS232 dans mon MainWindow.
    La librairie a été compilée à partir du modèle BuildIntegratedLibrary.pro fournit avec les sources.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    ...donc si tu obtiens ce résultat "414243440a" avec la commande terminal cat /dev/ttyS0 ,
    et non pas celui-ci "414200440a" ,donc selon moi ,il y a peut-être , une petite erreur dans ta

    librairie RS232 .h , car , ton programme ne reconnait pas le mot binaire "C",
    au moment de la lecture sur le port Série ,par l'instruction readAll() .
    ...
    Dernière modification par Invité ; 12/09/2010 à 13h13. Motif: QSerialDevice -> RS232.h

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 32
    Par défaut
    Dans mon RS232.h ou dans la librairie qui gère le port série ?

  6. #6
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    (...)
            void sendData();
            private :
            AbstractSerial *port;
    (...)
    La librairie ,qui gére le port série RS232 ,le AbstractSerial...
    ...

Discussions similaires

  1. [QSerialDevice] Problème d'écriture
    Par Action Fighter dans le forum Bibliothèques
    Réponses: 1
    Dernier message: 07/02/2011, 10h47
  2. Problème d'installation oracle 8.1.7 sous NT
    Par Anonymous dans le forum Installation
    Réponses: 7
    Dernier message: 02/08/2002, 14h18
  3. Problème d'impression
    Par IngBen dans le forum C++Builder
    Réponses: 7
    Dernier message: 22/05/2002, 11h37
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10
  5. Réponses: 6
    Dernier message: 25/03/2002, 21h11

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