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

avec Java Discussion :

Communication RS232 java


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 66
    Par défaut Communication RS232 java
    Bonjour tout le monde,

    Voila je suis débutant sur java et j'ai par chance récupérer sur un tutoriel (http://christophej.developpez.com/tu...java/javacomm/) le code qui m'aiderais à communiquer avec mon PIC18F2580 par liaison RS232 .

    Seulement lorsque je compile mon appli. j'ai une erreur (bien que je n'ai pas modifier le code donné sur le tuto) voici l'erreur que j'obtiens :
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0

    Voici le code que j'ai récupérer (et légérement modifier niveau des classe name) :
    Classe PortCom pour configurer la communication le port série :
    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
    import javax.comm.*;
    import com.sun.comm.Win32Driver;
    import java.io.*;
     
    	public class PortCom {
    		private BufferedReader bufRead; //flux de lecture du port
    		private OutputStream outStream; //flux d'écriture du port
    		private CommPortIdentifier portId; //identifiant du port
    		private SerialPort sPort; //le port série
    		String port = null;
     
    	 public PortCom(String com){
    		//initialisation du driver
    			Win32Driver w32Driver = new Win32Driver();
    			w32Driver.initialize();
    			//récupération de l'identifiant du port
    			try {
    				portId = CommPortIdentifier.getPortIdentifier(port);
    			} catch (NoSuchPortException e) {
    			}
    			//ouverture du port
    			try {
    				sPort = (SerialPort) portId.open("PortCom", 30000);
    			} catch (PortInUseException e) {}
    			//règle les paramètres de la connexion
    			try {
    				sPort.setSerialPortParams(
    					9600,
    					SerialPort.DATABITS_8,
    					SerialPort.STOPBITS_1,
    					SerialPort.PARITY_NONE);
    			} catch (UnsupportedCommOperationException e) {}
    			//récupération du flux de lecture et écriture du port
    			try {
    				outStream = sPort.getOutputStream();
    				bufRead =
    					new BufferedReader(
    						new InputStreamReader(sPort.getInputStream()));
    			} catch (IOException e) {}
    		}
    		/** 
                     * Méthode de communication.
                     */
    		public String communique(char envoie) {
    			String temp = null;
    			try {
    				outStream.write((int) envoie);
    				temp = bufRead.readLine().trim();
    			} catch (IOException e) {}
    			return temp;
    		}
    		/**
                     * Méthode de fermeture des flux et port.
                     */
    		public void close(){
    			try {
    				bufRead.close();
    				outStream.close();
    			} catch (IOException e) {
    			}
    			sPort.close();
    		}	 
    }
    Et classe de test :
    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
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
     
    import configPort.*;
     
    /**
     * @author Administrateur
     *
     */
    public class maintest {
     
    	/**
             * @param args
             */
    	public static void main(String[] args) {
     
    		String port = args[0];
     
    		//Construction de l'interface 
    		PortCom utilFlux = new PortCom(port);
     
    		//"interface utilisateur"
    		System.out.println("taper q pour quitter, ou ENTER pour la temp");
    		//construction flux lecture
    		BufferedReader clavier =
    			new BufferedReader(new InputStreamReader(System.in));
    		//lecture sur le flux entrée.
    		try {
    			String lu = clavier.readLine();
    			while (!lu.equals("q")) {
    				System.out.println(utilFlux.communique('$'));
    				lu = clavier.readLine();
    			}
    		} catch (IOException e) {}
    		utilFlux.close();
    	}
     
    }
    Merci pour vos réponses !

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    commence par nous donner le stacktrace complet de l'exception

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 66
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    commence par nous donner le stacktrace complet de l'exception
    Salut,

    Je ne vois pas de quoi il s'agit si tu peut m'en dire plus sur ce qu'est le stacktrace?
    Je sais seulement qu'en mode debug le stacktrace retourné est null ?

    Merci

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Par défaut
    Citation Envoyé par makia42 Voir le message
    Je ne vois pas de quoi il s'agit si tu peut m'en dire plus sur ce qu'est le stacktrace?
    Le stacktrace c'est l'information sur la chaîne d'appels de fonctions qui a abouti à l'exception : telle méthode a appelé telle méthode qui a appelé telle méthode qui a levé une exception... Ça permet de mieux savoir ce qui s'est passé.
    On peut l'obtenir directement dans la sortie d'erreur avec l'instruction instanceDException.printStackTrace().


    Ceci dit, ici l'exception a été levée directement dans main donc le stacktrace ne nous donnera pas plus d'infos (à part peut-être la ligne exacte où a été levée l'exception)


    Je suppose que l'instruction posant problème est la suivante : String port = args[0];
    Si tu n'as pas donné d'argument en lançant l'exécution, le tableau args sera de taille 0 et donc l'indice 0 sera effectivement "out of bounds".

    Comment as-tu lancé l'exécution ?
    Si c'est en ligne de commande il faut donner les arguments après le nom de la classe: java maintest leNomDuPortAUtiliser.
    Si c'est via un EDI (Eclipse ? Netbeans ?) il y a un champ quelque part dans les options de lancement qui permet d'ajouter tes arguments.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 66
    Par défaut
    Citation Envoyé par Astartee Voir le message
    Le stacktrace c'est l'information sur la chaîne d'appels de fonctions qui a abouti à l'exception : telle méthode a appelé telle méthode qui a appelé telle méthode qui a levé une exception... Ça permet de mieux savoir ce qui s'est passé.
    On peut l'obtenir directement dans la sortie d'erreur avec l'instruction instanceDException.printStackTrace().


    Ceci dit, ici l'exception a été levée directement dans main donc le stacktrace ne nous donnera pas plus d'infos (à part peut-être la ligne exacte où a été levée l'exception)


    Je suppose que l'instruction posant problème est la suivante : String port = args[0];
    Si tu n'as pas donné d'argument en lançant l'exécution, le tableau args sera de taille 0 et donc l'indice 0 sera effectivement "out of bounds".

    Comment as-tu lancé l'exécution ?
    Si c'est en ligne de commande il faut donner les arguments après le nom de la classe: java maintest leNomDuPortAUtiliser.
    Si c'est via un EDI (Eclipse ? Netbeans ?) il y a un champ quelque part dans les options de lancement qui permet d'ajouter tes arguments.
    Effectivment l'erreur vient bien de l'instruction String port = args [0];
    J'utilise Eclipse mais je ne comprend pas vraiment quel argument placer et pourquoi il faut un argument au port?

    Merci,

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Par défaut
    Citation Envoyé par makia42 Voir le message
    J'utilise Eclipse mais je ne comprend pas vraiment quel argument placer
    Dans ma version d'Eclipse :
    Cliquer sur "Run..." dans le menu "Run", ce qui ouvre une fenêtre permettant de configurer les options de lancement.
    Dans l'onglet "Arguments", ajouter le nom du port dans le champ "Program arguments".


    Citation Envoyé par makia42 Voir le message
    et pourquoi il faut un argument au port?
    Parce que c'est ton programme qui le demande...
    Il va récupérer la chaîne de caractère que tu lui donnes en argument (port = args[0]) puis l'utiliser pour créer un nouvel objet PortCom (new PortCom(port)).
    Dans le tutoriel il est indiqué : la ligne de commande attend en argument le nom du port où la balance est connectée (COM1 par exemple).

    Par contre, attention, je viens de lire de plus près le code que tu as posté, et tu as fait des erreurs en copiant le tutoriel (parce que là le paramètre com du constructeur n'est jamais utilisé...).

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

Discussions similaires

  1. Communication RS232
    Par pedro_59 dans le forum LabVIEW
    Réponses: 4
    Dernier message: 02/08/2007, 11h25
  2. Communication entre java et VB : prob de socket
    Par haffouff dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 30/04/2007, 23h14
  3. Réponses: 2
    Dernier message: 26/07/2006, 12h28
  4. Communication RS232 avec un PIC via delphi
    Par JeanPh dans le forum API, COM et SDKs
    Réponses: 22
    Dernier message: 09/08/2004, 22h56
  5. Communication C-Java avec Orbit
    Par damsh dans le forum CORBA
    Réponses: 4
    Dernier message: 05/06/2004, 00h24

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