Java RXTX Communication Série Arduino OutPutStream
Répondre à la discussion
Affichage des résultats 1 à 5 sur 5

Java RXTX Communication Série Arduino OutPutStream



  1. #1
    leoleoleo24

    Java RXTX Communication Série Arduino OutPutStream


    ------

    Bonjour,

    J'essaie de communiquer via une liaison USB de mon ordinateur avec mon Arduino. J'arrive très bien à recevoir les "Serial.println" de mon arduino. En revanche pour envoyer des données ca ne fonctionne pas et une exception est levée je pense au moment de l'écriture dans l'outputStream. SerialOut.write(avancer.GetByt es())

    Je vous fais parvenir mon code si cela peut vous aider à comprendre (j'ai mis ce qui me semblait le plus important).
    Voici en premier le code arduino :
    Code:
    void reception_donnees(int *index, char buff[4]){
      if(Serial.available()){
        while(Serial.available()){
          unsigned char c = Serial.read();
          buff[*index] = c;
          *index++;
          if(*index>4){
            break;
          }
        }
      }
    }
    
    void traitement_donnees(int *controlPin2, int *controlPin7, int *enablePin, char buff[4]){
      if(strcmp(buff,"1")==0){
        digitalWrite(*controlPin2,HIGH);
        digitalWrite(*controlPin7,LOW);
        Serial.println("RECULER");
      }
      if(strcmp(buff,"0")==0){
        digitalWrite(*controlPin2,LOW);
        digitalWrite(*controlPin7,HIGH); 
        Serial.println("AVANCER");   
      }
      if(strcmp(buff,"2")==0){
        digitalWrite(*enablePin,HIGH); 
        Serial.println("ON");  
      }
      if(strcmp(buff,"3")==0){
        digitalWrite(*enablePin,LOW); 
        Serial.println("OFF");  
      }
    }
    
    void envoi_donnees(int *index){
      if(*index>4){
      Serial.println("La commande envoyée n'est pas reconnu  par le système");
      }
    }
    
    void setup() {
    
      pinMode(3,OUTPUT);
      pinMode(8,OUTPUT);
      pinMode(6,OUTPUT);
      Serial.begin(9600);
      Serial.println("Initialisation...");
    }
    
    void loop() {
      delay(5000);
      Serial.println("En attente d'une commande");
      int index=0;
      char buff[4]={};
      int controlPin2=3;
      int controlPin7=8;
      int enablePin=6;
      reception_donnees(&index,&buff[4]);
      envoi_donnees(&index);
      traitement_donnees(&controlPin2,&controlPin7,&enablePin,&buff[4]);
      
    }
    Et voici le code java :
    Code:
    public void initialize() throws Exception {
    		System.out.println("Initialisation");
    
    		CommPortIdentifier portId = null;
    		//CommPortIdentifier est la classe centrale pour gérer l'accès aux ports de communication
    		System.out.println("Recherche des ports series ouverts...");
    		Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();
    		//Permet d'obtenir une énumération des ports series ouvert du système.
    		
    		System.out.println("Recherche du port série connecté à l'arduino");
    		while (portEnum.hasMoreElements()) {
    		CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement();
    			if (currPortId.getName().equals(PORT_NAME)) {
    				System.out.println("Identification d'un port serie ouvert : " + currPortId.getName());
    				portId = currPortId;
    				break;
    			}
    		}
    			
    		if (portId == null) {
    			System.out.println("Aucun port serie n'est connecté à l'arduino");
    			return;
    		}
    
    		try {
    			// Ouvre la connection
    			serialPort = (SerialPort) portId.open(this.getClass().getName(),TIME_OUT);
    			
    			// Paramétrage du ports
    			serialPort.setSerialPortParams(DATA_RATE,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);
    			System.out.println("Connection Parametree : " + DATA_RATE + ", " + SerialPort.DATABITS_8+", " + SerialPort.STOPBITS_1 + ", " + SerialPort.PARITY_NONE);
    
    			// Ouverture du flux de données entrants et sortants
    			/*La classe InputStreamReader établit un pont entre les flux d'octets et les flux de caractères. 
    			Cette classe permet de lire des octets et les traduit en caractères en utilisant un décodage spécifique.*/
    			input = new BufferedReader(new InputStreamReader(serialPort.getInputStream()));
    			output = serialPort.getOutputStream();
    
    			
    			serialPort.addEventListener(this);
    			serialPort.notifyOnDataAvailable(true);
    			
    		} catch (UnsupportedCommOperationException e) {
    			System.err.println(e.toString());
    			System.out.println("Une exeption a été levé pour une des raisons suivantes :");
    			System.out.println(" - Le propriétaire actuel du port n'a pas liberé l'accès au port : TIME_OUT ");
    			System.out.println(" - Le paramétrage du port est incorrect");
    		} catch (Exception e) {
    			System.err.println(e.toString());
    		}	
    	}
    	
    	/**
    	 * Ferme la connection.
    	 */
    	public synchronized void close() {
    		if (serialPort != null) {
    			serialPort.removeEventListener();
    			serialPort.close();
    			try {
    				output.close();
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    			System.out.println("L'arduino a été déconnecté");
    		}
    	}
    
    	/**
    	 * Ecoute les evenements sur le port serie. Lis la donnée et l'écrit .
    	 */
    	public synchronized void serialEvent(SerialPortEvent oEvent) {
    		if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
    			try {
    				String inputLine=input.readLine();
    				System.out.println(inputLine);
    				serialPort.disableReceiveTimeout();
    				serialPort.enableReceiveThreshold(1);
    			} catch (Exception e) {
    				System.err.println(e.toString());
    			}
    		}
    		// Ignore tous les autres types d'evenements. Pour mieux comprendre aller voir SerialPortEvent.
    	}
    	
    	public static OutputStream getSerialOutput(){
    		return output;
    	}
    }
    je pense que l'erreur est dans le code ci dessus.

    et le code qui ecrit au moment ou on clique sur un bouton de l'interface graphique (non décrit ici)
    Code:
    public class ControlRobot {
    	
    	OutputStream serialOut;
    	
    	public ControlRobot(OutputStream serialOut){
    		this.serialOut=serialOut;
    	}
    	
    	private static final String AVANCER="0";
    	private static final String RECULER="1";
    	private static final String ON="2";
    	private static final String OFF="3";
    	
    
    	public void Avancer() throws IOException{
    		try{
    			serialOut.write(AVANCER.getBytes());
    		} catch(IOException e){
    			System.out.println("La commande pour avancer n'a pas été correctement envoyée");
    		}
    	}
    	
    	public void Reculer() throws IOException{
    		try{
    			serialOut.write(RECULER.getBytes());
    		} catch(IOException e){
    			System.out.println("La commande pour reculer n'a pas été correctement envoyée");
    		}
    	}
    	
    	public void On() throws IOException{
    		try{
    			serialOut.write(ON.getBytes());
    		} catch(IOException e){
    			System.out.println("La commande pour demarrer le moteur n'a pas été correctement envoyée");
    		}
    	}
    	
    	public void Off() throws IOException{
    		try{
    			serialOut.write(OFF.getBytes());
    		} catch(IOException e){
    			System.out.println("La commande pour eteindre le moteur n'a pas été correctement envoyée");
    		}
    	}
    }
    Merci c'est un peu un travail difficile de chercher l'erreur dans tout ce code... j'espère que ca ne sera pas trop difficile pour vous de lire mon code.

    Bonne journée !

    -----

  2. #2
    leoleoleo24

    Re : Java RXTX Communication Série Arduino OutPutStream

    J'ai oublié de vous envoyer l'erreur que m'indique java :

    Initialisation
    Recherche des ports series ouverts...
    Recherche du port série connecté à l'arduino
    Identification d'un port serie ouvert : COM3
    Connection Parametree : 9600, 8, 1, 0
    Initialisation...
    En attente d'une commande
    Exception in thread "JavaFX Application Thread" java.lang.NullPointerException
    at arduinoCommunication.ControlRo bot.On(ControlRobot.java:38)
    at arduinoCommunication.Interface Robot.lambda$5(InterfaceRobot. java:87)
    at com.sun.javafx.event.Composite EventHandler.dispatchBubblingE vent(CompositeEventHandler.jav a:86)
    at com.sun.javafx.event.EventHand lerManager.dispatchBubblingEve nt(EventHandlerManager.java:23 8)
    at com.sun.javafx.event.EventHand lerManager.dispatchBubblingEve nt(EventHandlerManager.java:19 1)
    at com.sun.javafx.event.Composite EventDispatcher.dispatchBubbli ngEvent(CompositeEventDispatch er.java:59)
    at com.sun.javafx.event.BasicEven tDispatcher.dispatchEvent(Basi cEventDispatcher.java:58)
    at com.sun.javafx.event.EventDisp atchChainImpl.dispatchEvent(Ev entDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEven tDispatcher.dispatchEvent(Basi cEventDispatcher.java:56)
    at com.sun.javafx.event.EventDisp atchChainImpl.dispatchEvent(Ev entDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEven tDispatcher.dispatchEvent(Basi cEventDispatcher.java:56)
    at com.sun.javafx.event.EventDisp atchChainImpl.dispatchEvent(Ev entDispatchChainImpl.java:114)
    at com.sun.javafx.event.EventUtil .fireEventImpl(EventUtil.java: 74)
    at com.sun.javafx.event.EventUtil .fireEvent(EventUtil.java:49)
    at javafx.event.Event.fireEvent(E vent.java:198)
    at javafx.scene.Node.fireEvent(No de.java:8413)
    at javafx.scene.control.Button.fi re(Button.java:185)
    at com.sun.javafx.scene.control.b ehavior.ButtonBehavior.mouseRe leased(ButtonBehavior.java:182 )
    at com.sun.javafx.scene.control.s kin.BehaviorSkinBase$1.handle( BehaviorSkinBase.java:96)
    at com.sun.javafx.scene.control.s kin.BehaviorSkinBase$1.handle( BehaviorSkinBase.java:89)
    at com.sun.javafx.event.Composite EventHandler$NormalEventHandle rRecord.handleBubblingEvent(Co mpositeEventHandler.java:218)
    at com.sun.javafx.event.Composite EventHandler.dispatchBubblingE vent(CompositeEventHandler.jav a:80)
    at com.sun.javafx.event.EventHand lerManager.dispatchBubblingEve nt(EventHandlerManager.java:23 8)
    at com.sun.javafx.event.EventHand lerManager.dispatchBubblingEve nt(EventHandlerManager.java:19 1)
    at com.sun.javafx.event.Composite EventDispatcher.dispatchBubbli ngEvent(CompositeEventDispatch er.java:59)
    at com.sun.javafx.event.BasicEven tDispatcher.dispatchEvent(Basi cEventDispatcher.java:58)
    at com.sun.javafx.event.EventDisp atchChainImpl.dispatchEvent(Ev entDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEven tDispatcher.dispatchEvent(Basi cEventDispatcher.java:56)
    at com.sun.javafx.event.EventDisp atchChainImpl.dispatchEvent(Ev entDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEven tDispatcher.dispatchEvent(Basi cEventDispatcher.java:56)
    at com.sun.javafx.event.EventDisp atchChainImpl.dispatchEvent(Ev entDispatchChainImpl.java:114)
    at com.sun.javafx.event.EventUtil .fireEventImpl(EventUtil.java: 74)
    at com.sun.javafx.event.EventUtil .fireEvent(EventUtil.java:54)
    at javafx.event.Event.fireEvent(E vent.java:198)
    at javafx.scene.Scene$MouseHandle r.process(Scene.java:3757)
    at javafx.scene.Scene$MouseHandle r.access$1500(Scene.java:3485)
    at javafx.scene.Scene.impl_proces sMouseEvent(Scene.java:1762)
    at javafx.scene.Scene$ScenePeerLi stener.mouseEvent(Scene.java:2 494)
    at com.sun.javafx.tk.quantum.Glas sViewEventHandler$MouseEventNo tification.run(GlassViewEventH andler.java:380)
    at com.sun.javafx.tk.quantum.Glas sViewEventHandler$MouseEventNo tification.run(GlassViewEventH andler.java:294)
    at java.security.AccessController .doPrivileged(Native Method)
    at com.sun.javafx.tk.quantum.Glas sViewEventHandler.lambda$handl eMouseEvent$354(GlassViewEvent Handler.java:416)
    at com.sun.javafx.tk.quantum.Quan tumToolkit.runWithoutRenderLoc k(QuantumToolkit.java:389)
    at com.sun.javafx.tk.quantum.Glas sViewEventHandler.handleMouseE vent(GlassViewEventHandler.jav a:415)
    at com.sun.glass.ui.View.handleMo useEvent(View.java:555)
    at com.sun.glass.ui.View.notifyMo use(View.java:937)
    at com.sun.glass.ui.win.WinApplic ation._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplic ation.lambda$null$148(WinAppli cation.java:191)
    at java.lang.Thread.run(Unknown Source)
    En attente d'une commande

  3. #3
    Chanur

    Re : Java RXTX Communication Série Arduino OutPutStream

    Bonjour,

    Les appels "reception_donnees(&index,&buf f[4]);" et "traitement_donnees(&controlPi n2,&controlPin7,&enablePin,&bu ff[4]);" passent comme dernier argument l'adresse de buff[4] alors qu'il aurait fallut passer l'adresse de buff.
    Du coup, ça patauge dans la choucroute.

    De toute façon, (sauf si ça sert au développement final ?) c'est absurde d'utiliser un tableau comme buff si c'est juste pour y stocker un entier.
    De la même façon, c'est absurde de passer l'adresse des variables controlPin2, controlePin7 et enablePin. Il suffirait de passer la valeur.
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  4. #4
    leoleoleo24

    Re : Java RXTX Communication Série Arduino OutPutStream

    Bonjour,

    Merci pour votre retour, j'ai réussi à résoudre mon problème. L'erreur venait d'un problème d'OutputStream qui n'était pas bien défini/partagé.

    Bonne journée !

  5. A voir en vidéo sur Futura
  6. #5
    Chanur

    Re : Java RXTX Communication Série Arduino OutPutStream

    Ce qui n'empêche pas le débordement que je t'ai signalé. Il peut très bien ne pas avoir de conséquence, mais à ta place, je le corrigerais...
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

Discussions similaires

  1. Java libraire RXTX Ajouter des dll
    Par leoleoleo24 dans le forum Programmation et langages, Algorithmique
    Réponses: 3
    Dernier message: 27/10/2016, 07h32
  2. Visual c++ et communication serie (projet arduino)
    Par naudnaud dans le forum Programmation et langages, Algorithmique
    Réponses: 2
    Dernier message: 20/09/2014, 12h40
  3. Communication arduino-arduino avec module Xbee
    Par TPESI22012 dans le forum Électronique
    Réponses: 2
    Dernier message: 23/12/2013, 17h24
  4. Communication P2P en Java
    Par kilwa dans le forum Programmation et langages, Algorithmique
    Réponses: 2
    Dernier message: 20/11/2013, 21h58
  5. Communication série module Arduino et Module GPRS TM2
    Par invite65f0e111 dans le forum Électronique
    Réponses: 18
    Dernier message: 15/09/2012, 08h11