Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1437 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  envoi et reception des trames en rs232

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

envoi et reception des trames en rs232

n°2065690
azert2010
Posté le 23-03-2011 à 23:22:25  profilanswer
 

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:
 
 
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 ;
}

mood
Publicité
Posté le 23-03-2011 à 23:22:25  profilanswer
 

n°2066173
azert2010
Posté le 25-03-2011 à 21:56:03  profilanswer
 

aucun réponce???????

n°2066192
h3bus
Troll Inside
Posté le 26-03-2011 à 02:22:18  profilanswer
 

Ben y'a presque plus rien à faire dans "ton" code...
 
Ou as-tu besoin d'aide précisément?
 
PS: s'il te plait utilise les balises [Code]


---------------
sheep++
n°2066230
azert2010
Posté le 26-03-2011 à 14:29:57  profilanswer
 

bonjour,
le problème c'est que lorsque je connecte mon régulateur avec le rs232 et j'écris un message par exemple:
4 48 48 49 49 2 83 76 50 50 3
qui le code ASCII du message qui change de la consigne de la température du régulateur a 22 degré rien ne change au niveau du régulateur.
et même si je veux lire la température afficher sur le régulateur je ne sais pas ou je peux déclaré le message convenable.
merci pour vous réponse.


Message édité par azert2010 le 26-03-2011 à 14:32:32
n°2066303
Elmoricq
Modérateur
Posté le 27-03-2011 à 12:10:42  profilanswer
 

1. Tu es sûr que c'est du C++ et non du C ? [:tinostar]
 
2. void main(void) = peine de mort :o
Les deux prototypes valides de main sont :
int main(void)
et :
int main(int, char**)
 
3. J'ai eu la flemme de lire le reste du code :o
Tu dis que le régulateur ne modifie pas sa T° suite à ton message. Mais que répond ton régulateur lorsque tu le lui envoies ? Son message de réponse devrait t'aider à établir un diagnostic sur ce qui se passe...

n°2066342
azert2010
Posté le 27-03-2011 à 16:40:21  profilanswer
 

bonjour,
le problème est que sur l'afficheur du régulateur rien ne change lorsque j'envoie un message et sur la fenêtre exécution du programme elle s'affiche le message est envoie.
donc je ne sais pas si le message est envoi vraiment ou non.
merci

n°2066361
Elmoricq
Modérateur
Posté le 27-03-2011 à 18:30:13  profilanswer
 

D'après ton post initial : tu peux interroger le régulateur. Le faire te permettrait déjà de valider ta procédure d'envoi de messages et de réception de réponse du régulateur.
 
As-tu essayé d'interroger le régulateur pour voir ?

n°2066363
azert2010
Posté le 27-03-2011 à 18:43:31  profilanswer
 

j'ai pensé à ça mais je sais pas ou je peux déclarer la trame de lecture dansle code.

n°2066375
h3bus
Troll Inside
Posté le 27-03-2011 à 19:45:47  profilanswer
 

Elle est déjà déclarée non?

Code :
  1. TrameRecue = new char[200] ;
 

Je te conseil déjà de vérifier que les paramètre RS232 soient ceux attendus par ton régulateur. Actuellement ton réglage est 9600bauds, 8bits, 1 bit de stop, pas de parité.

 

Si tu a accès à un oscilloscope, vérifie que ta trame est bien envoyée, et vérifie également si ton régulateur répond.

 

Vérifie également le câblage.

 

Vérifie que ton message soit correct, t'as la spec de ton régulateur?

 

Enfin relis tes messages quand tu poste, ton orthographe et grammaire laissent un peu à désirer...


Message édité par h3bus le 27-03-2011 à 19:46:10

---------------
sheep++

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  envoi et reception des trames en rs232

 

Sujets relatifs
Communication entre un microcontroleur et un port RS232Sauvegarde d'un site web et de sa base de données et envoi par email
Envoi automatique mail avec PJ via thunderbirdAjouter un champ DE lors d'un envoi de mail en VBA ?
[Résolu] [Shell] mysqldump et envoi mail si erreurClient messagerie gérant l'envoi de mails en HTML
envoi de données de form vers 2 fichiers phpEnvoi mail plusieurs destinataires (excel)
Envoi de mails préformatés par simple clic via GmailEnvoi de mail en parallele via ajax ?
Plus de sujets relatifs à : envoi et reception des trames en rs232


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR