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

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

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

    Informations forums :
    Inscription : Mars 2015
    Messages : 75
    Points : 59
    Points
    59
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    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 du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Mars 2015
    Messages : 75
    Points : 59
    Points
    59
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    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 du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Mars 2015
    Messages : 75
    Points : 59
    Points
    59
    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 du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Bas Rhin (Alsace)

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

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

    L'image visualisé sur l'oscillo:

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


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


    Merci

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Si ce que tu as reçu ce sont les octets 0x31, 0x00, 0x00, 0x00, 0x9B, alors c'est normal qu'une tentative de l'afficher en tant que chaîne de caractères échoue: L'affichage en tant que chaîne s'arrête au premier caractère nul.
    Ce dont tu as besoin, c'est une fonction d'affichage en tant que dump hexadécimal:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void DumpHexa(const void* pcvDebut, size_t taille)
    {
    	unsigned char const *pcBytes = pcvDebut;
    	size_t i;
    	for(i=0 ; i<taille ; i++)
    	{
    		unsigned char theByte = pcBytes[i];
    		if(i != 0)
    			putchar(' ');
    		printf("%02X", theByte);
    	}
    	putchar('\n');
    }
    Et l'utiliser dans le traitement des données reçues:
    Code C : 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
    #define TAILLE_INBUFFER 5
     
    	if(!fSuccess)
    	{
    		//Manipuler l'erreur
    		printf("ReadFile failed with error %lu\n", GetLastError());
    	}
    	else if(nBytesRead=0) // pas des octets lus
    		printf("pas de chaine recue.\n");
    	else if(memchr(inBuffer, '\0', TAILLE_INBUFFER)!=NULL && strlen(inBuffer) == nBytesRead-1) //Reçu une chaîne de caractères valide et complète
    	{
    		printf("chaine recue est: %s\n", inBuffer); //Afficher la chaîne reçue.
    	}
    	else
    	{
    		printf("Donnees recues (pas une chaine): ");
    		DumpHexa(inBuffer, nBytesRead);
    	}
    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.

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

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

    Informations forums :
    Inscription : Mars 2015
    Messages : 75
    Points : 59
    Points
    59
    Par défaut
    Merci pour votre réponse et pour la fonction,


    En fait lorsque je teste la fonction toute seule(je fais entrer une chaine et taille), ça marche correctement et elle affiche le résultat. Sauf que quand je l'appelle dans le main (comme vous avez fait) , Rien ne s'affiche .

    Nom : Capture.PNG
