Port série

cheMoor Messages postés 20 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 13 mai 2009 - 2 mars 2004 à 14:48
cs_glaive Messages postés 21 Date d'inscription mardi 6 juillet 2004 Statut Membre Dernière intervention 29 juillet 2004 - 14 juil. 2004 à 15:52
Salut tout le monde,
Les questions:
1) Comment et quand utiliser la fonction « WaitCommEvent » ?
2) Est-ce que l’utilisation des threads se limite seulelment dans Visual C++ (le mode graphique) pas dans C (le mode texte). La fonction « CreateThread »
Besoin :
J’ai un programme (grâce à gplog et ymca2003 (et tout le forum)) qui envoi et qui reçu une trame par le port série.
Le problème que je suis obligé de faire la fonction de la réception «ReceptionCom(void *lpBuf, unsigned int nCountMax, unsigned int *pCountRead » sous (après) la fonction de l’émission « EmissionCom(const void *lpBuf, unsigned int nCount) » : Tout simplement, pour que je puisse recevoir ce que je vient d’envoyer.
C à d : que je suis obligé de connaître que le port à reçu quelque chose pour mettre la fonction de la réception !!!!!!!!!!!!
Est-ce qu’il est possible, de mettre un thread comme écouteur sur le port, pour qu’ il se déclenche d’une manière automatique lors de la réception de la trame?
Si oui, il est préférable de mettre (pour optimiser le programme) :
· La fonction « WaitCommEvent » ? et comment ? (gut)
· Une boucle pour tester l’état du port ? et comment ? (nicht gut)
· Autre chose ? et comment ? (ich weiße nicht)
Sinon
Qu’est ce que je peut faire SVP ?

Connecteur IBM-AT et ses lignes
Le broche signification
1 Data carried detected
2 Receveid data
3 Transmit data
4 DTR
5 Masse
6 DSR
7 RTS
8 CTS
9 Ring Indicator

Le programme.

// FICHIERS D'INCLUSION
//------------------------------------------------------------------------------
#include <windows.h>
#include <winbase.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>

// CONSTANTES
//-------------------------------------------------------------------------------
// Définition du code d'erreurs
typedef enum
{
e_ErrCom_None, // Pas d'erreur
e_ErrCom_Creation, // Erreur lors de la création du flux
e_ErrCom_Utilise, // Le port com est déjà utilisé
e_ErrCom_Inexistant, // Le port com n'existe pas
e_ErrCom_Timeout, // Timeout lors d'une émission-réception
e_ErrCom_Emission, // Erreur lors de l'émission
e_ErrCom_Reception, // Erreur lors de la réception
e_ErrCom_Definition_Trame, // Erreur de définition de la trame
e_ErrCom_Nack, // Demande non prise en coompte
e_ErrCom_Checksum // Erreur de checksum
} e_ErrCom;

// Nom du port série
#define PORT1 "COM1"
#define PORT2 "COM2"

// Définition des vitesses de communication
#define V1200 1200
#define V2400 2400
#define V4800 4800
#define V9600 9600

// Définition du nombre de bits
#define BITS_7 7
#define BITS_8 8

// Définition du nombre de bits de stop
#define BIT_DE_STOP_1 1
#define BIT_DE_STOP_2 2

// Définition de la parité
#define PAS_DE_PARITE 'N' //NOT OF PARITY
#define PARITE_IMPAIRE 'O' //ODD
#define PARITE_PAIRE 'E' //EVEN

// Codes de retour génériques
#define OK 1
#define KO 0

// Longueur max réservée pour une trame
#define LG_TRAME 1024 //1 KOctets

// PROTOTYPES
//----------------------------------------------------------------------------
e_ErrCom OuvreCom(char *strPort,long BaudRate,int BitsSize,int Parity,int StopBits);
e_ErrCom EmissionCom(const void *lpBuf, unsigned int nCount);
e_ErrCom ReceptionCom(void *lpBuf, unsigned int nCountMax, unsigned int *pCountRead);

// handle of communications device
// address of variable for event that occurred
// address of overlapped structure


void FermeCom();

// VARIABLES GLOBALES
//-----------------------------------------------------------------------------
DCB g_DCB; // structure dcb du port
e_ErrCom g_ErrCom= e_ErrCom_None; // Variable des erreurs de com
HANDLE g_hCom = 0; // handle de la com
int longueur;

void main (void)
{
//Declaration des variables:
//Tableau de caractère reçus
unsigned char TrameRecue[100];
//Tableau de caractère à envoyer
unsigned char TrameEnvoi[100]="Une trame de test...";
//Nombre maxi de caractère a lire(ici 100)
unsigned int NbMaxCar=100;
//Nombre de caractère reçus
unsigned int NbCarRecus;

//Exemple de configuration du port serie :
g_ErrCom=OuvreCom(PORT2,V9600,BITS_7,PAS_DE_PARITE,BIT_DE_STOP_1);
printf("Les erreurs de la configuration:\n");

//WaitCommEvent();
switch (g_ErrCom)
{
case e_ErrCom_None:
// Pas d'erreur
printf("%d Pas d'erreur\n\n\n",g_ErrCom);
break;
case e_ErrCom_Creation:
// Erreur lors de la création du flux
printf("%d Erreur lors de la création du flux\n\n\n",g_ErrCom);
break;
case e_ErrCom_Utilise:
// Le port com est déjà utilisé
printf("%d Le port com est déjà utilisé\n\n\n",g_ErrCom);
break;
case e_ErrCom_Inexistant:
// Le port com n'existe pas
printf("%d Le port com n'existe pas\n\n\n",g_ErrCom);
break;
case e_ErrCom_Timeout:
// Timeout lors d'une émission-réception
printf("%d Timeout lors d'une émission-réception\n\n\n",g_ErrCom);
break;
case e_ErrCom_Emission:
// Erreur lors de l'émission
printf("%d Erreur lors de l'émission\n\n\n",g_ErrCom);
break;
case e_ErrCom_Reception:
// Erreur lors de la réception
printf("%d Erreur lors de la réception\n\n\n",g_ErrCom);
break;
case e_ErrCom_Definition_Trame:
// Erreur de définition de la trame
printf("%d Erreur de définition de la trame\n\n\n",g_ErrCom);
break;
case e_ErrCom_Nack:
// Demande non prise en coompte
printf("%d Demande non prise en coompte\n\n\n",g_ErrCom);
break;
case e_ErrCom_Checksum:
// Erreur de checksum
printf("%d Erreur de checksum\n\n\n",g_ErrCom);
/* break;
default:
printf("%d Erreur inconnue\n",g_ErrCom);*/
}

longueur=strlen(TrameEnvoi);
//Exemple d'emission
g_ErrCom=EmissionCom(&TrameEnvoi,sizeof(TrameEnvoi));
printf("Les erreurs de l'envoi de la trame\n%s\n",TrameEnvoi);
switch (g_ErrCom)
{
case e_ErrCom_None:
// Pas d'erreur
printf("%d Pas d'erreur\n\n\n",g_ErrCom);
break;
case e_ErrCom_Creation:
// Erreur lors de la création du flux
printf("%d Erreur lors de la création du flux\n\n\n",g_ErrCom);
break;
case e_ErrCom_Utilise:
// Le port com est déjà utilisé
printf("%d Le port com est déjà utilisé\n\n\n",g_ErrCom);
break;
case e_ErrCom_Inexistant:
// Le port com n'existe pas
printf("%d Le port com n'existe pas\n\n\n",g_ErrCom);
break;
case e_ErrCom_Timeout:
// Timeout lors d'une émission-réception
printf("%d Timeout lors d'une émission-réception\n\n\n",g_ErrCom);
break;
case e_ErrCom_Emission:
// Erreur lors de l'émission
printf("%d Erreur lors de l'émission\n\n\n",g_ErrCom);
break;
case e_ErrCom_Reception:
// Erreur lors de la réception
printf("%d Erreur lors de la réception\n\n\n",g_ErrCom);
break;
case e_ErrCom_Definition_Trame:
// Erreur de définition de la trame
printf("%d Erreur de définition de la trame\n\n\n",g_ErrCom);
break;
case e_ErrCom_Nack:
// Demande non prise en coompte
printf("%d Demande non prise en coompte\n\n\n",g_ErrCom);
break;
case e_ErrCom_Checksum:
// Erreur de checksum
printf("%d Erreur de checksum\\n\n\n",g_ErrCom);
/* break;
default:
printf("%d Erreur inconnue\n",g_ErrCom);*/
}

//Exemple de reception
g_ErrCom=ReceptionCom(TrameRecue,NbMaxCar,&NbCarRecus);
printf("Les erreurs de la reception de la trame \n%s \nd'une taille de %d caractères.\n",TrameRecue,strlen(TrameRecue));
switch (g_ErrCom)
{
case e_ErrCom_None:
// Pas d'erreur
printf("%d Pas d'erreur\n\n\n",g_ErrCom);
break;
case e_ErrCom_Creation:
// Erreur lors de la création du flux
printf("%d Erreur lors de la création du flux\n\n\n",g_ErrCom);
break;
case e_ErrCom_Utilise:
// Le port com est déjà utilisé
printf("%d Le port com est déjà utilisé\n\n\n",g_ErrCom);
break;
case e_ErrCom_Inexistant:
// Le port com n'existe pas
printf("%d Le port com n'existe pas\n\n\n",g_ErrCom);
break;
case e_ErrCom_Timeout:
// Timeout lors d'une émission-réception
printf("%d Timeout lors d'une émission-réception\n\n\n",g_ErrCom);
break;
case e_ErrCom_Emission:
// Erreur lors de l'émission
printf("%d Erreur lors de l'émission\n\n\n",g_ErrCom);
break;
case e_ErrCom_Reception:
// Erreur lors de la réception
printf("%d Erreur lors de la réception\n\n\n",g_ErrCom);
break;
case e_ErrCom_Definition_Trame:
// Erreur de définition de la trame
printf("%d Erreur de définition de la trame\n\n\n",g_ErrCom);
break;
case e_ErrCom_Nack:
// Demande non prise en coompte
printf("%d Demande non prise en coompte\n\n\n",g_ErrCom);
break;
case e_ErrCom_Checksum:
// Erreur de checksum
printf("%d Erreur de checksum\n\n\n",g_ErrCom);
/* break;
default:
printf("%d Erreur inconnue\n",g_ErrCom);*/
}
getch();

}

//------------------------------------------------------------------------------
// FONCTION : OuvreCom
//------------------------------------------------------------------------------
// DESCRIPTION :
// Initialise et ouvre un port série
//
//------------------------------------------------------------------------------
// PARAMETRES :
// - strPort Nom du port "COM1", "COM2"
// - BaudRate Vitesse
// - BitsSize Taille de l'info
// - Parity Parité
// - StopBits Nombre de bits de stop
//
// RETOUR :Code d'erreur
//------------------------------------------------------------------------------
e_ErrCom OuvreCom(char *strPort,long BaudRate,int BitsSize,int Parity,int StopBits)
{
g_ErrCom = e_ErrCom_None;

// On ouvre le port série
g_hCom = CreateFile(strPort,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_WRITE_THROUGH | FILE_FLAG_NO_BUFFERING,NULL);

if(g_hCom == INVALID_HANDLE_VALUE)
{
// Echec
g_ErrCom=e_ErrCom_Creation;
}
else
{
// On vide les buffers
PurgeComm(g_hCom,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);

// On paramètre le port série
g_DCB.DCBlength = sizeof(DCB);
//Configuration actuelle
GetCommState(g_hCom, &g_DCB);
//Modification du DCB
g_DCB.BaudRate=BaudRate;
g_DCB.ByteSize=BitsSize;
g_DCB.Parity=Parity;
g_DCB.StopBits=StopBits;
g_DCB.fDtrControl=DTR_CONTROL_DISABLE;
//Configuration de la liaison serie
SetCommState(g_hCom,&g_DCB);
}
return g_ErrCom;
}

//----------------------------------------------------------------------------
// FONCTION : EmissionCom
//----------------------------------------------------------------------------
// DESCRIPTION :
// Emission d'octets sur la liaison série
//
//----------------------------------------------------------------------------
// PARAMETRES :
// -lpBuf Pointeur sur les octets a emettre
// -nCount Nombre d'octet a emettre
//
//----------------------------------------------------------------------------
// RETOUR :Code d'erreur
//----------------------------------------------------------------------------
e_ErrCom EmissionCom(const void* lpBuf,unsigned int nCount)
{

DWORD NumBytes=0;

if(g_hCom!=NULL)
{
// On pari sur pas d'erreur
g_ErrCom=e_ErrCom_None;

//Emission du buffer
if(WriteFile(g_hCom,lpBuf,nCount,&NumBytes,NULL)==0)
{
g_ErrCom=e_ErrCom_Emission;
}
}
else
//Le port n'a pas été ouvert
g_ErrCom=e_ErrCom_Creation;

return g_ErrCom;

}

//---------------------------------------------------------------------------
// FONCTION : ReceptionCom
//---------------------------------------------------------------------------
// DESCRIPTION :
// Reception de caractères sur la liaison série
//
//---------------------------------------------------------------------------
// PARAMETRES :
// -lpBuf Pointeur sur le buffer de caractère a lire
// -nCountMax Nombre maxi de caractère a lire
// -pCountRead Pointeur sur le nombre de caractères lus
//---------------------------------------------------------------------------
// RETOUR :Code d'erreur
//---------------------------------------------------------------------------
e_ErrCom ReceptionCom(void *lpBuf,unsigned int nCountMax, unsigned int* pCountRead)
{
COMSTAT Stat;
DWORD Errors;
unsigned int nCarALire;
unsigned long NCarLus=0;
unsigned int Cont;
char *t;

if(g_hCom!=NULL)
{
//on pari sur pas d'erreur
g_ErrCom=e_ErrCom_None;
t="Traitement";
// Pour éviter de gérer un time out
Cont=0;
while (Cont<=longueur){
// Pour éviter de gérer un time out
/*if (Cont==0)
t="Traitement";*/
if (Cont==longueur)
t="\n";
else
t="*";
Sleep(500);
Cont=Cont+1;
printf("%s",t);
};

//Pour connaitre le nombre d'octets dans le buffer d'entrée
ClearCommError(g_hCom,&Errors,&Stat);
nCarALire=Stat.cbInQue;

//On effectue la lecture si il y a des caractères présents
if( (nCarALire>0)&&(nCarALire<=nCountMax) )
{
if(ReadFile(g_hCom,lpBuf,nCarALire,&NCarLus,NULL)==0)
{
g_ErrCom=e_ErrCom_Reception;
}
}
*pCountRead=NCarLus;
}
else
//Le port n a pas été ouvert
g_ErrCom=e_ErrCom_Creation;

//Compte rendu de l'exécution
return g_ErrCom;

}

/**********************CORRECTION DE LA RECEPTION***********************/

//-----------------------------------------------------------------------
// FONCTION : FermeCom
//-----------------------------------------------------------------------
// DESCRIPTION :
// Ferme le port série préalablement ouvert avec OuvreCom
//
//-----------------------------------------------------------------------
// PARAMETRES :
// Néant
//-----------------------------------------------------------------------
// RETOUR :Néant
//-----------------------------------------------------------------------
void FermeCom()
{
if(g_hCom!=NULL)
{
CloseHandle(g_hCom);
}
}
//MERCI

1 réponse

cs_glaive Messages postés 21 Date d'inscription mardi 6 juillet 2004 Statut Membre Dernière intervention 29 juillet 2004
14 juil. 2004 à 15:52
ce code source je l'ai déja, je ne l'ai pas testé mais pour ta fonction waitComEvent je l'ai utilisé et elle marche sauf que cteet fonction plante le system jusqu'à recevoir des données

glaive l'epée de la justice et du jeu video
0
Rejoignez-nous