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 :

Réception port série (API javax.comm)


Sujet :

Entrée/Sortie Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 46
    Par défaut Réception port série (API javax.comm)
    Bonjour à tous,

    Je dialogue via l'API javax.comm avec un port série.

    Je lui envoi des caractères et j'affiche, si il y a lieu, la réponse que je reçois suite à cet envoi.

    C'est justement ici que ça coince, je n'arrive pas à ne rien afficher lorsque aucune réponse ne m'est envoyée...

    J'ai suivi le tuto sur l'API javax.comm de developpez.com.

    Voilà mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public String communique_char(char envoie) {
    	String received = "";
    	try {
    		// envoie du caractère
    		outStream.write(envoie);
    		outStream.write('\n');
    		received = bufRead.readLine().trim();
    	} catch (IOException e) {
    	}
    	return received;
    }
    Je souhaiterais que lorsque je ne reçois aucune réponse, donc lorsque ma chaîne received est null, je puisse lui attribuer une chaîne comme "Rien à afficher" pour ensuite la retourner.

    Mais je ne vois pas comment faire...

    J'ai essayé cela :
    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
    	
    public String communique_char(char envoie) {
    	String received = "";
    	try {
    		// envoie du caractère
    		outStream.write(envoie);
    		outStream.write('\n');
    		try {
    		received = bufRead.readLine().trim();
    		} catch (IOException e){
    			e.printStackTrace();
    		}
    		if (received.equals("")) {
    			received = "Nothing to show";
    		}
    	} catch (IOException e) {
    	}
    	return received;
    }
    Mais cela ne marche pas, mon programme bug en attendant une réponse, cela doit venir de mon bufRead.readLine().trim() qui est vide mais je ne sais pas comment le traiter...

    Quelqu'un aurait une idée ?

    Je vous remercie de l'aide que vous m'apporterez pour résoudre mon problème.

  2. #2
    Membre Expert
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Par défaut
    Bonjour,

    Première remarque: Les catchs vides sont une très bonne pratique.

    La méthode readLine est probabalement bloquante c'est à dire qu'elle retourne que si elle a une réponse ou qu'un timeout est survenu. Dans ce dernier cas, probablement une exception est levée.

    La méthode readLine returne null sous certaines conditions (fin de fichier), donc il n'est pas possible de faire un trim.

    Il manque la définition de la variable bufRead

    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
    	
    public String communique_char(char envoie) {
    	String received = "";
    	try {
    		// envoie du caractère
    		outStream.write(envoie);
    		outStream.write('\n');
    		try {
     		  received = bufRead.readLine();
                      if (received != null) {
                        if (received.trim().length() == 0) {
                          received = "Nothing to show";
                        }
                      }
                      else {
                          received = "Nothing to show";
                      }
    		}
                    // Il faudrait trapper l'exception timeout
                    catch (IOException e){
    		  e.printStackTrace();
    		}
    	}
            catch (IOException e) {
               e.printStackTrace();
    	}
    	return received;
    }

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 46
    Par défaut
    Bonjour jowo,

    J'ai essayé ta proposition mais sans succès.

    Je déclare bufRead dans le constructeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    try {
    	outStream = sPort.getOutputStream();
    	bufRead = new BufferedReader(new InputStreamReader(sPort.getInputStream()));
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    Je ne récupère aucune exception, elle ne s'affiche pas dans la console, j'ai simplement l'interface qui est planté.

    Y aurait-il un moyen comme par exemple un Timeout ou autre qui ne laisserait qu'un certain temps pour exécuter la méthode puis à fin fin de ce laps de temps, la méthode serait stoppée ?

    Merci de ton aide !

  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
    Si l'interface est plantée, c'est que tu traites le flux dans l'EDT, le Thread qui gère entre autre l'affichage graphique.
    Tu dois géré le port série dans un thread séparé.
    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
    Avril 2009
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 46
    Par défaut
    Salut dinobogan, j'ai essayé de faire comme tu as dis c'est-à-dire d'exporter ma méthode d'écriture/lecture sur le port série dans un thread à part.

    Voici comment j'ai fais :

    Méthode pour envoyer un caractère :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public String communique_char(char envoie) {
    	ThreadEnvoi t1 = new ThreadEnvoi(envoie, outStream, bufRead);
    	t1.start();
    	t1.interrupt();
    	while (t1.rReceived() == "" || !t1.getTimeOut()) {
    	}
    	return t1.rReceived();
    }
    Classe ThreadEnvoi :
    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
    public class ThreadEnvoi extends Thread {
    	private String caractere;
    	private OutputStream outputStream;
    	private String received = "";
    	private BufferedReader bufRead;
    	private Boolean timeOut;
     
    	public ThreadEnvoi(char caractere, OutputStream outputStream,
    			BufferedReader bufRead) {
    		this.caractere = "" + caractere;
    		this.outputStream = outputStream;
    		this.bufRead = bufRead;
    		this.timeOut = false;
    	}
     
    	public ThreadEnvoi(String caractere, OutputStream outputStream,
    			BufferedReader bufRead) {
    		this.caractere = caractere;
    		this.outputStream = outputStream;
    		this.bufRead = bufRead;
    		this.timeOut = false;
    	}
     
    	public void run() {
    		TimeOut threadTimeOut = new TimeOut(this);
    		threadTimeOut.start();
    		try {
    			for (int i = 0; i < this.caractere.length(); i++) {
    				outputStream.write(this.caractere.charAt(i));
    			}
    			outputStream.write('\n');
    			received = bufRead.readLine().trim();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		this.interrupt();
     
    	}
     
    	public String rReceived() {
    		return received;
    	}
     
    	public void timeElapsed() {
    		this.timeOut = true;
    	}
     
    	public boolean getTimeOut() {
    		return this.timeOut;
    	}
    }
    Classe TimeOut :
    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
    public class TimeOut extends Thread {
     
    	ThreadEnvoi envoi;
     
    	public TimeOut(ThreadEnvoi envoi) {
    		this.envoi = envoi;
    	}
     
    	public void run() {
    		try {
    			sleep(200); // wait of 200 ms
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    		this.envoi.timeElapsed();
    	}
    }
    Mon problème reste le même car si je ne choisis pas de port série et que j'essaie d'envoyer un caractère alors j'obtiens une erreur qui vient d'une ligne dans le code de ma classe ThreadEnvoi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    outputStream.write(this.caractere.charAt(i));
    Et si je choisis un port alors là j'ai une erreur à cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    received = bufRead.readLine().trim();
    Je sais bien que c'est normal que je récupère ces erreurs mais par contre mon interface plante aussi lors d'une de ces erreurs...

    Je ne sais pas pourquoi car là j'ai bien différencier les 2 parties dans des Threads différents...

    Auriez-vous une idée ?

    Merci d'avance pour votre aide !!

Discussions similaires

  1. Ecrire en hexa sur le port série avec java.comm
    Par theanthony33 dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 15/06/2009, 17h07
  2. Problème API JAVAX.COMM
    Par dude78 dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 10/02/2009, 09h33
  3. [API javax.comm] Problème getInputStream
    Par goddet dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 16/05/2007, 14h32
  4. [API javax.comm] Problème bibliothèque
    Par goddet dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 20/03/2007, 13h40
  5. Probleme avec l'API javax.comm
    Par rousni dans le forum Entrée/Sortie
    Réponses: 11
    Dernier message: 16/06/2006, 12h48

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