Affichages : 471
Taille : 34,0 Ko

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Ah, c'est à cause de cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    else if(nBytesRead=0) // pas des octets lus
    Il faut remplacer le = par un ==.
    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.

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

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

    Informations forums :
    Inscription : Mars 2015
    Messages : 75
    Points : 59
    Points
    59
    Par défaut
    Merci pour votre temps et votre réponse,

    enfin ça marche et j'arrive à visualiser la réponse correcte sur le console .
    Et si je veux la stocker dans une chaine ?
    En fait J'ai essayé de stocker chaque octet lu dans une chaine pour la traiter par la suite mais ceci plante: En fait, faire appelle à sprintf au lieu de printf !!

    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
     
     
    #include <stdio.h>
    #include <stdlib.h>
     
    char main()
    {
        unsigned char const *pcBytes = "7D 79 15 00 96"; //exemple
    	unsigned char *message= NULL;
    	size_t i;
    	size_t taille=5;
    	unsigned char theByte;
    	for(i=0 ; i<taille ; i++)
    	{
    		theByte = pcBytes[i];
    		if(i != 0)
                strcat(message, ' ');
    	    sprintf(message,"%02X", theByte );
     
    	}
     
    	strcat(message, ' ');
     
    	printf("message= %hhu\n", message);
     
     
     
     
        return message;
    }
    merci

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Il te faut allouer un buffer de bonne taille (et faire gaffe à ne pas dépasser quand tu le remplis au fur et à mesure des réponses reçues)
    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.

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

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

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

    Citation Envoyé par Médinoc Voir le message
    Il te faut allouer un buffer de bonne taille (et faire gaffe à ne pas dépasser quand tu le remplis au fur et à mesure des réponses reçues)
    Pour moi le buffer doit avoir une taille de 5 octets. J'spr que j'ai bien compris.
    En fait j'ai essayé ce code avec printf et sprintf en parallèle pour voir ce qui se passe. Et là je constate que le programme entre dans la boucle for, arrive à la ligne 30, donc affiche le premier octet the Byte[0 ] et il plante lorsqu'il passe à sprintf .
    J'ai pas compris ce qui me manque .

    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    void main()
    {
        unsigned char const *pcBytes = "7D 79 15 00 96";
    	char message=NULL;
    	message=malloc(5);
    	if (message == NULL)
        {
            printf("erreur");
        }
     
    	size_t i;
    	size_t taille=5;
    	unsigned char theByte;
    	for(i=0 ; i<taille ; i++)
    	{
    		theByte = pcBytes[i];
    		if(i != 0)
            {
                strcat(message, ' ');
                putchar(' '); //écrire le caratère passé en argument  sur l'écran: laisser un espace
            }
     
     
     
     
    		printf("%02X", theByte);
    		sprintf(message,"%02X", theByte );
     
    	}
    	putchar('\n');
    	strcat(message, ' ');
     
    	printf("message= %s\n", message);
     
    	free(message);
     
     
     
     
     
        return 0;
    }

  13. #13
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    pcBytes ne fait pas 5 de long, mais 15. (14 chars visibles, plus le \0).
    Tes nombres ne sont pas en pcBytes[i] pour i de 0 à 5 (exclus), mais en pcBytes[3*i] pour i de 0 à 5 (exclus)
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    @abyass: Tu n'as pas compris ce que pcBytes était censé être. pcBytes est censé pointer vers des octets bruts, pas vers une représentation textuelle des octets...
    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.

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

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

    Informations forums :
    Inscription : Mars 2015
    Messages : 75
    Points : 59
    Points
    59
    Par défaut
    Bonjour tout le monde,

    Je reviens vers ce sujet car je ne l'ai pas tout résolu.

    En fait, j'ai changé au niveau de la fonction DumpHex pour récupérer la chaine lue dans une chaine :

    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
     
     
    #ifndef DumpHex_H
    #define DumpHex_H
    # include<stdio.h>
    char DumpHexa(const void* pcvDebut, size_t taille,char *msg)
    {
    	unsigned char const *pcBytes = pcvDebut;
    	size_t i;
            msg=malloc(5);
            unsigned char theByte = pcBytes[0];
            sprintf(msg, "%02X", theByte);
            for(i=1 ; i<taille ; i++)
    	  {
    		unsigned char theByte_i = pcBytes[i];
    		sprintf(msg, "%s%02X", msg, theByte_i);
    	   }
    	printf(" %s\n\n", msg);
            return msg;
    }
    #endif // DumpHex_H

    et le main principe est:

    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
     
    #define TAILLE_INBUFFER 5
    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    #include <winbase.h>
    #include <conio.h>
    #include <string.h>
    #include "Struct_TrameSending.h"  
    #include"Struct_Conf.h"
    #include "DumpHex.h"
     
     
    int main(void)
    {
        DCB dcb;
        HANDLE hCom;
        BOOL fSuccess; // Tout ess bien passé
        char *chaine=NULL;
        unsigned long nBytesWrite;
        COMMTIMEOUTS tTimeout;
        int TimeoutRead;
        unsigned long nBytesRead=0;
        char *inBuffer=NULL;
        inBuffer=malloc(15);
        char *message;
        message=malloc(5);
        char *msg;
        msg=malloc(5);
     
        struct TrameSending S={0x52, 0x10,0xFF,0xFF,0xFF };  //trame que je veux envoyer est de cette forme
        struct Conf_Comm Conf={"\\\\.\\COM50", "Aucune","9600","8","1" };  //port, parité, baudrate..
     
        //Ouverture du port Comm
        hCom= CreateFile ( Conf.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(Conf.Vitesse); // gestion de vitesse . atoi:Convertir String to integer
        dcb.ByteSize= atoi(Conf.TailleData); //gestion de la taille
        //Gestion de la partité
     
        if (strcmp (Conf.Parite, "Aucune")==0) //strcmp : si égaux renvoie 0
            dcb.Parity=NOPARITY; // pas de parité
        if (strcmp (Conf.Parite, "Paire")==0)
            dcb.Parity=EVENPARITY;
        if (strcmp (Conf.Parite, "Impaire")==0)
            dcb.Parity=ODDPARITY;
        //Gestion bit de Stop
        if (strcmp (Conf.StopBit, "1")==0)
            dcb.StopBits= ONESTOPBIT; // 1 bit stop
        if (strcmp (Conf.StopBit, "1.5")==0)
            dcb.StopBits= ONE5STOPBITS; // 1.5 bit stop
        if (strcmp (Conf.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", S.c1);
        sprintf(message, "%s%c", message, S.c2);
        sprintf(message, "%s%c", message, S.c3);
        sprintf(message, "%s%c", message, S.c4);
        sprintf(message, "%s%c", message, S.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 if(memchr(inBuffer, '\0', TAILLE_INBUFFER)!=NULL && strlen(inBuffer) == nBytesRead-1) //Reçu une chaîne de caractères valide et complète
         {
             printf("chaine recue est: %s\n", inBuffer); //Afficher la chaîne reçue.
         }
        else
        {
     
            printf("Donnees recues (pas une chaine):   \n \n" );
    		DumpHexa(inBuffer, nBytesRead,msg);
    		printf(" %010X \n", msg);
        }
     
     
        //fermer le port
     
        CloseHandle(hCom);
        //Libérer la mémoire
        free(inBuffer);
        return (fSuccess);
    }
    Mon problème est au niveau de la ligne 148: j'arrive plus à visualiser le msg correctement. Le 1ièr msg reçu de la fonction DumpHex est le bon.
    Nom : Capture.PNG
Affichages : 471
Taille : 56,3 Ko


    En fait, à cette phase, je cherche à extraire les 4 premiers octets de la chaine reçue pour le convertir ensuite en un uint32_t pour le traiter ensuite.

    Quelqu'un pourra m'aider SVP.

    Merci

  16. #16
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Premier souci : sprintf(msg, "%s%02X", msg, theByte_i); .

    On peut lire la déclaration de sprintf dans la page de manuel : int sprintf( char *restrict buffer, const char *restrict format, ... ); . Puis plus bas au sein des notes, accompagné d'un exemple parlant :

    The C standard and POSIX specify that the behavior of sprintf and its variants is undefined when an argument overlaps with the destination buffer.
    Conclusion : verboten.

    Corrige déjà cela.

  17. #17
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    a priori, c'est sprintf(msg+2*i, "%02X", msg, pcBytes[i])
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

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

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

    Informations forums :
    Inscription : Mars 2015
    Messages : 75
    Points : 59
    Points
    59
    Par défaut
    Merci pour vos réponses,


    Même avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sprintf(msg+2*i, "%02X", pcBytes[i])
    le problème ne se résolut pas.
    En fait ce qui me semble bizarre que le printf de DumpHex affiche la bonne chaine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf(" %s\n\n", msg);
    mais quand je 're-printf' dans le main: ça mal affiche.

    Voilà le réponse sur l'oscillo:

    Nom : scope_0.png
Affichages : 437
Taille : 39,8 Ko

    Et ce que ça affiche encore sur le console( même chose):

    Nom : Capture.PNG
Affichages : 481
Taille : 43,7 Ko

    Merci

  19. #19
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Tes lignes qui n'affichent pas ce que tu veux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    		DumpHexa(inBuffer, nBytesRead,msg);
    		printf(" %010X \n", msg);
    La fin de DumpHexa:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	printf(" %s\n\n", msg);
            return msg;
    D'après toi, quelle est l'erreur?
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

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

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

    Informations forums :
    Inscription : Mars 2015
    Messages : 75
    Points : 59
    Points
    59
    Par défaut
    Citation Envoyé par ternel Voir le message
    Tes lignes qui n'affichent pas ce que tu veux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    		DumpHexa(inBuffer, nBytesRead,msg);
    		printf(" %010X \n", msg);
    La fin de DumpHexa:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	printf(" %s\n\n", msg);
            return msg;
    D'après toi, quelle est l'erreur?

    J'ai déjà essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf(" %s\n\n", msg);
    dans le main et voilà ce qui donne :
    Nom : Capture.PNG
Affichages : 431
Taille : 33,3 Ko

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