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

Windows Discussion :

Winapi - Rs232


Sujet :

Windows

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 83
    Points : 58
    Points
    58
    Par défaut Winapi - Rs232
    Bonjour,
    Je suis entrain de développer une interface (avec les API/C) me permettant de recevoir des données en continue à partir du port série.
    Je souhaite afficher les octets recus en 'temps réel' dans une status bar.
    Le problème est que je ne sais pas quel évènement sous Windows scruter...
    J'ai tenté de faire un truc du genre: "lorsqu'on appuie sur un bouton, on ouvre le port COM, on le lit et on affiche les données dans une zone d'une status bar" malheureusement sans succès car ce qui est affiché dans ma status bar ne change pas! (cf screen)
    Je sollicite votre aide svp et je précise que je ne suis pas informaticien.
    mon code:
    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
    /* Message de la barre d'outils : Bouton 1 - Connecter*/
    		case ID_TOOLBAR_BTN_1:
    			{
    				char cMsg[50];
    				
    				/* variables locales */ 
                    char buffer[256]; 
                    int nBytesRead=0,PORT=3; 
                    
                    /*tentative d'ouverture du PORT COM*/
                    if(!OpenCOM(3)) {
                    /*on affiche dans la zone de status le message*/
                    sprintf(cMsg, "Impossible d'ouvrir COM%d",PORT);
                    SendMessage(hStatusbar,
                    SB_SETTEXT,
                    ID_STATUS_ZONE_1,
                    (LPARAM)(LPSTR)cMsg);
                    }
                    else {
                    sprintf(cMsg, "COM%d ouvert",PORT);
                    SendMessage(hStatusbar,
                    SB_SETTEXT,
                    ID_STATUS_ZONE_1,
                    (LPARAM)(LPSTR)cMsg);   
                    
                        if(ReadCOM(buffer, sizeof(buffer)-1, &nBytesRead)) 
                        { 
                          buffer[nBytesRead] = '\0';
                          
                          /*on affiche les octets recus dans la zone de status*/
                          sprintf(cMsg, "%d reçus: %d",nBytesRead, buffer);
                          SendMessage(hStatusbar,
                          SB_SETTEXT,
                          ID_STATUS_ZONE_3,
                          (LPARAM)(LPSTR)cMsg);
                                               
                        } 
                        else 
                          sprintf(cMsg, "erreur lors de la réception!",nBytesRead, buffer);
                          SendMessage(hStatusbar,
                          SB_SETTEXT,
                          ID_STATUS_ZONE_2,
                          (LPARAM)(LPSTR)cMsg);      
                         
                         }
                    
    
    				/* On affiche le dernier bouton clique dans la barre d'etat */
    				SendMessage(hStatusbar,
    					SB_SETTEXT,
    					ID_STATUS_ZONE_3,
    					(LPARAM)(LPSTR)"Connect");
    			}
    			break;
    Images attachées Images attachées  

  2. #2
    Invité
    Invité(e)
    Par défaut
    il faudrai peut être rafraichir la statusbar par un refresh.

  3. #3
    Membre averti
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Points : 338
    Points
    338
    Par défaut
    As tu vérifié si ta lecture du port série fonctionne correctement, par exemple en regardant le contenu de buffer après le read()?
    En plus, je ne vois nulle part de fermeture du port...

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 83
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par gcorbineau
    il faudrai peut être rafraichir la statusbar par un refresh.
    Ok, et comment rafraîchir la status bar car je n'ai pas trouvé cette fonction dans la doc WIN32?
    Faut-il créer une fonction spécifique et comment procéder stp?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 83
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par joellel
    As tu vérifié si ta lecture du port série fonctionne correctement, par exemple en regardant le contenu de buffer après le read()?
    Je reçois des caractères je pense car j'obtiens les mêmes caractères avec l'executable fourni par l'exemple...
    Citation Envoyé par joellel
    En plus, je ne vois nulle part de fermeture du port...
    Il me semble appeler la fonction CloseCOM() dans mon code?

  6. #6
    Membre averti
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Points : 338
    Points
    338
    Par défaut
    Citation Envoyé par rin01
    Je reçois des caractères je pense car j'obtiens les mêmes caractères avec l'executable fourni par l'exemple...

    Il me semble appeler la fonction CloseCOM() dans mon code?
    Vérifie quand même, comme ça, tu seras sûr et tu pourras te concentrer sur le VRAI problème

  7. #7
    Membre confirmé Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Points : 488
    Points
    488
    Par défaut
    C'est l'adresse du buffer que tu affiches.

    char cMsg[50];
    C'est un peu petit si tu places un buffer de 255 octets dedans..
    L'itération est humaine; la récursion, divine.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 83
    Points : 58
    Points
    58
    Par défaut
    J'ai modifié le code:
    /* Message de la barre d'outils : Bouton 1 - Connecter*/
    case ID_TOOLBAR_BTN_1:
    {
    char cMsg[512],buffer[255];
    int nBytesRead;

    SendMessage(hStatusbar,
    SB_SETTEXT,
    ID_STATUS_ZONE_1,
    (LPARAM)(LPSTR)"COM");

    /*si l'ouverture du port échoue, message d'erreur*/
    if (!OpenCOM(3)){
    SendMessage(hStatusbar,
    SB_SETTEXT,
    ID_STATUS_ZONE_2,
    (LPARAM)(LPSTR)"not connected");
    return -1;//erreur

    }
    /*ouverture réussie, on affiche les données dans la status bar*/
    while(ReadCOM(buffer, sizeof(buffer)-1, &nBytesRead)) {


    SendMessage(hStatusbar,
    SB_SETTEXT,
    ID_STATUS_ZONE_2,
    (LPARAM)(LPSTR)"connected");

    sprintf(cMsg,"reçus: %s\n",buffer);
    SendMessage(hStatusbar,
    SB_SETTEXT,
    ID_STATUS_ZONE_3,
    (LPARAM)(LPSTR)buffer);


    }
    /*On ferme le PORT*/
    CloseCOM();

    }
    break;

    /* Message de la barre d'outils : Bouton 2 - Déconnecter*/
    case ID_TOOLBAR_BTN_2:
    {
    char cMsg[50];
    /*On ferme le PORT*/
    CloseCOM();
    /* On affiche le dernier bouton clique dans la barre d'etat */
    SendMessage(hStatusbar,
    SB_SETTEXT,
    ID_STATUS_ZONE_1,
    (LPARAM)(LPSTR)"");
    SendMessage(hStatusbar,
    SB_SETTEXT,
    ID_STATUS_ZONE_2,
    (LPARAM)(LPSTR)"Disconnected");
    SendMessage(hStatusbar,
    SB_SETTEXT,
    ID_STATUS_ZONE_3,
    (LPARAM)(LPSTR)"");

    }
    break;
    Dans ma status, j'obtiens enfin des caractères de manière continue mais j'ignore comment les afficher en hexa. J'ai essayé %x, %d,%o, %s sans succès!
    De plus, un clic sur mon bouton 2 ou un déplacement de la fenêtre ne coupe plus la communication et fait planter le programme...
    Si quelqu'un voit ou se trouve l'erreur car je suis un peu perdu...

  9. #9
    Membre averti
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Points : 338
    Points
    338
    Par défaut
    Attention au sprintf()! Il va te mettre dans cMsg tout ce qu'il y a en mémoire à pertir de l'adresse buffer et ce jusqu'au premier \0 rencontré.
    Je te suggère d'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    strncpy(cMsg, buffer, nbBytesRead);
    cMsg[nbBytesRead]='\0';
    ça peut éviter les plantages.

    Pour l'affichage en hexa, je ne sais pas.

  10. #10
    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
    Tu ne peux afficher en hexa qu'octet par octet avec *printf().

    Le mieux est de faire une fonction de conversion perso.
    Code C++ non-testé : 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
    //Taille minimale du buffer: (nSize*2)+1 TCHARs.
    void DataToHexa(LPTSTR szBuffer, void const * pcData, size_t nSize)
    {
    	BYTE const * const pcBytes = static_cast< BYTE const * >(pcData);
    	static LPCTSTR const sczHexa=TEXT("0123456789ABCDEF");
    
    	for(size_t i=0 ; i<nSize ; i++)
    	{
    		BYTE const b = pcBytes[ i ];
    		*szBuffer = sczHexa[ (b >> 4) & 0x0F ];
    		szBuffer++;
    		*szBuffer = sczHexa[ b & 0x0F ];
    		szBuffer++;
    	}
    	*szBuffer = TEXT('\0');
    }
    PS: Evite de caster ainsi tes constantes chaînes: Non-seulement tu forces un char * en TCHAR * sans faire gaffe, mais en plus tu perds la constance (même si ici tu la perdras de toute façon).
    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.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 83
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par Médinoc
    Tu ne peux afficher en hexa qu'octet par octet avec *printf().

    Le mieux est de faire une fonction de conversion perso.
    Code C++ non-testé : 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
    //Taille minimale du buffer: (nSize*2)+1 TCHARs.
    void DataToHexa(LPTSTR szBuffer, void const * pcData, size_t nSize)
    {
    	BYTE const * const pcBytes = static_cast< BYTE const * >(pcData);
    	static LPCTSTR const sczHexa=TEXT("0123456789ABCDEF");
    
    	for(size_t i=0 ; i<nSize ; i++)
    	{
    		BYTE const b = pcData[i];
    		*szBuffer = sczHexa[ (b >> 4) & 0x0F ];
    		szBuffer++;
    		*szBuffer = sczHexa[ b & 0x0F ];
    		szBuffer++;
    	}
    	*szBuffer = TEXT('\0');
    }
    PS: Evite de caster ainsi tes constantes chaînes: Non-seulement tu forces un char * en TCHAR * sans faire gaffe, mais en plus tu perds la constance (même si ici tu la perdras de toute façon).
    Bonjour, je n'ai pas tres bien compris comment utiliser la fonction DataToHexa et qu'est ce qu'il faut mettre en paramètre

  12. #12
    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
    C'est pourtant simple :
    • Premier paramètre : Un buffer de caractères (un tableau de TCHARs, quoi). La taille doit être suffisante, comme dit dans le code.
    • Second paramètre : Pointeur vers tes données à afficher en hexa.
    • Troisième paramètre : Taille en octets des données.
    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.

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 83
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par Médinoc
    C'est pourtant simple :
    • Premier paramètre : Un buffer de caractères (un tableau de TCHARs, quoi). La taille doit être suffisante, comme dit dans le code.
    • Second paramètre : Pointeur vers tes données à afficher en hexa.
    • Troisième paramètre : Taille en octets des données.
    Je m'excuse de mon ignorance mais comme je disais, je suis électronicien et non informaticien.
    Pour en revenir à la fonction, je l'ai juste copié-collé dans mon programme sans l'utiliser et le compilateur me génère des erreurs...
    y a t-il des fichiers d'entêtes spécifiques à inclure car lors de la compilation j'ai des erreurs ?
    Est-ce que tu pourrais mettre un exemple d'utilisation de cette fonction stp ?

    main.c: In function `DataToHexa':
    main.c:58: error: `static_cast' undeclared (first use in this function)
    main.c:58: error: (Each undeclared identifier is reported only once
    main.c:58: error: for each function it appears in.)
    main.c:58: error: syntax error before "BYTE"
    main.c:61: error: 'for' loop initial declaration used outside C99 mode
    main.c:63: warning: dereferencing `void *' pointer
    main.c:63: error: void value not ignored as it ought to be

  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
    Ah, je n'avais pas lu que tu étais en C.
    Comme indiqué, mon code était en C++...
    (Et puis, j'avais fait une petite erreur)

    Note: Comme header, les headers Windows devraient suffire (pour les types et la macro TEXT())
    Code C non-testé aussi : 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
    //Taille minimale du buffer: (nSize*2)+1 TCHARs.
    void DataToHexa(LPTSTR szBuffer, void const * pcData, size_t nSize)
    {
    	BYTE const * const pcBytes = pcData;
    	static LPCTSTR const sczHexa=TEXT("0123456789ABCDEF");
    
    	size_t i;
    	for(i=0 ; i<nSize ; i++)
    	{
    		BYTE const b = pcBytes[ i ];
    		*szBuffer = sczHexa[ (b >> 4) & 0x0F ];
    		szBuffer++;
    		*szBuffer = sczHexa[ b & 0x0F ];
    		szBuffer++;
    	}
    	*szBuffer = TEXT('\0');
    }
    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
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 83
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par Médinoc
    Ah, je n'avais pas lu que tu étais en C.
    Comme indiqué, mon code était en C++...
    (Et puis, j'avais fait une petite erreur)

    Note: Comme header, les headers Windows devraient suffire (pour les types et la macro TEXT())
    Code C non-testé aussi : 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
    //Taille minimale du buffer: (nSize*2)+1 TCHARs.
    void DataToHexa(LPTSTR szBuffer, void const * pcData, size_t nSize)
    {
    	BYTE const * const pcBytes = pcData;
    	static LPCTSTR const sczHexa=TEXT("0123456789ABCDEF");
    
    	size_t i;
    	for(i=0 ; i<nSize ; i++)
    	{
    		BYTE const b = pcBytes[ i ];
    		*szBuffer = sczHexa[ (b >> 4) & 0x0F ];
    		szBuffer++;
    		*szBuffer = sczHexa[ b & 0x0F ];
    		szBuffer++;
    	}
    	*szBuffer = TEXT('\0');
    }
    D'accord, mais je ne sais pas quand appeler cette fonction...En fait lors d'un clic sur un bouton, j'ouvre le port série et j'y lit les données:
    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
    /* Message de la barre d'outils : Bouton 1 - Connecter*/
    case ID_TOOLBAR_BTN_1:
    {
    char cMsg[512],buffer[255];
    int nBytesRead;
    BOOL test;
            
    SendMessage(hStatusbar,
    SB_SETTEXT,
    ID_STATUS_ZONE_1,
    (LPARAM)(LPSTR)"COM");
    		
    /*si l'ouverture du port échoue, message d'erreur*/
    if (!OpenCOM(3)){
    
    SendMessage(hStatusbar,
    SB_SETTEXT,		     
    ID_STATUS_ZONE_2,		      
    (LPARAM)(LPSTR)"not connected");
    
    return -1;//erreur
    }
    		
    /*ouverture réussie, on affiche les données dans la status bar*/
    test = ReadCOM(buffer, sizeof(buffer)-1, &nBytesRead);
    while (test) {
    
    SendMessage(hStatusbar,
    SB_SETTEXT,
    ID_STATUS_ZONE_2,
    (LPARAM)(LPSTR)"connected");
    
    }
     /*On ferme le PORT*/
     CloseCOM(); 
                
    }
    break;
    Donc comment j'appelle la fonction DataToHexa, et ou je l'appelle stp ?

  16. #16
    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
    Tu déclares cMsg en tableau de TCHARs (255*2+1 = 511, donc ça tient dans ton buffer de 512), et tu appelles:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DataToHexa(cMsg, buffer, sizeof(buffer));
    (ou sizeof(buffer)-1, puisque c'est tout ce que tu as lu)
    ... entre la lecture (read) et l'affichage (SendMessage), tout simplement.
    Et tu fais un SendMessage de cMsg, pas de buffer.
    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.

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 83
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par Médinoc
    Tu déclares cMsg en tableau de TCHARs (255*2+1 = 511, donc ça tient dans ton buffer de 512), et tu appelles:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DataToHexa(cMsg, buffer, sizeof(buffer));
    (ou sizeof(buffer)-1, puisque c'est tout ce que tu as lu)
    ... entre la lecture (read) et l'affichage (SendMessage), tout simplement.
    Et tu fais un SendMessage de cMsg, pas de buffer.
    Ok, je crois que la conversion fonctionne mais les autres boutons ne sont plus fonctionnels et si je tente de déplacer la fenêtre, le programme plante...

    /*ouverture réussie, on affiche les données dans la status bar*/
    test = ReadCOM(buffer, sizeof(buffer)-1, &nBytesRead);
    while (test) {
    SendMessage(hStatusbar,
    SB_SETTEXT,
    ID_STATUS_ZONE_2,
    (LPARAM)(LPSTR)"connected");
    buffer[nBytesRead]='\0';
    DataToHexa(mes, buffer, sizeof(buffer)-1);

    SendMessage(hStatusbar,
    SB_SETTEXT,
    ID_STATUS_ZONE_3,
    (LPARAM)(LPCSTR)mes);
    }
    /*On ferme le PORT*/
    CloseCOM();

  18. #18
    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
    1. Je peux voir la déclaration de mes ?
    2. (LPCTSTR) dans le cast, pas (LPCSTR)... (bien que ça n'ait pas d'influence normalement)
    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.

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 83
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par Médinoc
    1. Je peux voir la déclaration de mes ?
    2. (LPCTSTR) dans le cast, pas (LPCSTR)... (bien que ça n'ait pas d'influence normalement)
    Voici la routine pour le bouton Connecter
    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
    /* Message de la barre d'outils : Bouton 1 - Connecter*/
    case ID_TOOLBAR_BTN_1:
    		{
            char cMsg[512],buffer[255];
            int nBytesRead,i;
            BOOL test;
            TCHAR mes[512];
            
            SendMessage(hStatusbar,
    		SB_SETTEXT,
    		ID_STATUS_ZONE_1,
    		(LPARAM)(LPSTR)"COM");
    		
    		/*si l'ouverture du port échoue, message d'erreur*/
    		if (!OpenCOM(3)){
                  SendMessage(hStatusbar,
    		      SB_SETTEXT,
    		      ID_STATUS_ZONE_2,
    		      (LPARAM)(LPSTR)"not connected");
    		      return -1;//erreur
    
            }
    		/*ouverture réussie, on affiche les données dans la status bar*/
    		test = ReadCOM(buffer, sizeof(buffer)-1, &nBytesRead);
    
    		while (test) {
                  SendMessage(hStatusbar,
    		      SB_SETTEXT,
    		      ID_STATUS_ZONE_2,
    		      (LPARAM)(LPSTR)"connected");
                  buffer[nBytesRead]='\0';
    
                  /*Conversion en hexa*/
                  DataToHexa(mes, buffer, sizeof(buffer)-1);
    
                  /*Affichage du résultat*/                   
                  SendMessage(hStatusbar,
    		      SB_SETTEXT,
    		      ID_STATUS_ZONE_3,
    		      (LPARAM)(LPCSTR)mes);
                  test = ReadCOM(buffer, sizeof(buffer)-1, &nBytesRead);
    
                  }
            /*On ferme le PORT*/
            CloseCOM();             
            }
                break;

  20. #20
    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
    Eh bien ici, je ne vois pas ce qui peut poser problème sur les autres boutons de ta toolbar...
    Ni gêner le déplacement de la fenêtre...

    C'est bien le déplacement en plus qui foire, pas le redimensionnement ?

    PS: Dans la doc de SB_SETTEXT, ils parlent de limitation du texte à 127 caractères ou un truc du genre...
    Peut-être devrais-tu lire (ou afficher) moins à la fois ?


    Ou bien, une tout autre voie: Je pense que ton programme se fige dans une boucle infinie après réception (ta boucle while(test)), mais tu ne vois qu'il est planté qu'une fois que tu tentes de déplacer la fenêtre...
    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.

Discussions similaires

  1. lecture/ecriture des broches RTS/CTS du port RS232
    Par .:: sly51 ::. dans le forum C
    Réponses: 3
    Dernier message: 24/10/2006, 15h28
  2. [WinAPI C++] MultiThreading?
    Par Gruik dans le forum Windows
    Réponses: 2
    Dernier message: 25/03/2004, 00h08
  3. Réponses: 8
    Dernier message: 29/09/2003, 15h33
  4. [TP] port série rs232
    Par cyb33 dans le forum Turbo Pascal
    Réponses: 44
    Dernier message: 13/01/2003, 15h49

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