Pages: 1 [2]   Go Down
Author Topic: Processing-Java  (Read 1757 times)
0 Members and 1 Guest are viewing this topic.
Bergamo
Offline Offline
God Member
*****
Karma: 1
Posts: 663
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

lucadentella.it

Padova
Offline Offline
Newbie
*
Karma: 0
Posts: 24
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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! smiley

*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
Logged

Sono convinto che l'informatica abbia molto in comune con la fisica. Entrambe si occupano di come funziona il mondo a un livello abbastanza

Bergamo
Offline Offline
God Member
*****
Karma: 1
Posts: 663
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ciao

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

lucadentella.it

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

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.
Logged

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

Padova
Offline Offline
Newbie
*
Karma: 0
Posts: 24
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Sono convinto che l'informatica abbia molto in comune con la fisica. Entrambe si occupano di come funziona il mondo a un livello abbastanza

Bergamo
Offline Offline
God Member
*****
Karma: 1
Posts: 663
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

lucadentella.it

Padova
Offline Offline
Newbie
*
Karma: 0
Posts: 24
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Sono convinto che l'informatica abbia molto in comune con la fisica. Entrambe si occupano di come funziona il mondo a un livello abbastanza

Pages: 1 [2]   Go Up
Jump to: