Gestion de plusieurs ports RS232

Signaler
Messages postés
2
Date d'inscription
jeudi 10 mars 2005
Statut
Membre
Dernière intervention
28 avril 2009
-
Messages postés
7
Date d'inscription
dimanche 20 janvier 2008
Statut
Membre
Dernière intervention
3 septembre 2009
-
Bonjour à tous d'abord

J'ai récupéré un code sur le site permettant de géré un port série, j'aimerai piloter 8 (voir +) ports série avec un seul ordinateur. Malheureusement je
n'arrive qu'a ouvrir un seul port série à la fois à l'aide d'un
programme en C, en effet, il me faut fermé le port pour en réouvrir un autre.
Pouvez m'apporter une solution, en C ou C++
Merci d'avance

Voici le code :

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

// CONSTANTES
//-------------------------------------------------------------------------------

  // Codes de retour génériques
#define TRUE 1
#define FALSE 0
 
 
// PROTOTYPES
//----------------------------------------------------------------------------
   int OuvrirCom(int com,int Vitesse,int Taille,char *Parite,int StopBits);
   int EnvoyerCom (char*Chaine);
   int RecevoirCom(char *Chaine,int nCountMax,int *pCountRead);
   int MenuRecevoirEnvoyer () ;
   int FermerCom();
  
  
// VARIABLES GLOBALES
//-----------------------------------------------------------------------------

   DCB g_DCB; // structure dcb du port
   HANDLE g_hCom = 0; // handle de la com

int main ()
{    
   int Sortie1 ;
   int SortieVitesse ;
   int SortieTaille ;
   int SortieParite ;
   int SortieStopBits ;
  
   /* Valeur retour menu */
   int ValeurMenuPort = 0;
   int ValeurMenuVitesse = 0 ;  
   int ValeurMenuTaille = 0;
   int ValeurMenuParite = 0;
   int ValeurMenuStopBits = 0;
   int ValeurMenuRecevoirEnvoyer = TRUE ;  
  
   /* Reels valeurs */
   //char com[10] ;
   char ValeurPort[10] ;
   int  ValeurVitesse = 0;  
   int  ValeurTaille = 0 ;
   char ValeurParite[10] ;
   int  ValeurStopBits = 0;
  
   /* Supplement */
   //int LongueurPort = 0 ;
       
   while (Sortie1)
   {
      /*** Initialisation des valeurs de sortie ***/
      Sortie1 = TRUE ;
      SortieVitesse = TRUE ;
      SortieTaille = TRUE ;
      SortieParite = TRUE ;
      SortieStopBits = TRUE ;
           
      /*** Configuration Port ***/
      ValeurMenuPort = MenuPort (ValeurPort) ;     
     
     
      if (ValeurMenuPort == 0)
         Sortie1 = FALSE ;
     
      else if (ValeurMenuPort > 0 || ValeurMenuPort < 9)

      sleep(1000) ;     
      if ( OuvrirCom(ValeurMenuPort, 9600, 8, "Aucune", 1 ) ) { 
            printf( "\n Ouverture du port COM%d effectuee.\n" , ValeurMenuPort ) ;
            ValeurMenuRecevoirEnvoyer = MenuRecevoirEnvoyer () ;
            if (ValeurMenuRecevoirEnvoyer == 0 )
               Sortie1 = FALSE ;            else if ( (ValeurMenuRecevoirEnvoyer 3) || (ValeurMenuRecevoirEnvoyer 4) )
               break ;
         }
         //else printf("\n Erreur ouverture port.\n") ;

            
         else if ( ValeurMenuPort == 9 ){
                 system("cls");
                 printf(" Ouverture de tout les ports\n");
                 int i;
                 for( i=1 ; i<9 ; i++){
                      sleep(1000);
                      if ( OuvrirCom(i, 9600, 8, "Aucune", 1 )) printf("\n Ouverture du port COM%d effectuee.\n",i) ;
                      else printf (" Erreur de l'ouverture du port COM%d\n",i);
                 } 
         }        
   }            
    system("PAUSE");
    return EXIT_SUCCESS;   
}
  
  
  
