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

Java Discussion :

rs232 fin de données


Sujet :

Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 44
    Par défaut rs232 fin de données
    Bonjour,
    J'ai créé un programme qui permet de récupérer les données d'un appareil à l'aide d'une liaison série rs232. Ce programme ne fonctionne pas quand je veux récupérer la totalité des données.

    Quand je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (int i=0; i<20; i++)
    {
      br = new BufferedReader(new InputStreamReader(port.getInputStream()));
      s += " " + br.readLine();
    }
    le programme fonctionne mais quand je veux récupérer la totalité des données à l'aide de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while((br.readLine()) != null)
    {
      br = new BufferedReader(new InputStreamReader(port.getInputStream()));
      s += " " + br.readLine();
    }
    ça ne fonctionne plus. Le programme est bloqué et aucune erreur ne s'affiche.

    Je précise que je ne connais pas d'avance la longueur totale des données.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2009
    Messages : 112
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while((br.readLine()) != null)
    {
    br = new BufferedReader(new InputStreamReader(port.getInputStream()));
    s += " " + br.readLine();
    }
    Pourquoi instancier ton BufferedReader à chaque tour de boucle ? Il vaut mieux le créer avant le while une fois pour toute (et ne pas oublier de le ferner).

    Utilise plutôt un StringBuilder pour concaténer les lignes, c'est plus efficace.

    Tu ne récupères qu'une ligne sur deux dans s vu que tu ne stockes pas celle lue dans la condition de ton while. Tu devrais stocker le résultat de readLine dans une variable et exploiter cette variable.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 44
    Par défaut re
    J'ai essayé et c'est pire qu'avant.
    J'ai rajouter un println pour voir dans la console ce qui se passe et maintenant il n'y a plus rien du tout.

    Mon code complet :
    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
     
    import java.io.*;
     
    import javax.comm.*;
     
    import com.sun.comm.Win32Driver;
     
    public class connection {
    	CommPortIdentifier portId;
    	static SerialPort port;
    	static InputStream in;
    	static BufferedReader br;
    	String donnees;
    	String s;
     
    	public connection() throws IOException, NoSuchPortException, PortInUseException, UnsupportedCommOperationException {
    		//initialisation du driver
    		Win32Driver w32Driver= new Win32Driver();
    		w32Driver.initialize();
     
    		//récupération du port
    		try{
    			portId=CommPortIdentifier.getPortIdentifier("COM2");
     
    		//ouvrir le port
     
    			port=(SerialPort)portId.open("Mon_Appli", 20000);
     
    		//paramétrer le port
    			port.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
    			port.setSerialPortParams
    					(9600,
    					SerialPort.DATABITS_8,
    					SerialPort.STOPBITS_1,
    					SerialPort.PARITY_NONE);
     
    		//gérer le flux d'entrée 
    			in = port.getInputStream();
     
    		//lire les données
    			br = new BufferedReader(new InputStreamReader(in));
    			s = br.readLine();
     
    			while((donnees = br.readLine()) != null);
    				{
    					s += " " + donnees;					
    					System.out.println(s);
    				}
     
    		//écrire les données
    			fichier("c:\\test.txt",s);
    		}finally
    		{	
    		close();
    		}
    	}
     
    	//écrire les données dans un fichier
    	public void fichier(String monFichier, String mesDonnees)
    	{
    		FileWriter fw;
    		try {
    			fw = new FileWriter(monFichier, true);
    		BufferedWriter bw = new BufferedWriter(fw);
    		bw.write(mesDonnees);
    		bw.newLine();
    		bw.close();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
     
     
    	public static void close()
    	{
    		try {
    			in.close();
    			br.close();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		port.close();
    	}
     
     
    	public static void main(String[] args) throws IOException, NoSuchPortException, PortInUseException, UnsupportedCommOperationException 
    	{
    		new connection();
    //		new Interface();
    	}
    }

  4. #4
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2009
    Messages : 112
    Par défaut
    Essaye avec ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    br = new BufferedReader(new InputStreamReader(in));
    StringBuilder stringBuilder = new StringBuilder();
    s = br.readLine();
     
    while (s != null) {
       stringBuilder.append(s);
       System.out.println(s);
       s = br.readLine();
    }

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 44
    Par défaut re
    J'ai mis ton code et ça affiche dans la console.
    Mais l'affichage s'arrete au bout d'un moment mais le code ne s'arrete pas. Je ne sais pas si ça vient du fait qu'il y a trop de données et qu'il ne continue pas jusqu'à ce qu'il y ai un null parce qu'il n'y a plus de place.

  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
    Le readLine n'est pas une bonne idée : il va lire jusqu'à atteindre le caractère 0x0A ou 0x0D selon l'OS, et ne va pas mettre les caractères de terminaisons dans le résultat. Tu devrais lire des blocs de données via la méthode "read".
    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
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 44
    Par défaut re
    ça ne doit pas etre le manque de place. J'ai enlevé les espaces et le dernier chiffre est le meme dans la console.
    Je ne vois pas le problème...

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 44
    Par défaut re
    je ne peux pas utiliser read car je ne connais pas la longueur de mes données. Je ne sais pas quelle fin donner.

  9. #9
    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 isa3000 Voir le message
    je ne peux pas utiliser read car je ne connais pas la longueur de mes données. Je ne sais pas quelle fin donner.
    Justement si : tu peux utiliser la lecture par bloc. Tu déclares un tableau de 1024 "char" par exemple. Puis tu lis autant de fois que nécessaire en remplissant ce buffer et en le donnant à un java.io.CharArrayWriter.
    Après la boucle, le CharWriter va te donner le tableau complet via la méthode "toCharArray".
    Ou encore mieux si c'est possible : traiter directement le flux de données sans passer par un tableau gigantesque contenant toutes les données. Tout dépend de ce que tu fais des données récoltées.
    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.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 44
    Par défaut re
    Pour la fin du while j'ai déjà essayé : "", " ", null, 0 selon le cas et aucun n'a fonctionné. La console arrete d'afficher les donnees du println mais le programme ne passe pas à l'enregistrement dans le fichier. Ca bloque avant. Je ne sais plus quoi faire. J'ai essayé le CharArrayWriter mais ça ne m'a pas fait avancer plus loin dans le programme...

  11. #11
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2009
    Messages : 112
    Par défaut
    Si tu parles de la condition d'arrêt pour la méthode read, c'est avec -1 qu'il faut tester.

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 44
    Par défaut re
    en fait j'avais testé null, "" et " " avec readLine.
    entretemps j'ai essayé read avec -1 et c'est pas mieux.
    Pour l'instant j'ai remplacé par un for (int i=0; i<2000; i++) pour pouvoir continuer.
    Merci à tous pour vos réponses.

  13. #13
    Membre expérimenté Avatar de Torg666
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 230
    Par défaut
    Tu devrai mettre un SerialPortEventListener sur ton serialport, car tu n'aura la fin de lecture des données que lorsque ton appareil sera arreter (ou que tu ferme toi meme le port ou le flux):

    Petit exemple:
    (connexionCom est un objet qui contient mes parametres de connexion)
    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
     
    	/**
             * Fonction pour ouvrir le port COM
             */
    	private void ouvrirPort() {
    		try{
    			w32Driver.initialize();
    			portId = CommPortIdentifier.getPortIdentifier(connexionCom.getPortCom());
    			serialPort=(SerialPort)portId.open("Pesage",2000);
    			serialPort.setSerialPortParams(connexionCom.getJavaBauds(),connexionCom.getJavaDatabit(),connexionCom.getJavaBitStop(),connexionCom.getJavaParite());
    			try {
    				serialPort.addEventListener(new ComCarteReception(this));
    			} catch (TooManyListenersException tmle) {
    				tmle.printStackTrace();
    			}
    			serialPort.notifyOnDataAvailable(true);
    		} catch (UnsupportedCommOperationException ucoe) {
    			ucoe.printStackTrace();
    		} catch (PortInUseException piue) {
    			piue.printStackTrace();
    		} catch (NoSuchPortException nspe) {
    			nspe.printStackTrace();
    		}
    	}
    Exemple d'implementation:
    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
     
    public class CommCarteReception implements SerialPortEventListener{
    private Gestionnaire 			gestionnaire=null;
    private BufferedReader 			fluxLecture=null;
    /*
     * Constructeur
     */
    	public CommCarteReception(Gestionnaire gestionnaire){
    		try {
                                          this.gestionnaire=gestionnaire;
    			fluxLecture=new BufferedReader(new InputStreamReader(this.gestionnaire.getSerialPort().getInputStream()));
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    	@Override
    	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.BI : break;
    			case SerialPortEvent.OE : break;
    			case SerialPortEvent.FE : break;
    			case SerialPortEvent.PE : break;
    			case SerialPortEvent.CD : break;
    			case SerialPortEvent.CTS : break;
    			case SerialPortEvent.DSR : break;
    			case SerialPortEvent.RI : break;
    			case SerialPortEvent.OUTPUT_BUFFER_EMPTY : break;
    			case SerialPortEvent.DATA_AVAILABLE :
    //ici il lis les données qd elle sont disponibles
    System.out.println((String)fluxLecture.readLine());
    break;
    }
    }
    En esperant que ca t'aide.

  14. #14
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 77
    Par défaut
    il faut pas faire la concaténation des String avec s+ = ....
    Essai avec "StringBuffer"

    StringBuffer s = new StringBuffer();
    s.append("blabla");

    Bon courage..

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

Discussions similaires

  1. Crystal Report et ,00 à la fin des données
    Par imen-ing dans le forum C#
    Réponses: 0
    Dernier message: 11/06/2011, 16h52
  2. Réponses: 10
    Dernier message: 28/03/2010, 12h30
  3. La fin de données d'une feuille Excel
    Par aelmalki dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/12/2009, 12h04
  4. [RS232] Procédure d'acquisition de données sur port serie
    Par kazaboua dans le forum Composants
    Réponses: 6
    Dernier message: 12/05/2007, 11h55
  5. lire les données sur un port RS232
    Par xave dans le forum Langage
    Réponses: 6
    Dernier message: 06/10/2005, 16h40

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