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 :
Et voici le code java :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]); }
je pense que l'erreur est dans le code ci dessus.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; } }
et le code qui ecrit au moment ou on clique sur un bouton de l'interface graphique (non décrit ici)
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.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"); } } }
Bonne journée !
-----