Reception sur port COM1 sous Builder

Résolu
Ardeje26 Messages postés 6 Date d'inscription jeudi 22 janvier 2004 Statut Membre Dernière intervention 22 juin 2009 - 6 févr. 2004 à 17:13
Dvdmizo Messages postés 74 Date d'inscription jeudi 6 mars 2003 Statut Membre Dernière intervention 3 mai 2006 - 24 févr. 2004 à 10:51
Bonjour,
Je travail sous Borland Builder 5 et j'ai un problème pour récupérer les datas sur mon port COM1 avec le code suivant.Je peut simplement savoir lorsu'il y a une data qui est envoyée.Si quelqu'un a une idée...Merci.
//---------------------------------------------------------------------------

#include <vcl.h>
#include <stdio.h>
#include <math.h>

#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int v=0;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
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
);
/*--------------------------------------------------*/
/* Envoi de la chaine + Eol caractére */
/*--------------------------------------------------*/
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 chaine 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 *ChaineRecue,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);

/*-------------------------------------------------------------*/
/* boucle d'attente de lecture des octets */
/* Sortie de la boucle par timeout par exemple, si */
/* l’on suppose le format de la trame reçu n’est */
/* variable. */
/*-------------------------------------------------------------*/
bResult = ReadFile(hCom,inBuffer,199,&nBytesRead,NULL);

if (nBytesRead!=0) // Il existe des octets lus
{
v=1;
// Mettre en forme la trame : recherche de CR
}
else
sprintf(inBuffer, "%s ", "Pas de donnée reçue") ;

sprintf(ChaineRecue,"%s",inBuffer); // Retourner la chaine recue

// fermer le port
CloseHandle(hCom);

// Libérer la mémoire
delete[] inBuffer;

return(fSuccess);
}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{

int Erreur ;
char *TrameRecue ;

TrameRecue = new char[200] ;
char Port[4];
sprintf(&Port[0],"%s","COM1");
char Parite[7],Vitesse[4],Data[1],StopBit[1];
sprintf(&Parite[0],"%s","Aucune");
sprintf(&Vitesse[0],"%s","4800");
sprintf(&Data[0],"%s","8");
sprintf(&StopBit[0],"%s","1");
while(1)
{
Erreur=InitCOM(&Port[0],"Aucune","4800","8",&StopBit[0]) ;
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") ;
if(v==1)
{
MessageBox(NULL,TrameRecue,"Reception",MB_OK);
v=0;
}
// Traiter la trame recue
}
else
{
// afficher une erreur
}
}
// Libération mémoire
delete[] TrameRecue ;

}
//--------------------------------------------

1 réponse

Dvdmizo Messages postés 74 Date d'inscription jeudi 6 mars 2003 Statut Membre Dernière intervention 3 mai 2006
24 févr. 2004 à 10:51
DvdMizo

Salut,

pour pouvoir recevoir des informations sur le port COM il faut l'ouvrir en début de programme et surtout ne pas le refermer tant que tu n'as pas fini de recevoir tout ce que tu as a recevoir (en général il vaut mieux fermer le port seulement à la fin en quittant)
à chaque fois que tu initialises le port (avec hCom = CreateFile(Port, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL ); ) tu perds toutes les données déja reçues.

J'espère que ça pourra t'aider
3
Rejoignez-nous