Go Down

Topic: Processing-Java (Read 2094 times) previous topic - next topic

lucadentella

ciao

per le stringhe nessun problema... per la documentazione mi pare che nello zip sia incluso anche un javadoc in html... comunque più efficaci penso siano esempi e tutorial che trovi in rete
lucadentella.it

ESOREL

ciao, il programma che mi avevi consigliato scrive "Hello, world!" sulla seriale.
Per essere inviato deve essere convertito in Byte (c'è anche il metodo messageString.getBytes()) per essere "spedito".

Ora, con arduino e in particolare con la Classe Serial ci sono dei metodi come read() che servono per leggere dalla seriale. read() legge Byte (cioè un int formato da 8 cifre 0-1 giusto?).
La domanda è questa: esiste un metodo in processing che converta il byte in una stringa, per poi farci delle operazioni di controllo*? 
Grazie! :)

*Esempio: se la stringa letta equivale a "Hello, world!", far lampeggiare/accendere un LED.

questo è il link del sorgente: http://java.sun.com/developer/releases/javacomm/SimpleWrite.java
Sono convinto che l'informatica abbia molto in comune con la fisica. Entrambe si occupano di come funziona il mondo a un livello abbastanza

lucadentella

ciao

devi leggere stringhe via seriale da arduino, se cerchi nel forum ci sono tantissimi post a riguardo
lucadentella.it

lesto

c'è molta confusione, LEO_o

un byte è formato da 8 bit, un bit è un 1 o uno 0, ed è rappresentabile da "non c'è tensione" e "c'è tensione".

un int è un tipo di dato formato da due byte che rappresenta un numero intero con segno.

anche il byte rappresenta un numero, come anche i caratteri: per l'elettronica tutto è un numero, ovvero un insieme di segnali c'è o non c'è corrente. per passare da numero a carattere, esiste una comoda tabella detta ASCII(vedi wikipedia): un byte corrisponde ad UN carattere, e quindi un numero imprecisato di byte (quindi caratteri) corrisponde ad una STRINGA.
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

ESOREL

Ciao!

Ho provato a fare qualche piccola modifica a questo programma: http://java.sun.com/developer/releases/javacomm/SimpleWrite.java per fargli inviare un intero direttamente in questo modo:


import java.io.*;
import java.util.*;
import gnu.io.*;

public class Serial {
    static Enumeration         portList;
    static CommPortIdentifier portId;
    static int         numeroDaInviare = 0;
    static SerialPort         serialPort;
    static OutputStream       outputStream;
    static boolean         outputBufferEmptyFlag = false;

    public static void main(String[] args) {
   boolean portFound = false;
   String  defaultPort = "COM3";

   if (args.length > 0) {
       defaultPort = args[0];
   }

   portList = CommPortIdentifier.getPortIdentifiers();

   while (portList.hasMoreElements()) {
       portId = (CommPortIdentifier) portList.nextElement();

       if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {

      if (portId.getName().equals(defaultPort)) {
          System.out.println("Found port " + defaultPort);

          portFound = true;

          try {
         serialPort =
             (SerialPort) portId.open("SimpleWrite", 2000);
          } catch (PortInUseException e) {
         System.out.println("Port in use.");

         continue;
          }

          try {
         outputStream = serialPort.getOutputStream();
          } catch (IOException e) {}

          try {
         serialPort.setSerialPortParams(9600,
                         SerialPort.DATABITS_8,
                         SerialPort.STOPBITS_1,
                         SerialPort.PARITY_NONE);
          } catch (UnsupportedCommOperationException e) {}
   

          try {
             serialPort.notifyOnOutputEmpty(true);
          } catch (Exception e) {
         System.out.println("Error setting event notification");
         System.out.println(e.toString());
         System.exit(-1);
          }
         
         
          System.out.println(
             "Writing \"" + numeroDaInviare + "\" to " + serialPort.getName());
         
          for(int i=0; i<20; i++){
             System.out.println("Scrittura del numero su seriale");
             try {
             
             
         outputStream.write(numeroDaInviare);
         
             
          } catch (IOException e) {}

          try {
             Thread.sleep(1000);  // Be sure data is xferred before closing
          } catch (Exception e) {}
          }
          serialPort.close();
          System.exit(1);
       }
       }
   }

   if (!portFound) {
       System.out.println("port " + defaultPort + " not found.");
   }
    }


}

Mentre in arduino ho scritto questo:
void setup(){
  pinMode(13, OUTPUT);
  Serial.begin(9600);
 
}

void loop(){
  int x;
  while (Serial.available() > 0) {
    int x;
    x = Serial.parseInt();
    if(x == 2){
      digitalWrite(13, HIGH);
      delay(150);   
      digitalWrite(13, LOW);
      delay(150);
      digitalWrite(13, HIGH);
      delay(150);   
    }
}

Cioè se legge dalla seriale un intero (2), deve far lampeggiare il led sul pin 13.
Ho tentato in tutti i modi di illuminare quel dannato led ma non c'è verso.
E' un problema di sincronizzazione? Metodi sbagliati? Inesperienza?
Sono convinto che l'informatica abbia molto in comune con la fisica. Entrambe si occupano di come funziona il mondo a un livello abbastanza

lucadentella

ciao

se ho capito bene il tuo programma java manda i numeri da 1 a 20 ogni 1sec sulla seriale... prova semplicemente ad usare read() invece che parseInt(): il metodo java outputStream(int) manda alla fine un byte:
http://docs.oracle.com/javase/1.4.2/docs/api/java/io/OutputStream.html#write(int)
lucadentella.it

ESOREL

No, il programma (che poi c'è anche un errore dato che avevo postato quello vecchio) invia sulla seriale un numero(in questo caso 0) per 20 volte con una pausa di 1000ms.
Comunque, funziona... Grazie mille:)
Sono convinto che l'informatica abbia molto in comune con la fisica. Entrambe si occupano di come funziona il mondo a un livello abbastanza

Go Up