Soyez le premier à donner votre avis sur cette source.
Vue 19 012 fois - Téléchargée 1 490 fois
// FICHIERS D'INCLUSION //------------------------------------------------------------------------------ #include <windows.h> #include <winbase.h> #include <stdio.h> #include <conio.h> #include <string.h> #include <winerror.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; // Nom du port série // 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); void ERROR_MSG(e_ErrCom g_ErrCom); void ThreadReception(); DWORD WINAPI dwThreadProc(LPVOID lParam); //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 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 (le fichier) DWORD dwEvtMask = 0; // événement qui se produit OVERLAPPED g_ov; // structure OVERLAPPED de Synchronisation I/O int g_Longueur; // Longueur de trame char g_Com[5]; // Les COM :COM1,COM2,COM3... int Index; // L'index des COM... //****************************************************************************** //------------------------------------------------------------------------------ // FONCTION : main //------------------------------------------------------------------------------ // DESCRIPTION : // La fonction principale // //------------------------------------------------------------------------------ void main (void) { //Declaration des variables: //Tableau de caractère à envoyer char TrameEnvoi[100]="S.O.S...."; //Tableau de caractère reçus char TrameRecue[100]; //Nombre maxi de caractère a lire(ici 100) unsigned int NbMaxCar=100; //Nombre de caractère reçus unsigned int NbCarRecus; for(Index=1;Index<=5;Index++) { sprintf(g_Com,"COM%d",Index); //Exemple de configuration du port serie : g_ErrCom=OuvreCom(g_Com,V9600,BITS_7,PAS_DE_PARITE,BIT_DE_STOP_1); printf("\nLes erreurs de la configuration du %s\n",g_Com); ERROR_MSG(g_ErrCom); g_Longueur=strlen(TrameEnvoi); //Exemple d'emission g_ErrCom=EmissionCom(&TrameEnvoi,sizeof(TrameEnvoi)); printf("\nLes erreurs de l'envoi de la trame par le %s:\n%s \n",g_Com,TrameEnvoi); ERROR_MSG(g_ErrCom); //Test de reception avec le thread ThreadReception(); } //Test de reception sans faire du thread // 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)); //ERROR_MSG(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, //| FILE_FLAG_OVERLAPPED ???? NULL); if(g_hCom == INVALID_HANDLE_VALUE) { // Echec g_ErrCom=e_ErrCom_Creation; } else //Sinon { // 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; //Vitesse g_DCB.ByteSize=BitsSize; //Taille de l'info g_DCB.Parity=Parity; //Parité g_DCB.StopBits=StopBits; //Nombre de bits de stop 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) { // pas d'erreur g_ErrCom=e_ErrCom_None; //Emission du buffer if(WriteFile(g_hCom,lpBuf,nCount,&NumBytes,NULL)==0) { //Erreur lors de l'émission 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; char *t; if(g_hCom!=NULL) { // on pari sur pas d'erreur g_ErrCom=e_ErrCom_None; t="Traitement"; // Pour éviter de générer un time out // 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; } } else g_ErrCom=e_ErrCom_Definition_Trame;
si non j'espere que t'a eu ton bts tabounator
comment calculer le temp de transmission dune commande.il y a 5octet envoyer pour la commande sur liasion serie RS232/485. vitesse de transfert 9600 baud. svp reponder moi avant demin mardi 22 avant 11h merci
comment calculer le temp de transmission dune commande.il y a 5octet envoyer pour la commande sur liasion serie RS232/485. vitesse de transfert 9600 baud. svp reponder moi avant demin mardi 22 avant 11h merci
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.