IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

[Port Série] Redirection d'un port COM


Sujet :

Entrée/Sortie Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 109
    Points : 57
    Points
    57
    Par défaut [Port Série] Redirection d'un port COM
    Bonjour à tous!

    J'utilise dans un programme java l'API javax.comm pour lire des infos venant d'un recepteur gps USB (détecté sur un port série virtuel).
    Tout fonctionne trés bien (ouverture du port COM, lecture des données puis fermeture sans problème!).
    Cependant je voudrais savoir si il existe une solution détecter et configurer le port COM automatiquement.
    Je m'explique : a ce stade l'utilisateur doit remplir un fichier de config que j'ai créé en y renseignant le numéro du port COM sur lequel est monté le recepteur GPS ainsi que le debit de la liaison.
    Est-ce qu'il y a donc une méthode pour rediriger le port COM ou bien scanner les ports série, afin de répérer le recepteur et donc que l'utlisateur n'est plus de fichier de config a remplir?
    Merci d'avance.

  2. #2
    Membre chevronné Avatar de Mister Nono
    Homme Profil pro
    Ingénieur Mathématiques et Informatique
    Inscrit en
    Septembre 2002
    Messages
    2 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Mathématiques et Informatique
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 232
    Points : 1 897
    Points
    1 897
    Par défaut
    Tu tests les port disponibles avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Enumeration listePorts = CommPortIdentifier.getPortIdentifiers();
    
    while (listePorts.hasMoreElements())
    {
    CommPortIdentifier portID = (CommPortIdentifier) (CommPortIdentifier) listePorts.nextElement();
                    
    if (portID.getPortType() == typePort && !portID.isCurrentlyOwned())
    {
      // ici test périphérique
    }
    ... dans la boucle if, tu envoies une question sur le port trouvé et tu attends une réponse. Si tu reçoies la réponse attendue, c'est que tu as trouvé le bon port avec le bon périphérique branché dessus.

    Salut.
    La connaissance ne sert que si elle est partagée.
    http://ms2i.net

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 109
    Points : 57
    Points
    57
    Par défaut
    Merci Mister Nono pour ta réponse!
    Par contre je ne comprends pas ta ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (portID.getPortType() == typePort && !portID.isCurrentlyOwned())
    D'ou sort le typePort? Est-ce que c'est moi qui doit indiquer de quel type de port il s'agit?

    Merci

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 109
    Points : 57
    Points
    57
    Par défaut
    Bon du coup il me semble que getPortType() retourne un int (1=port COM et 2=LPT).
    Par contre si il y a plusieurs appareils qui utilise un port COM comment être sur que je m'adresse bien au bon?
    Car la fonction isCurrentlyOwned() renvoie juste vrai ou faux si le périphérique est utilisé!
    Merci d'avance!

  5. #5
    Membre chevronné Avatar de Mister Nono
    Homme Profil pro
    Ingénieur Mathématiques et Informatique
    Inscrit en
    Septembre 2002
    Messages
    2 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Mathématiques et Informatique
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 232
    Points : 1 897
    Points
    1 897
    Par défaut
    Et oui, typePort est une variable de type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CommPortIdentifier.PORT_SERIAL
    A+
    La connaissance ne sert que si elle est partagée.
    http://ms2i.net

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 109
    Points : 57
    Points
    57
    Par défaut
    Bon du coup j'essaye de faire une lecture du port série sur évènements comme dans le tutoriel :
    http://christophej.developpez.com/tu...vacomm/#L2.3.3

    La technique c'est que je scanne donc tous les ports série et test si il y a des datas format NMEA (trames du recpteur GPS) qui arrivent du port COM en question. (J'ai pas trouver mieux!)

    J'ai juste un petit souci maintenant : j'arrive bien a trouver mon recepteur GPS mais mon prog plante une fois les trames lues! Je reste bloqué dans la structure switch qui gère les évènements!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
     
    import javax.comm.*;
    import java.util.*;
    import java.math.*;
    import java.net.*;
    import com.sun.comm.Win32Driver;
    import java.io.*;
     
    public class testCOM implements SerialPortEventListener {
     
        private String portCOM;
        private CommPortIdentifier portID = null; //identifiant du port
        private SerialPort serialPort; //le port série
        private BufferedReader fluxLecture; //flux de lecture du port
     
     
    	/*
    	 * Methode qui initialise le port série en evenementiel
    	 */
    	public void ModeEvenement(String portCOM) {
    		//récupération de l'identifiant du port
    		try {
    			portID = CommPortIdentifier.getPortIdentifier(portCOM);
    		} catch (NoSuchPortException e) {
    		}
     
    		//ouverture du port
    		try {
    			serialPort = (SerialPort) portID.open("ModeEvenement", 2000);
    		} catch (PortInUseException e) {
    		}
     
    		//récupération du flux
    		try {
    			fluxLecture =
    				new BufferedReader(
    					new InputStreamReader(serialPort.getInputStream()));
    		} catch (IOException e) {}
     
    		//ajout du listener
    		try {
    			serialPort.addEventListener(this);
    		} catch (TooManyListenersException e) {
    		}
    		//paramétrage du port
    		serialPort.notifyOnDataAvailable(true);
    		try {
    			serialPort.setSerialPortParams(
    				4800,
    				SerialPort.DATABITS_8,
    				SerialPort.STOPBITS_1,
    				SerialPort.PARITY_NONE);
    		} catch (UnsupportedCommOperationException e) {}
    		System.out.println("port ouvert, attente de lecture");
    	}	
     
        /*
         * Methode qui effectue la lecture de 7 trames sur le port série
         * Une fois la lecture faite on ferme le flux de lecture et le port COM
         */
        public void ReadSerialPort(){
        	int i=7;
        	String reponse = new String();
     
    		try {
    			System.out.println("i="+i);
    			while(i!=0){
    				System.out.println("On lit sur le port COM\n");
    				reponse = (String) fluxLecture.readLine();
    				System.out.println(reponse);
    				i--;
    				System.out.println("i="+i);
    			}
    		} catch (IOException e) {}
    		//fermeture du flux de lecture
    		try {
    			fluxLecture.close();
    		} catch (IOException e) {}
    		//fermeture du port COM
    		serialPort.close();
    	}
     
    	public void serialEvent(SerialPortEvent event) {
    		//gestion des événements sur le port :
    		//on ne fait rien sauf quand les données sont disponibles
    				switch (event.getEventType()) {
    			case SerialPortEvent.DATA_AVAILABLE :
    				this.ReadSerialPort();//si data dispo on lance la lecture
    				break;
    			default:
    				break;//on ne fait rien pour les autres evenements
    		}
    	}
     
        /*
         * Methode qui scanne tous les ports COM et test si des données viennent du port COm scanné
         */	
    	public void listPort(){
    		Enumeration listePorts = CommPortIdentifier.getPortIdentifiers();
    		int typePort;
    		String GPSPortCOM;
     
    		while (listePorts.hasMoreElements()){
    			portID = (CommPortIdentifier) (CommPortIdentifier) listePorts.nextElement();
    			if(portID.getPortType()==CommPortIdentifier.PORT_SERIAL){    
      				System.out.println("Nom du PORT :"+portID.getName());
      				System.out.println("User :"+portID.getCurrentOwner());
      				System.out.println("Use ? :"+portID.isCurrentlyOwned());
      				System.out.println("Type du PORT :"+portID.getPortType());
      				// On lance la gestion des évènements sur portID
    				this.ModeEvenement(portID.getName());
    			}
    		}
    	}
     
    	public static void main(String[] args) {
    		//initialisation du driver
    		Win32Driver w32Driver = new Win32Driver();
    		w32Driver.initialize();
     
    		testCOM test = new testCOM();
    		test.listPort();
    	}
    }
    Je ne sais pas si j'ai été assez clair! Mais si quelqu'un a une idée je suis preneur!!!
    Merci d'avance.

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    En ce qui concerne ton bug, n'aurai-tu pas oublié de fermer les ports ensuite?

    De plus, j'aurai une question concernant l'exécution de ton code. je bosse avec la même API et je switch de port en port grâce à la boucle :

    while (listePorts.hasMoreElements()){ }

    Est-ce normal qu'il repasse 2 fois sur les ports COM (j'en ai 3 donc il fait COM1 COM2 COM3 COM1 COM2 COM3)?. Le code déclenche donc une exception pour les 3 derniers ports.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 109
    Points : 57
    Points
    57
    Par défaut
    Oui j'avais exactement le même problème!
    Du coup j'ai laissé comme dans l'exemple du tuto un thread pour la gestion des évènements. J'ai juste ajouté un verrou pour la synchronisation avec le thread!
    Voici mon code fini maintenant ça a l'air de marcher pas trop mal:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    public class ScanCOM {
     
    	public final static Object LOCK = new Object();
    	private String portCOM;
        private CommPortIdentifier portID = null; //identifiant du port
        private boolean running;
     
    	public String listport(){
    		//initialisation du driver
    		Win32Driver w32Driver = new Win32Driver();
    		w32Driver.initialize();
     
    		Enumeration listePorts = CommPortIdentifier.getPortIdentifiers();
    		System.out.println("Recherche du GPS");
    		while (listePorts.hasMoreElements()){
    			portID = (CommPortIdentifier)listePorts.nextElement();
    			if(portID.getPortType()==CommPortIdentifier.PORT_SERIAL){   
      				System.out.println("Test du Port "+portID.getName()+"\n");
     
      				//On lance le thread de gestion des evenements
      				ModeEvenement modeEve=new ModeEvenement(portID);
    				modeEve.start();
     
    				//Et on attend la fin de celui-ci
    				try {
          				synchronized(LOCK) {
            				LOCK.wait();
          				}
        			} catch (InterruptedException e) {
        				System.out.println("Probleme de Synchronisation du Thread\n");
        			}
     
        			if(modeEve.foundGPS()){
        				System.out.println("GPS sur port "+portID.getName());
        				portCOM=portID.getName();
        			}	
    			}
    		}
    		return portCOM;
    	}	
    	public static void main(String[] args) {
    		String test;
    		//lancement de l'appli
    		ScanCOM scan = new ScanCOM();
    		test = scan.listport();
    		System.out.println("Resultat final:"+test);
    	}
    }
    Et dans le thread :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    public void run() {
    		running = true;
    		while (running) {
    			try {
    				Thread.sleep(2500);
    			} catch (InterruptedException e) {
    			}
    			this.stopThread();
    		}
    		//fermeture du flux et port
    		try {
    			fluxLecture.close();
    		} catch (IOException e) {
    			System.out.println("Impossible de fermer le flux de lecture!\n");
    			}
    		serialPort.close();
    		//Debloquage du Thread qui scanne les ports COM
    		synchronized(ScanCOM.LOCK) {
          		ScanCOM.LOCK.notify();
        	}
    	}

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Acquisition port série COM 1
    Par kerozen77 dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 18/04/2013, 13h06
  2. API, COM, Port Série
    Par RATIB dans le forum API, COM et SDKs
    Réponses: 0
    Dernier message: 09/08/2012, 16h45
  3. Réponses: 6
    Dernier message: 07/01/2009, 08h04
  4. Port USB utilisé comme 1 port série
    Par Arnaud Malabeux dans le forum C++
    Réponses: 2
    Dernier message: 06/06/2006, 11h03
  5. Réponses: 11
    Dernier message: 29/03/2006, 16h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo