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 :

envoi et reception d'une trame sous rs232


Sujet :

C++

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2010
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 35
    Points : 14
    Points
    14
    Par défaut envoi et reception d'une trame sous rs232
    bonjour
    je suis entrain d'ecrire un programme pour faire la communication entre un PC et un regulateur eurotherm à l'aide du rs232.
    j'ai fait un programme pour cette tache mais je ne sais pas comment envoyer et recevoir une trame de type:
    -Pour la lecture des données, un message ‘d'interrogation’ est envoyé à l'appareil. Ce message a la syntaxe suivante :
    [EOT](GID)(GID)(UID)(UID)(CHAN)(C1)(C2)[ENQ]
    Si l'appareil reçoit correctement le message et si le mnémonique est valable, il répond par
    [STX](CHAN)(C1)(C2)<DATA>[ETX](BCC)
    -Pour l'écriture des données, un message de ‘sélection’ est envoyé à l'appareil. Ce message a la syntaxe suivante :
    [EOT](GID)(GID)(UID)(UID)[STX](CHAN)(C1)(C2)<DATA>[ETX](BCC)

    est ce que vous pouvez m'aidez pour avancer dans mon projet.
    vous trouvez ci joint le code du programme:
    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
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    int InitCOM(char *Port,char *Parite,char *Vitesse,char *Data,char *StopBit) 
    { 
       DCB dcb; // déclarer une variable contenant la configuration du port 
       HANDLE hCom; // déclarer un handle 
       DWORD dwError; // n° de l’erreur 
       BOOL fSuccess; // tout c’est bien passé 
       /*--------------------------------------------------------*/ 
       /* Ouverture du port de Com */ 
       /*--------------------------------------------------------*/ 
       hCom = CreateFile( 
          Port, // Choix du port « COMx » 
          GENERIC_READ | GENERIC_WRITE, // accès pour lire et écrire sur le port 
          0, // accès exclusif au port de COM 
          NULL, // sécurité par défaut 
          OPEN_EXISTING, //Doit être à cette valeur car se n’est pas un fichier 
          0, 
          NULL // mode synchrone 
          ); 
       /*-----------------------------------------------------------*/ 
       /* Vérifier si handle ouvert correctement */ 
       /*-----------------------------------------------------------*/ 
       if (hCom == INVALID_HANDLE_VALUE) 
       { 
          dwError = GetLastError(); 
          /* Fichier non créer Gérer l'erreur */ 
       } 
       /*-----------------------------------------------------------*/ 
       /* Lecture Configuration initiale */ 
       /*-----------------------------------------------------------*/ 
       fSuccess = GetCommState(hCom, &dcb); 
       if (!fSuccess) 
       { 
          /* Gérer l'erreur*/ 
       } 
       /*-------------------------------------------------------------------*/ 
       /* Configuration du port */ 
       /*-------------------------------------------------------------------*/ 
       /* Gestion de la vitesse */ 
       dcb.BaudRate = StrToInt(Vitesse); 
       /* Gestion du nombre de bits */ 
       dcb.ByteSize = StrToInt(Data); 
       /* Gestion de la parité */ 
       if (strcmp(Parite,"Aucune")==0) 
          dcb.Parity = NOPARITY; 
       if (strcmp(Parite,"Paire")==0) 
          dcb.Parity = EVENPARITY; 
       if (strcmp(Parite,"Impaire")==0) 
          dcb.Parity = ODDPARITY; 
       /* Gestion du Stop Bit */ 
       if (strcmp(StopBit,"1")==0) 
          dcb.StopBits = ONESTOPBIT; 
       if (strcmp(StopBit,"1.5")==0) 
          dcb.StopBits = ONE5STOPBITS; 
       if (strcmp(StopBit,"2")==0) 
          dcb.StopBits = TWOSTOPBITS; 
       dcb.DCBlength; 
       dcb.BaudRate; 
       dcb.fBinary=1; 
       dcb.fParity=0; 
       dcb.fOutxCtsFlow=0; 
       dcb.fOutxDsrFlow=0; 
       dcb.fDtrControl=0; 
       dcb.fDsrSensitivity=0; 
       dcb.fTXContinueOnXoff=0; 
       dcb.fRtsControl=0; 
       /*-----------------------------------------------*/ 
       /* Configurer le port */ 
       /*-----------------------------------------------*/ 
       fSuccess = SetCommState(hCom, &dcb); 
       if (!fSuccess) 
       { 
          /* Gérer l'erreur*/ 
       } 
       /*------------------------------------------*/ 
       /* fermer le port de com */ 
       /*------------------------------------------*/ 
       CloseHandle(hCom); 
       return(fSuccess); 
    } 
     
    /*-----------------------------------------------------------------------------*/ 
    /* Envoyer une chaine de caractére sur la RS232 */ 
    /* */ 
    /* Paramètres : */ 
    /* char *Chaine La chaine à Envoyer */ 
    /* char *Port, le port de COM : "COM1" ou "COM2" */ 
    /* char *EolChar, le caractère fin de ligne */ 
    /* */ 
    /* Retour : 0 si erreur */ 
    /*-----------------------------------------------------------------------------*/ 
    int EnvoiChaineRS232(char *Chaine,char *Port,char *EolChar) 
    { 
       HANDLE hCom; 
       DWORD dwError; 
       BOOL fSuccess; 
       DWORD dwEvtMask; 
       int i; 
       int NbOctet; 
       char *Message; 
       unsigned long nBytesWrite; 
       Message = new char[200]; 
       /*-----------------------------------------------*/ 
       /* Ouverture du port de communiucation */ 
       /*-----------------------------------------------*/ 
       hCom = CreateFile(Port, 
          GENERIC_READ | GENERIC_WRITE, 
          0, 
          NULL, 
          OPEN_EXISTING, 
          0, 
          NULL 
          ); 
       if(strcmp(EolChar,"CR")==0) 
          sprintf(Message,"%s%c",Chaine,0x0D); 
       if(strcmp(EolChar,"LF")==0) 
          sprintf(Message,"%s%c",Chaine,0x0A); 
       if(strcmp(EolChar,"LF/CR")==0) 
          sprintf(Message,"%s%c%c",Chaine,0x0A,0x0D); 
       if(strcmp(EolChar,"CR/LF")==0) 
          sprintf(Message,"%s%c%c",Chaine,0x0D,0x0A); 
       // compter le nombre d’octet à envoyer 
       NbOctet = StrLen(Message); 
       // écrire dans le fichier 
       WriteFile(hCom,Message,NbOctet,&nBytesWrite,NULL); 
       // Fermer le handle de com 
       CloseHandle(hCom); 
       // Libération mémoire 
       delete[] Message; 
       return(fSuccess); 
    } 
    /*------------------------------------------------------------------------------*/ 
    /* Recevoir une chaîne de caractère sur la RS232 */ 
    /* */ 
    /* Paramètres : */ 
    /* char *ChaineRecue , buffer de réception */ 
    /* char *Port, le port de COM : "COM1" ou "COM2" */ 
    /*------------------------------------------------------------------------------*/ 
    int RecevoirRS232(char *Chaine Recue,char *Port) 
    { 
       DCB dcb; 
       HANDLE hCom; 
       DWORD dwError; 
       BOOL fSuccess; 
       BOOL bResult; 
       DWORD dwEvtMask; 
       COMMTIMEOUTS tTimeout; 
       unsigned long nBytesRead; 
       char *inBuffer; 
       int TimeoutRead; 
       int i; 
       int NbOctet; 
       char c; 
       /*-------------------------------------*/ 
       /* Initialisation des variables */ 
       /*-------------------------------------*/ 
       inBuffer = new char[200]; // réservation mémoire pour le buffer de récéption 
       sprintf(inBuffer,"%s",""); 
       nBytesRead=0; 
       /*-----------------------------------------------*/ 
       /* Ouverture du port de communication */ 
       /*-----------------------------------------------*/ 
       hCom = CreateFile(Port, 
          GENERIC_READ | GENERIC_WRITE, 
          0, 
          NULL, 
          OPEN_EXISTING, 
          0, 
          NULL 
          ); 
       /*----------------------------------*/ 
       /* Définition des timeouts */ 
       /*----------------------------------*/ 
       TimeoutRead = 500; // timeout de 500ms 
       tTimeout.ReadIntervalTimeout = MAXWORD; 
       tTimeout.ReadTotalTimeoutMultiplier = 0; 
       tTimeout.ReadTotalTimeoutConstant = TimeoutRead; // pas de time out = 0 
       tTimeout.WriteTotalTimeoutMultiplier = 0; 
       tTimeout.WriteTotalTimeoutConstant = 0; 
       // configurer le timeout 
       SetCommTimeouts(hCom,&tTimeout); 
       // fermer le port 
       CloseHandle(hCom); 
       // Libérer la mémoire 
       delete[] inBuffer; 
       return(fSuccess); 
    } 
     
     
     
    void main(void) 
    { 
       int Erreur ; 
       char *TrameRecue ; 
       TrameRecue = new char[200] ; 
       Erreur=InitCOM(« COM1 », « Aucune », « 9600 », « 8 », « 1 ») ; 
       if (Erreur !=0) // périphérique initialisé correctement 
       { 
          // envoi de la commande d’identification 
          EnvoiChaineRS232(« ID ? », « COM1 », « CR ») ; 
          // recevoir la réponse 
          RecevoirRS232(TrameRecue, « COM1 ») ; 
          // Traiter la trame reçue 
       } 
       else 
       { 
          // afficher une erreur 
       } 
       // Libération mémoire 
       delete[] TrameRecue ; 
    }

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Quel est ton problème exactement ? Car tout a l'air déjà présent dans le code que tu proposes.

  3. #3
    Membre à l'essai
    Inscrit en
    Décembre 2010
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 35
    Points : 14
    Points
    14
    Par défaut
    bonjour,
    mon porblem est au niveau d'envoi et de reception des trames, car lorsque j'essai d'envoyer une trame de type 04 30 30 31 31 02 53 4C 32 32 2E 30 03 02 en hexadecimale pour modifier la valeur de la consigne. Au niveau du regulateur rien ne change.
    merci en avance

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Utilises le debugger. Ou écris tes données dans un fichier pour comprendre ce qui se passe (EnvoiChaineRS232(« ID ? », « mon_log.txt », « CR »)

  5. #5
    Membre à l'essai
    Inscrit en
    Décembre 2010
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 35
    Points : 14
    Points
    14
    Par défaut
    bonjour,
    pouvez vous m'expliquer c'est quoi ID et CR ?
    merci

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Il n'y a qu'à lire la fonction correspondante :
    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
    int EnvoiChaineRS232(char *Chaine,char *Port,char *EolChar) 
    { 
       HANDLE hCom; 
       DWORD dwError; 
       BOOL fSuccess; 
       DWORD dwEvtMask; 
       int i; 
       int NbOctet; 
       char *Message; 
       unsigned long nBytesWrite; 
       Message = new char[200]; 
       /*-----------------------------------------------*/ 
       /* Ouverture du port de communiucation */ 
       /*-----------------------------------------------*/ 
       hCom = CreateFile(Port, 
          GENERIC_READ | GENERIC_WRITE, 
          0, 
          NULL, 
          OPEN_EXISTING, 
          0, 
          NULL 
          ); 
       if(strcmp(EolChar,"CR")==0) 
          sprintf(Message,"%s%c",Chaine,0x0D); 
       if(strcmp(EolChar,"LF")==0) 
          sprintf(Message,"%s%c",Chaine,0x0A); 
       if(strcmp(EolChar,"LF/CR")==0) 
          sprintf(Message,"%s%c%c",Chaine,0x0A,0x0D); 
       if(strcmp(EolChar,"CR/LF")==0) 
          sprintf(Message,"%s%c%c",Chaine,0x0D,0x0A); 
       // compter le nombre d’octet à envoyer 
       NbOctet = StrLen(Message); 
       // écrire dans le fichier 
       WriteFile(hCom,Message,NbOctet,&nBytesWrite,NULL); 
       // Fermer le handle de com 
       CloseHandle(hCom); 
       // Libération mémoire 
       delete[] Message; 
       return(fSuccess); 
    } 
    /*------------------------------------------------------------------------------*/ 
    /* Recevoir une chaîne de caractère sur la RS232 */ 
    /* */ 
    /* Paramètres : */ 
    /* char *ChaineRecue , buffer de réception */ 
    /* char *Port, le port de COM : "COM1" ou "COM2" */ 
    /*------------------------------------------------------------------------------*/ 
    int RecevoirRS232(char *Chaine Recue,char *Port) 
    { 
       DCB dcb; 
       HANDLE hCom; 
       DWORD dwError; 
       BOOL fSuccess; 
       BOOL bResult; 
       DWORD dwEvtMask; 
       COMMTIMEOUTS tTimeout; 
       unsigned long nBytesRead; 
       char *inBuffer; 
       int TimeoutRead; 
       int i; 
       int NbOctet; 
       char c; 
       /*-------------------------------------*/ 
       /* Initialisation des variables */ 
       /*-------------------------------------*/ 
       inBuffer = new char[200]; // réservation mémoire pour le buffer de récéption 
       sprintf(inBuffer,"%s",""); 
       nBytesRead=0; 
       /*-----------------------------------------------*/ 
       /* Ouverture du port de communication */ 
       /*-----------------------------------------------*/ 
       hCom = CreateFile(Port, 
          GENERIC_READ | GENERIC_WRITE, 
          0, 
          NULL, 
          OPEN_EXISTING, 
          0, 
          NULL 
          ); 
       /*----------------------------------*/ 
       /* Définition des timeouts */ 
       /*----------------------------------*/ 
       TimeoutRead = 500; // timeout de 500ms 
       tTimeout.ReadIntervalTimeout = MAXWORD; 
       tTimeout.ReadTotalTimeoutMultiplier = 0; 
       tTimeout.ReadTotalTimeoutConstant = TimeoutRead; // pas de time out = 0 
       tTimeout.WriteTotalTimeoutMultiplier = 0; 
       tTimeout.WriteTotalTimeoutConstant = 0; 
       // configurer le timeout 
       SetCommTimeouts(hCom,&tTimeout); 
       // fermer le port 
       CloseHandle(hCom); 
       // Libérer la mémoire 
       delete[] inBuffer; 
       return(fSuccess); 
    }
    ID c'est la valeur du premier argument et CR celui du troisième. Que ne comprends-tu pas ?

  7. #7
    Membre à l'essai
    Inscrit en
    Décembre 2010
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 35
    Points : 14
    Points
    14
    Par défaut
    bonjour,
    le problem est que je veux envoyer et recevoir une trame en ASCII de la forme
    _Pour l'écriture des données, un message de ‘sélection’ est envoyé à l'appareil. Ce message a la syntaxe suivante :
    [EOT](GID)(GID)(UID)(UID)[STX](CHAN)(C1)(C2)<DATA>[ETX](BCC)

    _Pour la lecture des données, un message ‘d'interrogation’ est envoyé à l'appareil. Ce message a la syntaxe suivante :
    [EOT](GID)(GID)(UID)(UID)(CHAN)(C1)(C2)[ENQ]
    Si l'appareil reçoit correctement le message et si le mnémonique est valable, il répond par
    [STX](CHAN)(C1)(C2)<DATA>[ETX](BCC)

    et lorsque j'entre ces trames rien ne change au niveau de regulateur.
    cordialement

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Comment fais-tu l'envoi de ces trames. Peux tu montrer ces lignes ?

    D'ailleurs ta fonction de réception n'a pas l'air fini. Il faut utiliser ReadFile comme tu utilises WriteFile pour l'écriture

Discussions similaires

  1. Envois et reception d'une trame via Port Serie (com)
    Par samirraoui dans le forum VB.NET
    Réponses: 3
    Dernier message: 11/05/2015, 13h15
  2. envoi d'une trame via rs232 avec SOH CR LF
    Par tibjedi dans le forum C
    Réponses: 4
    Dernier message: 24/04/2013, 14h06
  3. Affichage incomplet après réception d'une trame via RS232
    Par sroge dans le forum Composants VCL
    Réponses: 3
    Dernier message: 01/02/2008, 15h50
  4. reception d'une trame client
    Par john93 dans le forum C++
    Réponses: 2
    Dernier message: 09/12/2007, 13h24
  5. acquerir une trame nmea rs232(serie)>PIC
    Par strygolw dans le forum C
    Réponses: 7
    Dernier message: 06/05/2007, 14h17

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