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 :

Récupérer le buffer de ReadFile-Comm UART


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2015
    Messages : 75
    Par défaut Récupérer le buffer de ReadFile-Comm UART
    Bonjour tt le monde,

    J'ai besoin de vos aides si c possible SVP.

    Je suis entrain de programmer un petit code qui communique avec une carte électronique (carte de comptage de puissance) pour récupérer les valeurs mesurées.
    La communication se fait sur le port UART. Le problème que je n'arrive pas à récupérer le buffer de ReadFile.
    Sachant que j'ai branché un oscillo lorsque j'ai lancé le programme pour voir ce qui se passe. Et comme j'ai dit l'envoie de la trame s'effectue correctement et sur l'oscillo j'arrive à visualiser le message qui doit être retournée
    mais mon programme affiche: Buffer vide.
    J'arrive pas à trouver ma faute. Si quelqu'un pourra m'aider SVP.

    Merci d'avance
    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
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    #include <winbase.h>
    #include <conio.h>
    #include <string.h>
     
     
    void main(void)
    {
        int Erreur;
     
     
     
        Erreur = InitCom("\\\\.\\COM50", "Aucune", "9600", "8", "1");
        if (Erreur!=0) //périphérique initialisé correctement
        {
            printf("périphérique initialisé correctement \n");
              //Envoie de la chaine
            EnvoiChainePort("82 FF FF FF", "\\\\.\\COM50");
     
            // recevoir le chaine lus
            RecevoirPort ("\\\\.\\COM50");
     
     
     
        }
        else
        {
             printf("Erreur lors de la configuration %d. \n", GetLastError());
        }
     
    }
     
                 /*Configuration du port série */
    int InitCom( char *pcCommPort, char *Parite, char *Vitesse, char *TailleData, char *StopBit)
    {
     
        //Initialisation
        DCB dcb;
        HANDLE hCom;
        BOOL fSuccess; // Tout est bien passé
     
        //Ouverture du port Comm
        hCom= CreateFile ( pcCommPort,
                          GENERIC_READ|GENERIC_WRITE, //accés lecture/ecriture
                          0, //pas de partage possible du port une fois ouvert
                          NULL, //pas d'héritage
                          OPEN_EXISTING, //doit etre open_existing
                          0, // pas d'overlopped I/O
                          NULL //hTemplate doit etre null
                     );
        // Vérifier si handle ouvre correctement
        if (hCom ==INVALID_HANDLE_VALUE)
        {
            //Manipuler l'erreur
            printf("Create file failed with error %d\n", GetLastError());
            return (1);
     
        }
        //Lecture de configuration initiale
        fSuccess = GetCommState (hCom, &dcb);
        if (!fSuccess)
        {
     
             //Manipuler l'erreur
            printf("GetCommState failed with error %d\n", GetLastError());
            return (2);
     
        }
        //Configuration du port
        dcb.BaudRate= atoi(Vitesse); // gestion de vitesse . atoi:Convertir String to integer
        dcb.ByteSize= atoi(TailleData); //gestion de la taille
        /*Gestion de la partité*/
        if (strcmp (Parite, "Aucune")==0) //strcmp : si égaux renvoie 0
            dcb.Parity=NOPARITY; // pas de parité
        if (strcmp (Parite, "Paire")==0)
            dcb.Parity=EVENPARITY;
        if (strcmp (Parite, "Impaire")==0)
            dcb.Parity=ODDPARITY;
        /* Gestion bit de Stop*/
        if (strcmp (StopBit, "1")==0)
            dcb.StopBits= ONESTOPBIT; // 1 bit stop
        if (strcmp (StopBit, "1.5")==0)
            dcb.StopBits= ONE5STOPBITS; // 1.5 bit stop
        if (strcmp (StopBit, "2")==0)
            dcb.StopBits= TWOSTOPBITS; // 2 bit stop
     
        //Configurer le port
        fSuccess = SetCommState(hCom, &dcb);
        if (!fSuccess)
        {
            //Manipuler l'erreur
            printf("SetCommState failed with error %d\n", GetLastError());
            return (3);
        }
        //Fermer le port
        CloseHandle(hCom);
        return (fSuccess);
        }
     
     /*Ecriture sur un port série */
     
     
    int EnvoiChainePort(char *chaine, char *pcCommPort)
    {
     
     
        HANDLE hCom;
        BOOL fSuccess;
        int NbOctet;
     
        unsigned long nBytesWrite;
     
     
     
        // Ouverture du port de communication
        hCom= CreateFile ( pcCommPort,
                          GENERIC_READ|GENERIC_WRITE, //accés lecture/ecriture
                          0, //pas de partage possible du port une fois ouvert
                          NULL, //pas d'héritage
                          OPEN_EXISTING, //doit etre open_existing
                          0, // pas d'overlopped I/O
                          NULL //hTemplate doit etre null
                     );
     
     
        NbOctet= strlen(chaine);
        //Ecrire dans le fichier
        WriteFile(hCom,chaine, 4, &nBytesWrite, NULL);
        //Fermer le handle de Com
        CloseHandle(hCom);
     
        return fSuccess;
     
     
    }
     
     
                    /* Lecture sur un port série */
     
     
    BOOL RecevoirPort (char *pcCommPort)
    {
       DCB dcb;
       HANDLE hCom;
       BOOL fSuccess;
       BOOL bResult;
       COMMTIMEOUTS tTimeout;
      char *inBuffer="NULL";
       int TimeoutRead;
       unsigned long nBytesRead;
     
     
     
     
     
     
       // Initialisation des variables
       inBuffer= malloc(200); // Réservation mémoire pour le buffer de récéption
       nBytesRead=0;
       // Ouverture du port de communication
        hCom= CreateFile ( pcCommPort,
                          GENERIC_READ|GENERIC_WRITE, //accés lecture/ecriture
                          0, //pas de partage possible du port une fois ouvert
                          NULL, //pas d'héritage
                          OPEN_EXISTING, //doit etre open_existing
                          0, // pas d'overlopped I/O
                          NULL //hTemplate doit etre null
                     );
     
        //Définition des timeouts
        TimeoutRead=500; // timeout de 1000ms
        tTimeout.ReadIntervalTimeout= MAXWORD;
        tTimeout.ReadTotalTimeoutMultiplier=0;
        tTimeout.ReadTotalTimeoutConstant=TimeoutRead;
        tTimeout.WriteTotalTimeoutMultiplier=0;
        tTimeout.WriteTotalTimeoutConstant=0;
     
        //Configuration du Timeout
        SetCommTimeouts(hCom, &tTimeout);
     
        /* Boucle d'attente de lecture des octets */
     
        bResult=ReadFile(hCom, inBuffer, 4096, &nBytesRead, NULL); //4096: maximum of bytes to be read
     
     
       if (nBytesRead<=0) // pas des octets lus
            printf("Buffer est vide: %s", inBuffer);
       else
     
            printf(" Chaine reçue est : %s", inBuffer);  //Retourner la choine reçue.
     
        //fermer le port
        CloseHandle(hCom);
        //Libérer la mémoire
        free(inBuffer);
        return (fSuccess);
    }

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Wow, je vois surtout ici une comédie d'erreurs.
    Certaines ne sont pas immédiatement graves:
    • Tu sembles ne pas avoir de notion de ce qu'est un pointeur const
    • Convention de nommage discutables (variables locales et paramètres commençant par une majuscule, ce qui est d'ordinaire réservé aux classes et fonctions)
    • Inclusion inutile de <conio.h>


    D'autres sont plus dangereuses:
    • Tu passes une taille fixe dans ton appel à WriteFile(), qui peut envoyer n'importe quoi si la chaîne fait moins de 3 caractères
    • Tu alloues un buffer de 200 octets mais tu passes un maximum de 4096 octets à ReadFile()
    • Tu affiches les données reçues en tant que chaîne de caractères C mais sans t'assurer de la présence d'un caractère nul terminal
    • Tu utilises GetLastError() pour SetCommState(), mais pas pour WriteFile() / ReadFile(), dont tu n'utilises pas la valeur de retour
    • En fait, tu ne vérifies pas non plus le retour de CreateFile().


    De plus, je ne suis même pas sûr que ce que tu cherches à faire, lire ce que tu viens d'envoyer à un port COM depuis le même poste plutôt que depuis sa destination, soit possible!
    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
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2015
    Messages : 75
    Par défaut
    Merci pour votre réponse.

    Wow, je vois surtout ici une comédie d'erreurs.
    Certaines ne sont pas immédiatement graves:
    J'avoue que ça fait un bon moment j'ai pas travaillé avec C. En fait c'était juste vu en cours et là je reviens sur bon projet en C.
    Je vais commencer à voir et corriger ce que vous avez signalé.
    De plus, je ne suis même pas sûr que ce que tu cherches à faire, lire ce que tu viens d'envoyer à un port COM depuis le même poste plutôt que depuis sa destination, soit possible
    Je cherche plutôt à lire ce que la carte m'envoie. En fait, la trame "82 FF FF FF" est envoyé pour recevoir les données du registre 82 de la carte (un exple) et donc moi je cherche à récupérer la valeur contenant dans ce registre pour la traiter par la suite. En gros la réponse que la carte envoie au port Com.

    Je sais pas si je suis dans le bon chemin ou non ??

    Merci

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Dans ce cas, je dirais ne ferme pas le port COM entretemps. Garde le même handle vers le port COM sur toute la durée de la communication.
    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.

  5. #5
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2015
    Messages : 75
    Par défaut
    Merci pour votre réponse

    Dans ce cas, je dirais ne ferme pas le port COM entretemps. Garde le même handle vers le port COM sur toute la durée de la communication
    Déjà maintenant j'arrive à récupérer une partie de la trame retournée. Mais pas toute la trame correctement.

    je mets les images ci-dessous pour mieux expliquer.

    La première image est le TX / RX visualisé sur l'oscillo:

    Pièce jointe 288399


    et la deuxième celle de la console.
    Pièce jointe 288394

    vous trouvez aussi mon code car je pense j'ai un problème au niveau de la lecture que j'arrive pas à trouver
    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
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    #include <winbase.h>
    #include <conio.h>
    #include <string.h>
     
    int main(void)
    {
        DCB dcb;
        HANDLE hCom;
        BOOL fSuccess; // Tout ess bien passé
        char *pcCommPort="\\\\.\\COM50";
        char *Parite="Aucune";
        char *Vitesse="9600";
        char *TailleData="8";
        char *StopBit="1";
        char *chaine=NULL;
        char *message;
        unsigned long nBytesWrite;
        COMMTIMEOUTS tTimeout;
        char *inBuffer=NULL;
        int TimeoutRead;
        unsigned long nBytesRead=0;
        inBuffer=malloc(5);
        message=malloc(5);
        char c1=0x30;
        char crc=0xE7;
        char c2=0xFF;
        char c3=0xFF;
        char c4=0xFF;
        char *message_R;
        message_R=malloc(5);
     
     
     
     
     
        //Ouverture du port Comm
        hCom= CreateFile ( pcCommPort,
                          GENERIC_READ|GENERIC_WRITE, //accés lecture/ecriture
                          0, //pas de partage possible du port une fois ouvert
                          NULL, //pas d'héritage
                          OPEN_EXISTING, //doit etre open_existing
                          0, // pas d'overlopped I/O
                          NULL //hTemplate doit etre null
                     );
        // Vérifier si handle ouvre correctement
        if (hCom ==INVALID_HANDLE_VALUE)
        {
            //Manipuler l'erreur
            printf("Create file failed with error %d\n", GetLastError());
        }
        //Lecture de configuration actuelle
        fSuccess = GetCommState (hCom, &dcb);
        if (!fSuccess)
        {
             //Manipuler l'erreur
            printf("GetCommState failed with error %d\n", GetLastError());
        }
     
        //Configuration du port
        dcb.BaudRate= atoi(Vitesse); // gestion de vitesse . atoi:Convertir String to integer
        dcb.ByteSize= atoi(TailleData); //gestion de la taille
        /*Gestion de la partité*/
        if (strcmp (Parite, "Aucune")==0) //strcmp : si égaux renvoie 0
            dcb.Parity=NOPARITY; // pas de parité
        if (strcmp (Parite, "Paire")==0)
            dcb.Parity=EVENPARITY;
        if (strcmp (Parite, "Impaire")==0)
            dcb.Parity=ODDPARITY;
        /* Gestion bit de Stop*/
        if (strcmp (StopBit, "1")==0)
            dcb.StopBits= ONESTOPBIT; // 1 bit stop
        if (strcmp (StopBit, "1.5")==0)
            dcb.StopBits= ONE5STOPBITS; // 1.5 bit stop
        if (strcmp (StopBit, "2")==0)
            dcb.StopBits= TWOSTOPBITS; // 2 bit stop
     
        //Configurer le port
        fSuccess = SetCommState(hCom, &dcb);
        if (!fSuccess)
        {
            //Manipuler l'erreur
            printf("SetCommState failed with error %d\n", GetLastError());
        }
        else
        {
            printf("périphérique initialisé correctement \n");
        }
     
        sprintf(message, "%c", c1);
        sprintf(message, "%s%c", message, c2);
        sprintf(message, "%s%c", message, c3);
        sprintf(message, "%s%c", message, c4);
        sprintf(message, "%s%c", message, crc);
        //Ecrire dans le fichier
        fSuccess=WriteFile(hCom,message, 5, &nBytesWrite, NULL);
        if (!fSuccess)
        {
            //Manipuler l'erreur
            printf("WriteFile failed with error %d\n", GetLastError());
        }
        else
        {
            printf("Ecriture correcte \n");
        }
        free(message);
     
        fSuccess = GetCommTimeouts(hCom, &dcb);
        if (!fSuccess)
        {
             //Manipuler l'erreur
            printf("GetCommTimeouts failed with error %d\n", GetLastError());
        }
        //Définition des timeouts
        TimeoutRead= 700; // timeout de 1000ms
        tTimeout.ReadIntervalTimeout= MAXWORD;
        tTimeout.ReadTotalTimeoutMultiplier=0;
        tTimeout.ReadTotalTimeoutConstant=TimeoutRead;
        tTimeout.WriteTotalTimeoutMultiplier=0;
        tTimeout.WriteTotalTimeoutConstant=0;
     
        //Configuration du Timeout
     
        fSuccess = SetCommTimeouts(hCom, &tTimeout);
        if (!fSuccess)
        {
            //Manipuler l'erreur
            printf("SetCommTimeouts failed with error %d\n", GetLastError());
        }
     
           fSuccess=ReadFile(hCom, inBuffer, 5, &nBytesRead, NULL);
     
        if (!fSuccess)
        {
            //Manipuler l'erreur
            printf("ReadFile failed with error %d\n", GetLastError());
        }
        else if (nBytesRead=0) // pas des octets lus
            printf("pas de chaine reçue \n");
        else
            printf("chaine reçue est: %s\n", inBuffer); //Retourner la choine reçue.
        //fermer le port
     
        CloseHandle(hCom);
        //Libérer la mémoire
        free(inBuffer);
        return (fSuccess);
     
     
    }
    Merci

  6. #6
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2015
    Messages : 75
    Par défaut
    Bonjour,

    L'image visualisé sur l'oscillo:

    Nom : scope_32.png
Affichages : 533
Taille : 35,2 Ko


    La réponse sur le console:
    Nom : Capture.PNG
Affichages : 553
Taille : 39,2 Ko


    Merci

Discussions similaires

  1. [PHP 5.1] Récupérer une carte Google Maps comme une image
    Par ADB34 dans le forum Langage
    Réponses: 2
    Dernier message: 06/07/2014, 23h34
  2. récupérer valeur liste de choix comme paramêtre dans un requete
    Par ecoutertudevra dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 03/03/2012, 10h09
  3. [Cairo] Récupérer le buffer
    Par gerald3d dans le forum GTK+ avec C & C++
    Réponses: 6
    Dernier message: 09/11/2010, 17h32
  4. récupérer une image avec readfile
    Par julien1451 dans le forum Langage
    Réponses: 11
    Dernier message: 27/01/2010, 01h06
  5. Récupérer le buffer de facon dynamique
    Par Bmauet dans le forum Débuter
    Réponses: 2
    Dernier message: 26/10/2008, 18h18

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