Pages: [1]   Go Down
Author Topic: Java e Arduino...  (Read 609 times)
0 Members and 1 Guest are viewing this topic.
Milano
Offline Offline
Newbie
*
Karma: 1
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao a tutti...

non riesco a capire il listner del progetto che c'è nel playground qui:

http://www.arduino.cc/playground/Interfacing/Java


Utilizzando il codice come nel tutorial e caricato il listato su arduino, il programma anche con un errore va.

richiamando il listener con parametro "null" mi restituisce il loop.

Tuttavia posso solamente interrompere il progetto java e quindi non chiudo correttamente la COM.

Ho cercato di inibire il flusso del loop() mandandolo all'infinito in un while nullo...ma il listener mantiene lo stato "available"....

come faccio a riconoscere il chunk vuoto e usare il metodo close per la COM?


grazie anticipatamente!
Logged

Milano
Offline Offline
Newbie
*
Karma: 1
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Nessuno?...

ecco il codice:


import java.io.InputStream;
import java.io.OutputStream;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import java.util.Enumeration;
import java.util.TooManyListenersException;

import processing.app.Preferences;

import com.sun.corba.se.impl.interceptors.PINoOpHandlerImpl;

public class SerialTest implements SerialPortEventListener {
   SerialPort serialPort;
        /** The port we're normally going to use. */
   private static final String PORT_NAMES[] = {
         "/dev/tty.usbserial-A9007UX1", // Mac OS X
         "/dev/ttyUSB0", // Linux
         "COM4", // Windows
         };
   /** Buffered input stream from the port */
   private InputStream input;
   /** The output stream to the port */
   private OutputStream output;
   /** Milliseconds to block while waiting for port open */
   private static final int TIME_OUT = 2000;
   /** Default bits per second for COM port. */
   private static final int DATA_RATE = 9600;
 
   public void initialize() {
      CommPortIdentifier portId = null;
      Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();

      // iterate through, looking for the port
      while (portEnum.hasMoreElements()) {
         CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement();
         for (String portName : PORT_NAMES) {
            if (currPortId.getName().equals(portName)) {
               portId = currPortId;
               break;
            }
         }
      }

      if (portId == null) {
         System.out.println("Could not find COM port.");
         return;
      }

      try {
         // open serial port, and use class name for the appName.
         serialPort = (SerialPort) portId.open(this.getClass().getName(),
               TIME_OUT);

         // set port parameters
         serialPort.setSerialPortParams(DATA_RATE,
               SerialPort.DATABITS_8,
               SerialPort.STOPBITS_1,
               SerialPort.PARITY_NONE);

         // open the streams
         input = serialPort.getInputStream();
         output = serialPort.getOutputStream();
         // add event listeners
         serialPort.addEventListener(this);
         serialPort.notifyOnDataAvailable(true);
   
      } catch (Exception e) {
         System.err.println(e.toString());
      }
   }
   public SerialPort getPort(){
      return this.serialPort;
   }
   /**
    * This should be called when you stop using the port.
    * This will prevent port locking on platforms like Linux.
    */
 
   public synchronized void close() {
      if (serialPort != null) {
         serialPort.removeEventListener();
         serialPort.close();
      }
   }

   /**
    * Handle an event on the serial port. Read the data and print it.
    */
   public synchronized void serialEvent(SerialPortEvent oEvent) {
      if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
         try {
            int available = input.available();
            byte chunk[] = new byte[available];
            input.read(chunk, 0, available);
//            System.out.println("sono qui");
            // Displayed results are codepage dependent
//            while(input.available()>0) {
            System.out.print(new String(chunk));//}
               
            
         } catch (Exception e) {
            this.close();
            System.err.println(e.toString());
         }
      }
      // Ignore all the other eventTypes, but you should consider the other ones.
   }
    
   public static void main(String[] args) throws Exception {
      SerialTest main = new SerialTest();
      main.initialize();
      System.out.println("Started"); 
 
      main.serialEvent(null);
 
 
       main.close();
    System.out.println("Stopped");
      
   }
}


questa è l'eccezione:


Stable Library
=========================================
Native lib Version = RXTX-2.1-7
Java lib Version   = RXTX-2.1-7
Started
Exception in thread "main" java.lang.NullPointerException
   at SerialTest.serialEvent(SerialTest.java:93)
   at SerialTest.main(SerialTest.java:117)
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
.....
Logged

0
Offline Offline
Shannon Member
****
Karma: 132
Posts: 10498
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

usa la formattazione del codice che non si capisce una bega  smiley-mr-green (simbolino # sopra gli smile)

l'errore avviene a SerialTest.serialEvent(SerialTest.java:93)
ovvero riga 93 del file SerialTest.java, funzione SerialTest.serialEvent.

se non mi dici qual'è la riga 93 la vedo dura capirci di più tranne il fatto che il programma on si blocca perchè sei all'interno di un blocco
try{}catch(Exceptio) che gestisce tutti gli errori senza far crascare il programma, in teoria le Exceptio non si usano generiche ma si cerca di catturare solo quelle lanciate

di più non so dirti senza sapere la riga di errore
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Milano
Offline Offline
Newbie
*
Karma: 1
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

CIao lesto!!!

anzitutto grazie per la tua attenzione!!!


ieri sera ho capito...in realtà bastava non forzare tramite: main.serialEvent(null); il listener...


bastava mettere uno "Sleep" e si sarebbe accorto dell'input di arduino...

x la formattazione del codice...mi spiace! però insomma l'ho presa pari pari da arduino play ground... smiley-sleep


ora provo a fare al rovescio dando input da java e tenendo arduino in "ascolto"....vediamo...se ho problemi ci rivediamo qui!  smiley-twist

grazie ancora!
Logged

0
Offline Offline
Shannon Member
****
Karma: 132
Posts: 10498
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

se segui il mio link in firma, finisci sul mio github nella cartella arduino. se sali di una directory trovi i miei vari progetti tra cui un "serialListener"; è un programmino in java che legge la seriale e ne ritrasmette il flusso direttamente su socket internet (il tuo PC fa da server, porta 2345, con un semplice telnet sul tuo server chiunque, se hai settato bene il router, può vedere i dati che escono da seriale, lo uso per programmare a distanza con un mio amico che non ha l'arduino). magari osservare quel codice ti da una mano. a breve caricherò anche i vari altri codici che uso per leggere i dati, degni di nota i sistemi che uso per leggere direttamente i valori in byte senza passare dalla conversione in CHAR, risparmiando un sacco di banda seriale (la seriale è mooolto lenta)
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Pages: [1]   Go Up
Jump to: