Go Down

Topic: Processing-Java (Read 59431 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
www.lucadentella.it

LEO_o

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

lucadentella

ciao

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

lestofante

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.
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

LEO_o

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?

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)
www.lucadentella.it

LEO_o

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:)

Go Up