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

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 66
    Points : 39
    Points
    39
    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 sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

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

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

    Informations forums :
    Inscription : Janvier 2010
    Messages : 66
    Points : 39
    Points
    39
    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 éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Points : 909
    Points
    909
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 66
    Points : 39
    Points
    39
    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 éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Points : 909
    Points
    909
    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é...).

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 66
    Points : 39
    Points
    39
    Par défaut
    Citation Envoyé par Astartee Voir le message
    Dans ma version d'Eclipse :
    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é...).
    Merci pour cette aide précieuse , effectivement j'ai changer le nom de mon paramètre "com" par "port" .

    Je n'arrive toujours pas a compiler le programme, et voila ce que j'obtiens :
    Error loading win32com: java.lang.UnsatisfiedLinkError: no win32com in java.library.path
    Exception in thread "main" java.lang.NullPointerException
    at configPort.PortCom.<init>(PortCom.java:32)
    at main.maintest.main(maintest.java:25)


    Pour la lib. Win32driver.dll , elle se situe dans mon répertoire Librairie ainsi que la lib. javax.comm jar ...J'ai ajouté la jar a mon projet mais la dll je ne vois pas comment l'ajouter ??

    Encore merci pour le temps que tu m'accorde !

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Points : 909
    Points
    909
    Par défaut
    Citation Envoyé par makia42 Voir le message
    Pour la lib. Win32driver.dll , elle se situe dans mon répertoire Librairie ainsi que la lib. javax.comm jar ...J'ai ajouté la jar a mon projet mais la dll je ne vois pas comment l'ajouter ??
    Une petite recherche m'a donné ça, je ne sais pas si ça marche.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 66
    Points : 39
    Points
    39
    Par défaut
    Citation Envoyé par Astartee Voir le message
    Une petite recherche m'a donné ça, je ne sais pas si ça marche.
    Un grand MERCI à toi Astartee, pour ta patience envers les newbies comme moi ^^ !

    Le programme marche je vais essayer de voler de mes propre ailes maintenant ( et essayer de pas me prendre d'autre murs )

    @+
    Merci encore

+ 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