Panama Hitek Logo
Panama Hitek Logo

Comunicación Serial: Enviando datos de Arduino a Java

La información suministrada en este post es considerada por mi persona como obsoleta debido a que fue publicada antes de mi librería Arduino para Java. Recomiendo visitar el siguiente post donde se explica el uso de la misma y donde es muy fácil comunicar Arduino con Java y vice versa.

***

Hola amigos. En las últimas semanas he estado escribiendo mucho acerca de Arduino, de Java y de como podemos utilizar ambas plataformas para realizar grandes proyectos. Empecé escribiendo como establecer Comunicación Serial con Arduino. Luego escribí como enviar datos de Java a Arduino a través de los métodos ArduinoConnection() y EnviarDatos().

Ahora es tiempo de aprender como recibir datos en Java desde Arduino. Para ello utilizaremos un método similar a EnviarDatos(): RecibirDatos().

Para poder utilizar este método necesitamos modificar nuestra función ArduinoConnection() y declarar algunas variables.

Los datos que enviamos de Arduino a Java se envían a través de una variable OutputStream llamada Output. Ahora declararemos una variable del tipo InputStream llamada Input.

private InputStream Input;

Resumiendo, las variables que necesitamos utilizar para comunicar Arduino y Java, y vice versa, son las siguientes:

Sin título

Ahora necesitamos inicializar la variable Input. Esto se hace en la función ArduinoConnection() donde ya existe una línea que inicializa la variable Output.

Como vemos, se prepara a la variable Input de la misma manera que a la variable Output. Hemos agregado 2 líneas más a nuestra función ArduinoConnection():

Esto permite que se genere un evento cada vez que Arduino envíe datos a Java. Para poder que esto funcione es necesario que implementemos la interfaz SerialPortEventListener de la misma manera que implementamos la interfaz Runnable cuando utilizamos los Java Threads.

Sin título

Por último necesitamos agregar un método en donde se establezca las acciones que se harán cuando ocurra un SerialPortEvent.

Por último agregamos RecibirDatos():

Con estas variables y estos métodos podemos lograr lo que queremos. Ahora es tiempo de probar si funciona o no.

Yo agregué los elementos necesarios al ejemplo Blink que ya hicimos:

Ahora vamos a Arduino y escribimos lo siguiente:

Con estos cambios estamos listos para ver como trabaja nuestro código. Lo que haremos es enviar el valor de una variable, en este caso, count, de Arduino a Java, con la salvedad de que cada segundo se aumentará el valor de count en 1 unidad.

Utilizamos Serial.print para enviar el mensaje. Si utilizamos println enviaremos el mensaje con un salto de renglón. Si utilizamos Serial.write, entonces no enviaremos el mensaje en ASCII sino como bits. El problema con esto es que es un bus de 8 bits, por lo que no podremos enviar valores más arriba del 255, ya que 2 elevado a la octava potencia es 256 y el bus solo admite 8 bits, del 0 al 255.

Aquí vemos la demostración:

Como podemos observar los datos se envían 1 a 1, es decir, caracter a caracter.

Espero sus comentarios. Saludos.

Antony García González
Antony García González
Ingeniero Electromecánico, egresado de la Universidad Tecnológica de Panamá. Miembro fundador de Panama Hitek. Entusiasta de la electrónica y la programación.

Posts relacionados

