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 Discussion :

Envoyer une trame en hexadécimal par wifi


Sujet :

Réseau

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Novembre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2015
    Messages : 9
    Points : 3
    Points
    3
    Par défaut Envoyer une trame en hexadécimal par wifi
    Bonjour,

    Je veux envoyer des trame en hexa d'un fichier par wifi, actuellement j'ai reussi a faire la connexion Wifi entre mon IHM et la carte STM32..maintenant il me reste d envoyer juste les trames mais pas le fichier ( parceque la carte n accepte que des trames) ..comme vous voyez dans le screen .. il faut quand je clique sur start ..les trames affichées doivent etre envoyer aux ancres connectées.

    En espérant que vous puissiez m'aider, je vous remercie d'avance pour vos réponses.
    Images attachées Images attachées  

  2. #2
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Points : 421
    Points
    421
    Par défaut QTcpSocket
    Bonjour,

    QTcpSocket devrait faire l'affaire pour un simple envoi de donné.

    Voici un exemple d'utilisation asynchrone:

    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
     
    // .h
    ------------------------------
    class MyClass: public QObject {
    ...
        Q_OBJECT
    public: 
        MyClass(QObject *parent = 0);
    private:
        QTcpSocket m_socket;
    private slots:
        void onTcpError(QAbstractSocket::SocketError e);
        void onConnected();
    signals:
        void error(QString error);
    ...
     
    //.cpp
    ------------------------------
    MyClass::MyClass(QObject *parent) : QObject(parent)
    {
        connect(&m_socket, SIGNAL(error(QAbstractSocket::SocketError)),
                this, SLOT(onTcpError(QAbstractSocket::SocketError)), Qt::DirectConnection);
        connect(&m_socket, SIGNAL(connected()), this, SLOT(onConnected()), Qt::DirectConnection);
    }
     
    void MyClass::send(const QByteArray &data){
        if(m_socket.isOpen){
            socket.write(data);
        } else {
            m_hexdata = data;
            socket.connectToHost(<ip_address>, <port>);
        }
    }
     
    void MyClass::onTcpError(QAbstractSocket::SocketError e)
    {
        Q_UNUSED(e)
        QTcpSocket *s = qobject_cast<QTcpSocket *>(sender());
        if(s)
            emit error(s->errorString());
    }
     
    void MyClass::onConnected()
    {
        //Connecté !, envoi des donnée
        m_socket.write(m_hexdata);
    }
    Si des donnée doivent être reçues en retour, il faut utiliser le signal QTcpSocket::readyRead() qui indique lorsque des données sont disponible en lecture.
    Notez qu'il est possible d'utiliser QTcpSocket en mode synchrone. c'est la méthode que j'utilise en général, en voici un exemple avec l'utilisation (simplifié) de QRunnable pour exécuter l'envoi dans un thread différent:
    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    //.h
    //-------------------------------------------
    class MyTask : public QObject, public QRunnable
    {
        public:
            MyTask(const QHostAddress &address, int port, const QByteArray &data, QObject *parent = 0);
        private:
            const QByteArray m_data;
            const QHostAddress m_address;
            const int m_port;
            int m_timeout;
            bool m_connected;
     
        signals:
            void error(const QString &error);
            void result(bool ok);
     
        private slots:
            void onTcpError(QAbstractSocket::SocketError e);
            void onConnected();
    }
     
    //.cpp
    //-------------------------------------------
    MyTask::MyTask(const QHostAddress &address, int port, const QByteArray &data, QObject *parent)
     : QObject(parent), m_address(address), m_port(port), m_data(data), m_timeout(5000)
    {    
    }
    void MyTask::run()
    {
        QTcpSocket socket;
        QByteArray data;
        QByteArray response;
        bool ok = false;
        //CONNECT
        connect(&socket, SIGNAL(error(QAbstractSocket::SocketError)),
                this, SLOT(onTcpError(QAbstractSocket::SocketError)), Qt::DirectConnection);
        connect(&socket, SIGNAL(connected()), this, SLOT(onConnected()), Qt::DirectConnection);
     
        socket.connectToHost(m_address, m_port());
     
        //WAIT CONNECTED
        QElapsedTimer t;
        t.start();
        //Wait socket is connected using connected() signal.
        //on Windows, waitForConnected() does not seem to work
        //So it a good occasion to provide "smooth" progress monitoring    
        while(!m_connected && (t.elapsed() < m_timeout)){
            QGuiApplication::processEvents(QEventLoop::AllEvents, 10);
        }
        if(m_connected){
            //Write        
            socket.write(data);        
            //Attente de la réponse, si nécessaire. 
            t.restart();            
            while(socket.waitForReadyRead(m_timeout) || !ok){
                response.append(socket.readAll());
                ok = response.size() > 1; //taille minimum de la réponse
            }
        } else {
            emit error(socket.errorString());
        }
     
        if(!ok){
            emit error("Timeout occur when waiting for response");
        }
        emit result(ok);
        if(socket.state() == QAbstractSocket::ConnectedState){
            socket.disconnectFromHost();
            socket.waitForDisconnected();
        }
    }
     
    void MyTask::onTcpError(QAbstractSocket::SocketError e)
    {
        Q_UNUSED(e)
        QTcpSocket *s = qobject_cast<QTcpSocket *>(sender());
        if(s)
            emit error(s->errorString());
    }
     
    void MyTask::onConnected()
    {
        m_connected = true;
    }
     
    //Utilisation
    MyTask *task = new MyTask(address, port, data);
    task->setAutoDelete(true);
    connect(task, SIGNAL(error(QString)), this, SIGNAL(onSendDataError(QString)));
    connect(task, SIGNAL(result(bool)), this, SLOT(onSendDataResult(bool)));
    QThreadPoool::globalInstance()->start(task);
    Notez que les codes ci-dessus ont été simplifié de code existant dans un simple éditeur de texte et n'ont pas été compilé donc il peut y avoir quelques erreurs. C'était surtout dans le but de vous montrer l'idée générale.

    Je vous recommande la doc de QTcpSocket, QAbstractSocket ainsi que Qt Network Programming. Qt fourni aussi pas mal d'exemple pour la communication réseau qui peuvent peut être vous aider

  3. #3
    Candidat au Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Novembre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2015
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Voila je vais vous expliquer exactement ce que je veux faire, comme vous voyez sur le screen : j ai des trames et je veux les envoyer aux ancres en utilisant le bouton START, pour la connexion j'ai reussi a connecter mon IHM aux ancres mais en UDP ( plus rapide).

    donc j'ai la connexion wifi + le fichier HEX ( les trames) ...il me manque juste l'activation du bouton start

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void MainWindow::on_start_pressed()// Tentative de connexion au serveur
    {
        for( unsigned int listAnch=1;  listAnch<=NbAnchor; listAnch++ )
        {
            if(Connected[listAnch] == CONNECTED)
            {
     
            }
     
    }
    ca c pour cherger le fichier qui contient les trames

    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
    //............................................................Add fichier s-record.......................................................................//
    void MainWindow::on_add_clicked()
    {
        QString filePath = QFileDialog::getOpenFileName(this, tr("Open File"), "", //ouvrir une boite de dialog et choisir le fichier
                    tr("Text Files (*.srec);;C++ Files (*.cpp *.h)")); //fihier .hex
     
        if (!filePath.isEmpty())
        {
            QFile file(filePath);
            QFileInfo info(file);
     
            if (!file.open(QIODevice::ReadOnly))  // pour ouvrir le fichier
            {
                QMessageBox::critical(this, tr("Error"), // dans le cas ou on peut pas ouvrir le fichier
                    tr("Could not open file"));
                return;
            }
     
            QString contents = file.readAll().constData(); //lire la DATA
            ui->FichierHEX->setText(info.fileName()); //AFFICHAGE titre
            ui->contenuHEX->setText(contents); //AFFICHAGE trame
     
        }
    }
    voila je sais que c pas un gros probleme mais je ne sais pas comment faire appeler les trames / connexion / ancres dans un bouton ( je suis debutant en QT)

  4. #4
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Points : 421
    Points
    421
    Par défaut
    Avec l'UDP il peut y avoir des pertes de données, je ne sais pas si c'est acceptable dans votre application.

    Pour connecter un bouton:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //Constructeur de MainWindow (ou autre widget)
    connect(ui->button1, &QPushButton::clicked, this, &MainWindow::onButton1Clicked);
    //.h
    private slots: 
    void onButton1Clicked();

  5. #5
    Candidat au Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Novembre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2015
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Oui je suis d'accord mais je peux changer ca par la suite ..je vais faire un test avant avec l UDP

  6. #6
    Candidat au Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Novembre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2015
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    VOILA LE SCREEN
    Images attachées Images attachées  

Discussions similaires

  1. Envoyer une trame sur port USB
    Par Bocci dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 15/03/2007, 21h07
  2. Envoyer une télécopie sans passer par l'assistant de télécopie
    Par therouxy dans le forum Composants VCL
    Réponses: 5
    Dernier message: 09/10/2006, 11h05
  3. [Mail] Envoyer une copie d'écran par mail
    Par Greggggggg dans le forum Langage
    Réponses: 3
    Dernier message: 08/09/2006, 00h16
  4. [USB]envoyer une trame sur le port USB
    Par ced38100 dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 03/11/2005, 12h54
  5. [Réseau] Envoyer une trame tcp
    Par heid dans le forum Web & réseau
    Réponses: 5
    Dernier message: 18/07/2005, 13h07

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