Comunicación Serial: Enviando datos de Arduino a Java

47
26158
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.

0 0 votes
Article Rating
Suscríbete
Notify of
guest

47 Comments
newest
oldest most voted
Inline Feedbacks
View all comments
GEF
GEF
2 years ago

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.

roguer garces
roguer garces
3 years ago

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… Read more »

Jose Texter
Jose Texter
4 years ago

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.

Alex
Alex
4 years ago

No sirve, pues necesito es tomar información de un serial.printl en arduino que quede en JFrame en Java

Antonio Nieblas
Antonio Nieblas
5 years ago

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.

SANTIAGO
SANTIAGO
5 years ago

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.

Pentagrama
Pentagrama
6 years ago

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

Antony García González
Antony García González
6 years ago
Reply to  Pentagrama

Verifica la tabla de datos ASCII

Pentagrama
Pentagrama
6 years ago

Ya solucione esa parte, pero ahora el problema esta en los datos que se reciben de uno en uno; existe alguna forma de que los datos sean por cadena; osea que si se manda 10 sea 10 y no 1 y 0. O si es la palabra hola sea hola y no h,o,l,a.

Antony García González
Antony García González
6 years ago
Reply to  Pentagrama

Recibir datos en donde? Arduino o Java? Te recomiendo postear tu situación en el foro –> https://panamahitek.com/foro/

Pentagrama
Pentagrama
6 years ago

En java; al final del tutorial mencionan que «los datos se envían 1 a 1, es decir, caracter a caracter»; y efectivamente asi pasa, entonces mi duda es como hacer para que no sea de uno en uno, sino que se lea todo lo enviado; e visto que usan el buffer pero no me queda claro

Luis Eduardo Molina
Luis Eduardo Molina
7 years ago

gracias yo resolvi antes de ver el pos no estaba tomando el contador en el tiempo de ejecucion

Luis Eduardo Molina
Luis Eduardo Molina
7 years ago

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

Antony García González
Antony García González
7 years ago

Revisa este post: https://panamahitek.com/arduino-java-facil-y-rapido/

Y lee sobre la clase MultiMessage

Ezekiel Kardenas
Ezekiel Kardenas
7 years ago

amigo eso lo quiero hacer pero al reves que de java mande a arduino si puedes subir algun codigo te lo agradeceria

Hector
Hector
10 years ago

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

Jsanchez
Jsanchez
10 years ago

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.

Jsanchez
Jsanchez
10 years ago

Me aparece un error cuando corro el programa «Arduino.arduino» a que se debe y como lo corrijo gracias.

Jose
Jose
10 years ago

podrias subir el codigo a algun servidor para descargarlo??

Irving
Irving
10 years ago

Disculpa amigo, no me funciona. serialPort.addEventListener(this); me lo marca como error. A qué se debe??Saludos.

Cristian Rincon Bosigas
Cristian Rincon Bosigas
10 years ago

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

Cristian Rincon Bosigas
Cristian Rincon Bosigas
10 years ago

Ese tutorial ya lo he visto y me parece muy buena esa librería, ahorra trabajo.
Pude mandar valores constantes a Netbeans, igual que el vídeo pero en la aplicación que estoy trabajando son datos de un sensor de temperatura y humedad, si tengo float h = 5; lo envía a Netbeans pero al colocar float h = dht.readHumidity(), ya la aplicación no me funciona. Sera que tengo que meterle alguna otra librería a Netbeans? Y para mostrar los datos en un lbl tengo jLabel1.setText(Arduino.PrintMessage()); No se si sea la correcta! Agradecería tu ayuda!

aitor
aitor
10 years ago

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.

antonygarciagonzalez
10 years ago
Reply to  aitor

Te recomiendo utilizar mi librería Arduino para Java:

https://panamahitek.com/2013/03/08/libreria-arduino-para-java/

aitor
aitor
10 years ago

muchas gracias, aunque me gustaría resolver primero mi problema. Un saludo

antonygarciagonzalez
10 years ago
Reply to  aitor

Con la librería Arduino puedes hacer eso que necesitas hacer sin problemas. Revísala

Daniel
Daniel
10 years ago

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

antonygarciagonzalez
10 years ago
Reply to  Daniel

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á

Yahir Nieto
Yahir Nieto
10 years ago

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

antonygarciagonzalez
10 years ago
Reply to  Yahir Nieto

Puedes implementar Runnable y SerialPortEventListener al mismo tiempo. Solo tienes que agregarlo arriba y te dejará usar hilos. Si no me equivoco, colocas implements SerialPortEventListener, Runnable

Yahir Nieto
Yahir Nieto
10 years ago
Reply to  Yahir Nieto

Ya lo pude solucionar, todo funciono de maravilla!
Muchas gracias!!

antonygarciagonzalez
10 years ago
Reply to  Yahir Nieto

A la orden

Willy
Willy
11 years ago

interesante el aporte, probare el código, saludos

antonygarciagonzalez
11 years ago
Reply to  Willy

Gracias por comentar

Moises Jaber
Moises Jaber
11 years ago

Disculpa no entra al EventListener

antonygarciagonzalez
11 years ago
Reply to  Moises Jaber

¿Podrías ser un poco más específico en cuanto al error que se está presentando?