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