//------------------------------------------------------------------------------
// FONCTION : OuvrirCom
//------------------------------------------------------------------------------

  
int OuvrirCom(int com,int Vitesse,int Taille,char* Parite,int StopBits)
{

  char NomPort[10];

      switch(com){
                             case 1 :
                             strcpy (NomPort, "COM1") ;
                             case 2 :
                             strcpy (NomPort, "COM2") ;
                             case 3 :
                             strcpy (NomPort, "COM3") ;
                             case 4 :
                             strcpy (NomPort, "COM4") ;
                             case 5 :
                             strcpy (NomPort, "COM5") ;
                             case 6 :
                             strcpy (NomPort, "COM6") ;
                             case 7 :
                             strcpy (NomPort, "COM7") ;
                             case 8 :
                             strcpy (NomPort, "COM8") ;
                             break;
                             }

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

      if(g_hCom == INVALID_HANDLE_VALUE)
      {
                return FALSE ;
      }
      else
      {
        // on vide les tampons d'émission et de réception, mise à 1 DTR
        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 = Vitesse ;
        g_DCB.ByteSize = Taille;
 
        g_DCB.fDtrControl = DTR_CONTROL_ENABLE; // (DISABLE)
         
        g_DCB.Parity = NOPARITY;
  
        g_DCB.StopBits = ONESTOPBIT;
       
        //Configuration de la liaison serie
        SetCommState(g_hCom, &g_DCB);
      
        return TRUE ;
      }
}
    
//----------------------------------------------------------------------------
// FONCTION : EnvoyerCom
//----------------------------------------------------------------------------

int EnvoyerCom(char* Chaine)
{
   DWORD NumBytes=0;
   int TailleChaine = strlen(Chaine) ;
   printf("\n Taille de la chaine : %d \n", TailleChaine) ;
     
   if(g_hCom != NULL)
   {
      //Emission de la Chaine
      if  (WriteFile(g_hCom,Chaine, TailleChaine,&NumBytes,NULL)==0)
      {
         printf ("\n Erreur emission.\n") ;
         return FALSE ;
      }
      else
      {
         printf("\n Chaine envoyee : %s.\n", Chaine) ;
         return TRUE ;
      }  
   }
   else
      return FALSE ;
}
   
//---------------------------------------------------------------------------
// FONCTION : RecevoirCom
//---------------------------------------------------------------------------

int RecevoirCom(char *Chaine,int nCountMax, int* pCountRead)
{
   COMSTAT Stat;
   DWORD Errors;
   int nbCarALire;
   long NCarLus=0;
   int b_Retour ;
     
   if(g_hCom!=NULL)
   {                 
      FILE* FFichier ;      if ( (FFichier fopen ("essai.txt", "w")) NULL )
         printf ("Ouverture fichier impossible\n") ;
      else
      {
      // printf ("Ouverture fichier avec succes\n") ;
         fprintf ( FFichier, "Ecriture dans le fichier...") ;
      }                        
      //Pour éviter de gérer un time out
      Sleep(100);
      //Pour connaitre le nombre d'octets dans le buffer d'entrée
      ClearCommError(g_hCom,&Errors,&Stat);
      nbCarALire=Stat.cbInQue;
       
      //On effectue la lecture si il y a des caractères présents
      if( (nbCarALire>0)&&(nbCarALire<=nCountMax) )
      {
         //Reception de la Chaine
         if(ReadFile(g_hCom,Chaine,nbCarALire,&NCarLus,NULL)==0)
         {
            printf ("\n Erreur reception.\n") ;
            return  FALSE ;
         }
      }
      //Finition de la Chaine
      *pCountRead = NCarLus;
      Chaine[NCarLus] = '\0' ;
      //Ecriture dans le Fichier preouvert
      fprintf ( FFichier,"%s", Chaine) ;
   }
   else
      return FALSE ;
               
}

//-----------------------------------------------------------------------
// FONCTION : FermerCom
//-----------------------------------------------------------------------

int FermerCom()
{
   if(g_hCom!=NULL)
   {
      CloseHandle(g_hCom);
      return TRUE ;
   }
}

//-----------------------------------------------------------------------
// FONCTION : MenuPort
//-----------------------------------------------------------------------

int MenuPort ( char* ValeurPort )
{       
      int Choix1 ;
       
         printf ("\n") ;
         printf ("\t----------------------------------------------\n") ;   
         printf ("\t-------   ** Liaison Serie RS-232 **   -------\n") ;
         printf ("\t----------------------------------------------\n") ;
         printf ("\t-                                            -\n") ;
         printf ("\t-        Entrez l'adresse du port :          -\n") ;
         printf ("\t-                                            -\n") ;       
         printf ("\t-              1  - COM1                     -\n") ;
         printf ("\t-              2  - COM2                     -\n") ;
         printf ("\t-              3  - COM3                     -\n") ;
         printf ("\t-              4  - COM4                     -\n") ;
         printf ("\t-              5  - COM5                     -\n") ;
         printf ("\t-              6  - COM6                     -\n") ;
         printf ("\t-              7  - COM7                     -\n") ;
         printf ("\t-              8  - COM8                     -\n") ;
         printf ("\t-              9  - Ouvrir tout les ports    -\n") ;   
         printf ("\t-              10 - Lancer le programme      -\n") ;         
         printf ("\t-              0  - Quitter                  -\n") ;        
         printf ("\t-                                            -\n") ;               
         printf ("\t----------------------------------------------\n") ;
         printf ("\t          Votre Choix : ");   
     
         scanf ("%d", &Choix1) ;
         system("cls") ;
     
         if(Choix1==0){
            //printf ("\n Vous avez decider de quitter le programme, au revoir..\n\n") ;
            //return Choix1 ;
            exit(0);
           
            }
           
            else if( Choix1 > 0 && Choix1 < 9){                       
                 printf(" -- Informations parametrage --\n") ;
                 printf(" Port : COM%d \n",Choix1) ;
                 printf(" Vitesse : 9600 bits/s \n") ;
                 printf(" Taille : 8 bits\n") ;
                 printf(" Parite : Aucune \n") ;
                 printf(" Stop bits : 1 bit stop\n") ;          
                 return Choix1 ;
            }
           
            /*else if ( Choix1 == 10 ){
                 printf(" Lancement du programme ");
            } */  
           
            else if (Choix1==9) return Choix1;
           
            else{
                 //system("cls");
                 printf("\n Mauvaise touche, essayer de nouveau !! \n") ;
            }                  
}