47 COMENTARIOS

  1. Primero que nada muchas gracias por todos los tutoriales, han sido de muchisima ayuda…
    una duda, al momento de implementar SerialPortEventListener, quitamos el Runnable y ahora ya no me sirven los hilos…
    Que puedo hacer??

  2. hola amigo!! primero que nada quiero agradecerte por este gran aporte!!!
    y quisiera hacerte una pregunta, lo que pasa que estoy haciendo un programa en java y arduino, pero a la ora de enviar un numero como 10, 20 30 etc,
    en java se muestra:
    1
    0
    hay alguna forma de que me imprima el 10??

    • No. Necesitas hacer lectura dígito a dígito. Yo por ejemplo envío 3 dígitos y en Arduino los leo de la siguiente manera:
      int c; int d; int u; int num;
      c=Serial.read();
      delay(10)
      d=Serial.read()
      delay(10)
      u=Serial.read();
      num=(100*c)+(100*d)+u;

      Ahí está

  3. Hola:

    Tienes algún otr tutorial en el que se reciban datos de manera ininterrumpida desde arduino?. Por ejemplo con un botón de start y otro de parada para detener.

  4. Las imágenes son de gran ayuda para entender el proceso que se realizo, no se si están dañadas o es problema del pc pero no logro verlas. No entiendo muy bien la parte de los hilos, ¿estos son obligatorios?¿como van a funcionar en la aplicación? Le agradecería su colaboración. Gracias

  5. Me aparece cuando intento enviar serial con TX después de haber iniciado la conexión. Inicio la conexión y luego intento inicializarla en otra parte y me aparece ese error.

  6. hola muy buen aporte, estoy probando la libreria arduino y lo que intento es mostrar los datos leidos desde el arduino y en lugar de graficarlo me muestre el valor en un textField pero no logro hacerlo no se si tengas idea como puedo resolver esto

    este es lo que hago:

    jTextField1.setText(Arduino.PrintMessage());

    y solo me muestra la leyenda que no hay datos disponibles pero si me grafica los datos

    • Lo que sucede es que al graficar estas enviando el valor de la variable a las gráficas y el textfield trata de leer el siguiente valor en la fila del puerto serie, el cual es un valor nulo. Lo que tienes que hacer es leer la variable, luego en un proceso separado graficar y enviar al jTextField. Una vez leido el valor que se recibe por medio de printMessage, el mismo no puede usarse para nada mas, a menos que uses una variable que lo contenga y a partir de la misma desencadenar los demás procesos.

      Saludos.

  7. estoy usando su libreria y parte de codigo nuevo en netbeans y pongo 2 potencometros que se vea la cantida de giro o sensor de humedad en un jtexfile solo dos . en el siglo de este codigo

    l void serialEvent(SerialPortEvent spe) {
    if (Arduino.MessageAvailable()){
    if(Slot== 1){
    Slot= 2;
    if (lectura > 1) {lectura++; pote1= Arduino.PrintMessage();}

    } else if (Slot== 2){ Slot= 1;lectura++;pote2 = Arduino.PrintMessage();

    txtarduinovalue = new txtarduino();
    txtarduino.setText(pote1);

    txtarduino1value = new txtarduino1();
    txtarduino1.setText(pote2 );
    pero no me acepta un tercero quiero poner en ese mismo siglo 6 en total . gracias por su ayuda

  8. Hola, tengo una duda con respecto a como muestra los datos, al ejecutar el código java y mando datos para probarlo con una terminal, pero los datos que muestra no es el que mando, por ejemplo si le mando un 1 me muestra 49 y si es 2 muestra 50 y así con todos, incluso si le mando un 0 me muestra 48, alguna idea de porque pasa eso o hay algo de lo que no me entero o si alguien mas me podría ayudar se los agradecería. Saludos y gracias

  9. HOLA QUIERO HACER UNA CONEXION RS485 EN CON NEETBENS YA QUE NECESITO EL CODIGO DE LOS MODULOS DEL RS485. SI HAY COMO Y QUE CODIGO TENGO QUE OCUPAR.

  10. Esta librería podría funcionar con cualquier micro-controlador con comunicación rxtx? por ejemplo los pics o atmel que no estén grabados.

  11. Buenas tardes.
    Necesito enviar información de un Arduino a Java Netbeans…
    La programación el Arduino es mediante cadena serial.printl. Mi pregunta es:Que codigo puedo usar para recibir datos de un arduino serial.print a un Jframe en Netbeans? Te agradezco de corazón.

  12. buena tarde Antony, de ante mano agradezco toda la informacion y las herramientas que haz podido facilitar usted y su equipo.

    estoy en el desarrollo de un proyecto para automatización de invernaderos. la interfaz la estoy desarrollando en java, en mi sesión principal se despliega una grafica que me muestra todos los sensores conectados a mi arduino. y en la segunda ventana los despliega de manera individual, al abrir una ventana nueva me arrojaba un error multiplex conexiones abiertas, lo cual solucione con un killArduinoConnection, pero al retornar a la ventana principal los la grafica deja de tener actividad pero los datos siguen llegando desde el puerto serie. ¿desde su experiencia como podría dar solución?. es decir que la conexión no se interrumpa y que al conectar un arduino a la pc automáticamente comience la visualización de los datos.

    • Para evitar que te aparezca el error de múltiples conexiones abiertas tienes que usar una única instancia de la librería. Por ejemplo, si creas el objeto:
      static PanamaHitek_Arduino ino = new PanamaHitekArduino();

      Puedes hacer que cuando abres un JFrame le pases como parámetro el objeto ino y en el constructor se lo asignas a alguna variable privada dentro del JFrame. De esta manera no se necesita matar la conexión, pues es un solo objeto el que gestiona la comunicación.

      No se si me explico…

  13. Hola tengo este error
    SEVERE: null
    com.panamahitek.ArduinoException: Nomrbe del puerto – COM3; Nombre del método – arduinoRXTX(); Tipo de excepción – Puerto no abierto.
    at com.panamahitek.PanamaHitek_Arduino.arduinoRXTX(PanamaHitek_Arduino.java:220)
    at apiuno.Ultrasonico.(Ultrasonico.java:29)
    at apiuno.ApiUno.main(ApiUno.java:7)

    Alguien me puede ayudar ,Lo necesito para un proyecto.

DEJA UNA RESPUESTA

Por favor ingrese su comentario!
Por favor ingrese su nombre aquí

Post relacionados