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 :

Problème RS232 inputstream


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2004
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 35
    Par défaut Problème RS232 inputstream
    Bonjour à tous,

    Voilà j'ai un petit programme qui lit les données provenant d'un télémètre laser via le port rs232 de mon PC, jusqu'ici tout va bien l'inconvénient c'est que au bout d'un moment j'ai l'impression que les trames que je récupère ne sont plus valide.
    Je me suis dis que ça venait peut être du télémètre mais si je me déconnecte puis me reconnecte les trames sont de nouveau bonnes.
    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
     
    private CommPortIdentifier portId = null;
    private SerialPort port = null;
    private InputStream in = null;
    private OutputStream out = null;
     
            public RS232_PROXI() {
    	initCom();
    }
     
    /**
     * initialisation des paramètres de communication
     */
    	public void initCom(e) {
    		// initialisation du driver
    		Win32Driver w32Driver = new Win32Driver();
    		w32Driver.initialize();
     
    		// récupération du port COM
    		try {
    			portId = CommPortIdentifier.getPortIdentifier("COM1");
    		} catch (NoSuchPortException ex) {
    			// traitement de l'exception
                           System.out.println("pb récupération port "    +     portId.getName());
    		}
    		try {
    				port = (SerialPort) portId.open("PROXI", 5000);
    		} catch (PortInUseException ex) {
    			// traitement de l'exception
    			System.out.println("pb ouverture port " + portId.getName());
    			}
     
    		// paramétrage du port
    			try {
    				                                                                                              port.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
                          port.setSerialPortParams(19200, SerialPort.DATABITS_8,
    				SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);	
                         } catch (UnsupportedCommOperationException ex) {
    				// traitement de l'exception
                                      System.out.println("pb paramétrage port " + portId.getName());
    			}
    		// création des flux
    			try {
    				out = port.getOutputStream();
    				in = port.getInputStream();
    			} catch (IOException ex) {
    				// traitement de l'exception
    				System.out.println("pb création des flux " + portId.getName());
    			}
    	}
     
    	protected void closeCom() {
    		try {
    			in.close();
    			out.close();
    			port.close();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
     
    	/**
             * Récupération du flux entrant pour mon port COM
             * 
             * @return InputStream
             */
    	public InputStream getIn() {
    		return in;
    	}
    ci dessus le code que j'utilise pour le paramétrage et la création des flux sur mon port COM et ci dessous l'utilisation que je fais de mon inputStream.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public void run()
    {
    	while(continu)
    	{
    		try {
    			n = in.read();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		switch(n){
                           // Traitement des données
                    }
            }
    quelqu'un aurait il déjà rencontré ce problème ou existe t-il un moyen pour réinitialiser mon inputstream sans devoir tout fermer pour les réouvrir

    Merci

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    La vitesse de lecture spécifiée est peut-être trop élevée ?
    ou alors un bug dans ton traitement des données ? Tu as tenter d'afficher les données brut avant traitement et de vérifier si des données sont perdues ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2004
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 35
    Par défaut suite de mon pb
    Bonjour,

    Je vais tenter de changer la vitesse l'inconvénient c'est que je vais devoir attendre demain pour voir le résultat quant à mon traitement je suis à 100% sûr qu'il est bon je ne fais que ajouter à une String.

    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
     
    try {
    					n = in.read();
    				} catch (IOException e) {
    					e.printStackTrace();
    				}
    					switch(n)
    					{
    					case 10 : str+=" LF";
                                                              //Fin de ma trame
    							  //Traitement du message...
    							  str = "";
    							  System.gc();
    							break;
    					case 13 : str+=" CR";
    							break;
    					default : str+=(char)n;
    							break;
    					}

  4. #4
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Juste deux remarques :
    1. ne jamais appeler System.gc(), c'est parfaitement inutile,
    2. ne jamais faire de concaténation de String, il faut utiliser StringBuilder avec "append". La concaténation comme tu le fais créée plusieurs nouvelles instances String à chaque fois.

    Sinon, avant de modifier la vitesse, utilise un BufferedInputStream par dessus ton InputStream. Lire par bloc est plus rapide.
    Peut-être que ton traitement n'est pas assez rapide par rapport aux données qui arrivent ? Quel est le nombre d'octets/seconde généré ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2004
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 35
    Par défaut
    Je reçois 2 trames par seconde, chaque trame faisant 38 octets....

  6. #6
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Citation Envoyé par molding Voir le message
    Je reçois 2 trames par seconde, chaque trame faisant 38 octets....
    Ah ok.... c'est pas la folie de la vitesse... le problème est ailleurs
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 5
    Par défaut
    Bonjour,

    Ce n'est pas le même problème que Molding mais plutot que de recréer un sujet ayant le même nom...

    Voila je développe programme en JAVA chargé de récupérer des trames issues d'un thermomètre sur mon port série.

    J'utilise également un buffer, instance de la classe InputStream, que je vais lire régulièrement en utilisant la méthode "read()" =>

    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
     
    // Port identification
    CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier(_resource.getPort());
     
    			//port opening
    			_sPort = (SerialPort) portId.open("therm", 5000);
     
    			//connection parameters
    			_sPort.setSerialPortParams(
    				_baudRate,
    				_dataBits,
    				SerialPort.STOPBITS_1,
    				_parity);
     
    			//Initialization of input and output buffers 
    			_outStream = _sPort.getOutputStream();
    			_inStream = _sPort.getInputStream();	
     
     
     
    _inStream.read();


    J'affiche ensuite sous l'IDE Eclipse ce que j'ai lu. Si le buffer est vide, la méthode me renvoie "-1" (Ca c'est pour la partie qui va bien).

    Maintenant, j'utilise ce même code avec une plateforme Debian Linux.
    De la même manière, je lis le buffer.
    Problème => cette fois ci, si le buffer est nul, le programme plante lamentablement (pas d'IOException, rien !!)

    Quelqu'un aurait il une solution (Changement de buffer ?)

    Merci d'avance

    Cordialement

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

Discussions similaires

  1. Problème avec InputStream
    Par iliass001 dans le forum Général Java
    Réponses: 7
    Dernier message: 27/02/2013, 12h50
  2. Problème lecture InputStream
    Par IronBibs dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 10/09/2012, 09h08
  3. [C#]Problème d'envoi de caractères spéciaux vers RS232
    Par legillou dans le forum Windows Forms
    Réponses: 5
    Dernier message: 15/11/2007, 17h35
  4. Réponses: 10
    Dernier message: 01/03/2007, 12h39
  5. Réponses: 2
    Dernier message: 02/02/2007, 09h56

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