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 :

comportement etrange RS232 C/C++


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 17
    Par défaut comportement etrange RS232 C/C++
    Bonjour a tous,

    Je suis sur la programmation d'un port serie rs232 sous XP à l'aide de devC++ et je bloque sur un probleme curieux:
    Je reçois des données en flux continu 921600 bauds (Bridge USB-UART) à haute fréquence (78.1 kHz).
    Dans le code ci-dessous, si je declare une variable "int toto = 1000;" par exemple, j'ai mon programme qui part dans les choux.

    =>testRS232.exe a rencontré un problème et doit fermer. Nous vous prions de nous excuser pour le désagrément encouru.

    mais c'est le cas uniquement si je declare la variable a un certain endroit dans le code... De plus, si je declare DWORD length=2; et DWORD* dwRead; au debut , je trouve dans la reception des données 4 fausses valeurs (sinon ça fonctionne enfin il me semble)! ....je comprend rien !!!

    Si qqun a une explication à ce sujet...

    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
    #include <cstdlib>
    #include <iostream>
    #include <windows.h> 
    #include "gestion_fichier.h"
     
    /*=============================================================================
      Définition de constantes
    =============================================================================*/
    #define RX_SIZE         4096    /* taille tampon d'entrée  */
    #define TX_SIZE         4096    /* taille tampon de sortie */
    using namespace std;
     
    /*=============================================================================
      Fonctions du module.
    =============================================================================*/
    bool WriteData(HANDLE handle, BYTE*, DWORD, DWORD*);
    bool ReadData(HANDLE, BYTE*, DWORD, DWORD*,UINT);
     
    /******************************************************************************
      main : point d'entrée du programme.
    ******************************************************************************/
    int main(int argc, char *argv[])
    {
        //variables utilisées dans l'appel de ReadFile et WriteFile
        DWORD* dwWritten;
        BYTE data[RX_SIZE];
        UINT timeout=1000;
        // int toto = 1000;
        //opening a COM port
        HANDLE hMasterCOM = CreateFile("\\\\.\\COM3",	GENERIC_READ|GENERIC_WRITE,
    			FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,
    			FILE_ATTRIBUTE_NORMAL,NULL);		
     
        if(hMasterCOM == INVALID_HANDLE_VALUE)
        {
            cout<<"Erreur lors de l'ouverture du port COM"<<endl;
            return FALSE;
        }
     
        //Preparing an open COM port for data transmission
        PurgeComm(hMasterCOM, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|
        PURGE_RXCLEAR);
     
         /* affectation taille des tampons d'émission et de réception */
        SetupComm(hMasterCOM, RX_SIZE, TX_SIZE);
     
     
            //saving the COM port's Original State
            DCB dcbMasterInitState;
            GetCommState(hMasterCOM, & dcbMasterInitState);
     
            //Setting up a DCB Structure to set the new COM State
            DCB dcbMaster = dcbMasterInitState;
            dcbMaster.BaudRate= 921600;   // debit (bauds)
            dcbMaster.Parity= NOPARITY;   // disable parity checking
            dcbMaster.ByteSize= 8;        // number of bits/byte, 4-8
            dcbMaster.StopBits= ONESTOPBIT;// 0,1,2 = 1, 1.5, 2
            SetCommState(hMasterCOM, &dcbMaster);
     
          //http://msdn.microsoft.com/en-us/library/ms810467.aspx
     
            // Time out
    		COMMTIMEOUTS CommTimeouts;
    		memset( &CommTimeouts, 0, sizeof(CommTimeouts));
    		CommTimeouts.ReadIntervalTimeout =MAXDWORD;//1;//1000; 
    		CommTimeouts.ReadTotalTimeoutMultiplier =0;//1;// 1000;
    		CommTimeouts.ReadTotalTimeoutConstant = 0;//4000;
    		CommTimeouts.WriteTotalTimeoutMultiplier = 0;//1000;
    		CommTimeouts.WriteTotalTimeoutConstant = 0;//2000;
    		SetCommTimeouts(hMasterCOM,&CommTimeouts);
     
    		//attente pour que les modifications soient prises en compte
            Sleep(60);
     
     
         //si int toto est mis en commentaire : pas de plantage
         //int toto = 1000;
     
     
            printf("MAXDWORD: %ld \r\n", MAXDWORD); 
     
            //lancement du FPGA
            data[0]=65;
            //data[0]=90;
            data[1]=0;
     
            //si length et *dwRead sont declaré au debut : 4 donnees erronées
            DWORD length=2;
            DWORD* dwRead;
     
            if(WriteData(hMasterCOM,data,length,dwWritten)==true)
            {
            cout<<"ecriture terminee: "<<*dwWritten<<endl;
            }
     
            Sleep(20);
     
            //stop the FPGA
            data[0]=0;
            length=1;
            if(WriteData(hMasterCOM,data,length,dwWritten)==true)
            {
            cout<<"FPGA Arrete"<<endl;
            }
     
            //initialisation du tableau contenant les data
              for(int i=0;i<RX_SIZE;i++)
              {
               data[i]=0;                      
              }
     
            //Reading data
     
     
            cout<<"init tableau et lancement lecture"<<endl;
            ReadData(hMasterCOM,data,sizeof(data)-1,dwRead,timeout);
            cout<<"lecture terminee: nb octets lus: "<<*dwRead<<endl;
     
     
     
     
            //affichage tableau
            int compare=0;
            int error=0;
            for(int i=0;i<*dwRead;i++)
            {
                    if(data[i]!=compare)
                    {
                      // cout<<"erreur sur ligne : "<<i<<endl;        
    //                   printf("i-2: %ld \r\n", data[i-2]);
    //                   printf("i-1: %ld \r\n", data[i-1]);
    //                   printf("i  : %ld \r\n", data[i]);
    //                   printf("i+1: %ld \r\n", data[i+1]);
    //                   printf("i+2: %ld \r\n", data[i+2]);
    //                   printf("i+13: %ld \r\n", data[i+3]);
                     //printf("probleme ligne: %i",i);
                     error++;
                    }
                    compare++;
                    if(compare==14)compare=0;
            //cout<<"data[0]: "<<data[i]<<endl;
         //   printf("%d octet(s) recu(s) : %ld \r\n", *dwRead, data[i]);
     
            }
     
            //Closing the COM port
            CloseHandle(hMasterCOM);
            hMasterCOM = INVALID_HANDLE_VALUE;
            cout<<"ERROR: "<<error<<endl;
     
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    /******************************************************************************
      WriteData : ecriture sur le port COM.
      retour : vrai si l'opération a réussi, faux sinon.
    ******************************************************************************/
    bool WriteData(HANDLE handle, BYTE* data, DWORD length, DWORD* dwWritten)
    {
         bool success= false;
        if (!WriteFile(handle, (LPCVOID)data, length, dwWritten, NULL))
         {
            if (GetLastError() == ERROR_IO_PENDING)
            success = true;
         }
         else
         success = true;
         if (*dwWritten != length)
         success = false;
         return success;
    }
     
    /******************************************************************************
      WriteData : lecture sur le port COM.
      retour : vrai si l'opération a réussi, faux sinon.
    ******************************************************************************/
    bool ReadData(HANDLE handle, BYTE* data, DWORD length, DWORD* dwRead, UINT timeout)
    {
         bool success= false;
     
        if (!ReadFile(handle, data, length, dwRead, NULL))
         {
            if (GetLastError() == ERROR_IO_PENDING)
               success = true;
         }
         else
         success = true;
         return success;
    }

  2. #2
    Membre chevronné
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Par défaut
    Salut,

    //lancement du FPGA
    Class !

    C'est marrant je connais un mec qui utilise des FPGA aussi. Vous devez pas être des milliers quand même.

    Dans le code ci-dessous, si je declare une variable "int toto = 1000;" par exemple, j'ai mon programme qui part dans les choux.
    ...
    mais c'est le cas uniquement si je declare la variable a un certain endroit dans le code...
    On est d'accord que ça veut bien dire que tu as des débordements de mémoire quelque part ? Comme tu lis et tu écris des tableaux de bit, ce n'est pas très étonnant.

    Est-ce que ton problème disparait si, par exemple tu remplace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReadData(hMasterCOM,data,sizeof(data)-1,dwRead,timeout);
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReadData(hMasterCOM,data,2048,dwRead,timeout);
    Si oui, tu n'as plus qu'à consulter l'API de ReadFile.
    Si non, cela vient sans doute d'ailleurs.

    A suivre

  3. #3
    Membre averti
    Inscrit en
    Février 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 17
    Par défaut
    Merci pour ta réponse rapide !!!

    lol et je t'avouerais que je prefere programmer un FPGA que faire des programme C qui ne font pas ce que je souhaite

    Citation Envoyé par Feriaman Voir le message
    On est d'accord que ça veut bien dire que tu as des débordements de mémoire quelque part ? Comme tu lis et tu écris des tableaux de bit, ce n'est pas très étonnant.
    J'imagine que ce sont des débordements de mémoire... mais en quoi la déclaration d'une variable qui n'est pas utilisée vient-elle perturber le programme ? je me demandais si il n'y a pas une histoire de "mise en service" du port serie... ou est-ce lié aux COMMTIMEOUTS ?

    Sinon si je fais le remplacement, rien ne change.

    merci encore !

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par suppilou69 Voir le message
    J'imagine que ce sont des débordements de mémoire... mais en quoi la déclaration d'une variable qui n'est pas utilisée vient-elle perturber le programme ?
    Parce que cela génère des comportements indéfinis et qu'il y a plusieurs (une infinité ?) de comportements indéfinis.

    Il faut donc chercher :
    • ecriture dans un buffer trop petit,
    • oubli d'allocation de mémoire
    • double libération,
    • variable non initialisée,
    • ...


    Tu pourrais peut être commencer par élever le niveau de warning de ton compilateur (si ce n'est déjà fait)
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Membre chevronné
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Par défaut
    et si tu remplace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WriteData(hMasterCOM,data,length,dwWritten)==true
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WriteData(hMasterCOM,data,1024,dwWritten)==true
    ?

  6. #6
    Membre averti
    Inscrit en
    Février 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 17
    Par défaut
    même chose que lorsque je met 2048... snif ! d'ailleurs, a propos, si je met 4257 , il ne part pas en exception et me dit qu'il a lu 4257 valeurs, pourtant data est de 4096...
    en revanche si je vais au dela il ne part pas en exception mais me retourne qu'il n'a lu aucune valeur. (moi je me demande comment il fait pour ecrire dans data qui est plus petit...!)

    merci pour vos reponses !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. fichier .jnlp, comportement etrange
    Par orelero dans le forum JWS
    Réponses: 7
    Dernier message: 24/05/2008, 06h48
  2. Comportement étrange d' apt-get install
    Par Captain_futur dans le forum Debian
    Réponses: 2
    Dernier message: 06/04/2006, 22h57
  3. FindCLose Comportement etrange
    Par Aos dans le forum Langage
    Réponses: 6
    Dernier message: 24/01/2006, 14h20
  4. [LG]repeat/until comportement etrange
    Par scifire dans le forum Langage
    Réponses: 11
    Dernier message: 25/03/2005, 21h56
  5. [langage] Comportement étrange d'une variable
    Par Spaz dans le forum Langage
    Réponses: 6
    Dernier message: 23/04/2004, 11h29

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