//-----------------------------------------------------------------------
// FONCTION : MenuRecevoirEnvoyer
//-----------------------------------------------------------------------

int MenuRecevoirEnvoyer ()
{
      int Choix1 ;
      int Sortie = TRUE ;
      int SortieRetour ;
     
      while (Sortie)
      {
         printf ("\n") ;
         printf ("\t----------------------------------------------\n") ;   
         printf ("\t-------   ** Liaison Serie RS-232 **   -------\n") ;
         printf ("\t----------------------------------------------\n") ;
         printf ("\t-                                            -\n") ;
         printf ("\t-          Que voulez-vous faire :           -\n") ;
         printf ("\t-                                            -\n") ;       
         printf ("\t-              1 - Tester une requete        -\n") ;
         printf ("\t-              2 - Fermer le port            -\n") ;                          
         printf ("\t-              3 - Retour                    -\n") ;
         printf ("\t-              0 - Quitter                   -\n") ;
         printf ("\t-                                            -\n") ;                                          
         printf ("\t----------------------------------------------\n") ;
         printf ("\t          Votre Choix : ");   
     
         scanf ("%d", &Choix1) ;
         system("cls") ;
     
         switch(Choix1)
         {
            case 0:
            printf ("\n Vous avez decide de quitter le programme, aurevoir..\n") ;
            if (FermerCom())
               printf ("\n Fermeture du port avec succes.\n\n") ;
            SortieRetour = 0 ;
            Sortie = FALSE ;
            return SortieRetour ;
            break;                         
                           
            case 1:
            printf("\n Vous avez selectionne l'envoi de donnees sur le port.\n") ;
            char *Chaine ;
            Chaine = malloc (128) ;
            printf("\n Veuillez saisir votre message: ") ;
            scanf("%s", Chaine) ;
            if ( EnvoyerCom(Chaine) )
               printf (" Trame envoyee correctement.\n") ;
            else
               printf(" Erreur envoi trame.\n") ;
            break ;
  
            case 2:
            printf("\n Vous avez decide de fermer le port de communication.\n") ;
            if (FermerCom())
               printf ("\n Fermeture du port avec succes.\n\n") ;
            else
               printf("\n Fermeture du port echouee.\n\n") ;
            Sortie = FALSE ;
            return SortieRetour ;
            break ;
           
  
            case 3:
            printf("\n Vous avez decide de revenir au menu precedent.\n") ;
            /*if (FermerCom())
               printf ("\n Fermeture du port avec succes.\n\n") ;
            else
               printf("\n Fermeture du port echouee.\n\n") ;*/
            Sortie = FALSE ;
            return SortieRetour ;
            break ;   
                    
          
            default:
            system("cls");
            printf("\n Mauvaise touche, essayer de nouveau !! \n") ;
            break ;
         }
      }               
}

2 réponses

Messages postés
2
Date d'inscription
jeudi 10 mars 2005
Statut
Membre
Dernière intervention
28 avril 2009

up!
Messages postés
7
Date d'inscription
dimanche 20 janvier 2008
Statut
Membre
Dernière intervention
3 septembre 2009

salut,

je travail a partir du meme programme que toi pour envoyer et recevoir des trames sur le port com 1, je souhaite également envoyer des infos dur le ports com 2 ! effectivement je bloque un peu pour ouvrir ce port j'ai fait une fct qui reprend ouvrircom en mettant    DCB g_DCB; // structure dcb du port
                                                DCB g_DCB2; // structure dcb du port
                                                HANDLE g_hCom = 0; // handle de la com
                                                HANDLE g_hCom2 = 0; // handle de la com

mais pour le momment ca ne fct pas la fct creatfile me return false!

si jamais tu as avancé sur ton programme peux tu me tenir au courant !

en te remerciant,