Tengo dos noticias una buena y otra mala, ¿cuál quieres que te cuente primero? Está bien, te contaré primero la buena: Se va a lanzar un cable de comunicaciones submarino entre Estados Unidos y España con un ancho de banda que equivaldrá a la mitad de todos los cables submarinos que hay actualmente en todo el mundo. Y que empezará a operar en 2017. La mala: Que el cable pertenece a Facebook y Microsoft. Y todos los datos que circulen por él irán a parar a los servidores de estas dos empresas sin ningún tipo de control estatal.
Señores: La manipulación extrema de la información está servida.
A esto se junta, por si no lo sabes te lo digo yo, qué España es un experimento social, político y económico. Con este “adelanto” las dos empresas podrán manipular la información a su antojo y balancear la opinión de los usuarios hacía sus propósitos. Lo que se conoce como “Think Tanks” (literalmente “Tanques de pensamiento”), y que según wikipedia son ONGs no lucrativas. Nada más lejos de la verdad. No hay nada en el mundo occidental que no se mueva por dinero. Las ONGs que hacen estudios de mercado, sociológicos o políticos lo pueden hacer para no ganar dinero ellas mismas, aunque estén pagadas por otras instituciones, pero el fin último de estos estudios es hacer ganar dinero de múltiples formas a los que les han encargado el estudio.
Tampoco hay que olvidar que la CIA tiene también intereses en Facebook para tener un mayor control sobre los ciudadanos de los Estados Unidos. Ahora también podrán acceder sin problemas a los datos que les suministren los propios usuarios españoles y mucho me temo que los de Europa. La CIA tiene muchos frentes abiertos: guerra política, económica (es un gran inversor en bolsa), social, venta ilegal de armas a países en guerra, etc, etc...
Si no te da miedo te felicito, eres un tío duro o inconsciente.
No sería de extrañar que, por ejemplo, el TTIP tan impopular en estos momentos, sea popular en pocos años vista, gracias a la manipulación de la información o tergiversación de la verdad. O trasladar la discusión al campo de si es un tratado de izquierdas o derechas, cuando la realidad es que es un tratado del poder que tienen las grandes empresas sobre los Estados y los consumidores.
Aunque en un artículo anterior ya puse este vídeo, yo creo que es bueno recordarlo:
Yo por mi parte, siendo fiel a mis principios, me quitaré de esta red social antes de que se ponga en marcha este cable. Aunque ahora también está manipulada la información, todos necesitamos una excusa para hacer las cosas, y ésta es excelente para quitarme del medio.
Siguiendo con los artículos anteriores sobre la programación de Arduino como servidor web y la programación en Java de una consola de comunicación que nos sirva tanto del puerto serie como comunicaciones ethernet, ahora traigo este código el cual prepara un feedback del servidor web para que los clientes tanto web como consolar Java puedan saber el estado de las salidas de nuestro dispositivo Arduino.
Las siguientes líneas corresponden a una web tipo (descarga ejemplo web): <!DOCTYPE html> <html> <head> <title>Tíitulo</title> </head> <body> <form method="get" action=""> ... </form> <script type='text/javascript'> L5=0; L6=0; L7=1; A=100; if (L5 == 1) document.write("Pin 5: encendido.<br>"); else document.write("Pin 5: apagado.<br>"); if (L6 == 1) document.write("Pin 6: encendido.<br>"); else document.write("Pin 6: apagado.<br>"); if (L7 == 1) document.write("Pin 7: encendido.<br>"); else document.write("Pin 7: apagado.<br>");
document.write("Pin 9 (analógico): " + A + "<br>");
var URLactual = window.location; var patron = /^http:\/\/192.168.0.20\/$/i; if (!patron.test(URLactual)) window.location='http://192.168.0.20/'; </script> </body> </html>
Las siguientes líneas corresponden a la código Javascript embebidas en el código de Arduino (descarga código fuente control_leds.zip): // Codigo con metadatos client.println("<script type='text/javascript'>");
//pinString = String(digitalRead(5)); client.println("L5="+String(digitalRead(5))+";"); client.println("L6="+String(digitalRead(6))+";"); client.println("L7="+String(digitalRead(7))+";"); if (lastValueA.length() == 1) client.println("A=00"+lastValueA+";"); // String(analogRead(9)) if (lastValueA.length() == 2) client.println("A=0"+lastValueA+";"); if (lastValueA.length() == 3) client.println("A="+lastValueA+";");
// Aunque Javascript acepta la comparacin de igualdad de valor y tipo // si ponemos: if (L5 === 1) el ejemplo no trabaja correctamente client.println("if (L5 == 1)"); client.println(" document.write('<b>Pin 5: encendido.</b><br>');"); client.println("else"); client.println(" document.write('Pin 5: apagado.<br>');"); client.println("if (L6 == 1)"); client.println(" document.write('<b>Pin 6: encendido.</b><br>');"); client.println("else"); client.println(" document.write('Pin 6: apagado.<br>');"); client.println("if (L7 == 1)"); client.println(" document.write('<b>Pin 7: encendido.</b><br>');"); client.println("else"); client.println(" document.write('Pin 7: apagado.<br>');");
// La siguiente linea no funciona bien. //client.println(" document.write('Pin 9 (analógico): " + lastValueA +"<br>');"); client.println("document.write('Pin 9 (analógico): <b>' + A +'</b><br>');");
/* Cuidado con tener errores en el codigo Javascript puede hacer que no funcione la web en el cliente */ client.println("</script>");
El siguiente código corresponde a la búsqueda de un patrón dentro de una cadena de carácteres (descarga código fuente RegExp.zip): public static void main( String args[] ){ public static void main( String args[] ){ String linea = "L7=1;"; String expresionL7 = "L7="; int mNumber; char caracter;
Pattern regla = Pattern.compile(expresionL7);
// Objeto para comprobar las coincidencias Matcher mCoincidencia = regla.matcher(linea); if (mCoincidencia.find()) { System.out.println("Found value: " + mCoincidencia.group(0) ); try { mNumber = Integer.parseInt(""+linea.charAt(mCoincidencia.group(0).length()) );
if (mNumber == 1) System.out.println("El LED 7 está encendido."); else System.out.println("El LED 7 está apagado."); } catch(Exception Ex) { System.out.println("Excepción: " + Ex); } } else { System.out.println("NO MATCH"); } }
Y por último el código de búsqueda de patrón en nuestra consola Java, repetido tantas veces como pines de Arduino estén configurados para salida de datos (descarga código fuente Consola.zip): String expresionL5 = "L5="; String expresionL6 = "L6="; String expresionL7 = "L7="; String expresionA = "A="; int mNumber; String mNumberA = "";
Solo deciros que tiene un pequeño problema en la actualización de datos ya que en el momento de realizar la petición no muestra el último valor cambiado (problemas entre la petición GET y la recepción de datos, quizás prematura, de los clientes). Pero el código es totalmente válido y funcional.
Este es mi primer vídeo con audio (el primero fue sin audio y totalmente olvidable) donde explico como crear un proyecto en Java con Swing en NetBeans 8.0.2.
No me ha quedado todo lo bien que yo quisiera ni por asomo, pero es el primero, y espero ir mejorando muy mucho.
Este artículo es solo para proporcionar meta información del proyecto Arduino ethernet SD + Java presentando un par de esquemas para saber por donde va el proyecto y cuales serán los siguientes artículos. El primer esquema (descarga) esta hecho con LibreOffice y separa por colores la parte que pertenece a Arduino en celeste, la parte que pertece a Java en rojo y los artículos que pertenecen a ambos en violeta. No hace falta saber Java para hacer la parte de Arduino, ni hace falta saber la parte de Arduino para programar la parte de Java, pero saber lo que hacen ambos es mucho más divertido.
Cuando tienes muchos sitios web en tu computadora Linux y los has configurado ya sean sitios virtuales o por IP (aquí tienes un manual de configuración de los distintos tipos), le habrás dado permiso de ejecución en la máquina a las carpetas donde están alojadas las webs al usuario local, de la manera:
sudo chmod 775 -R nombre_carpeta_web o sudo chmod u+x -R nombre_carpeta_web Pero es posible que al intentar acceder al sitio desde el navegador web (¿como sino?) te haya aparecido Folder Forbidden. Si es así bienvenido al club. Lo que tienes que hacer es darle permisos a todos esos sitios web desde el fichero /etc/apache2/apache2.conf y en las siguientes lineas:
<Directory />
Options FollowSymLinks
AllowOverride None Require all denied
</Directory>
donde aparece Requiere all denied debes cambiarlo por Require all granted (si eres novato u olvidadizo como yo la linea la puedes comentar la original) para que todos los demás sitios tengan permiso concedido por defecto. Con lo que el conjunto de lineas queda así:
<Directory />
Options FollowSymLinks
AllowOverride None # Con 'Require all denied' no tienes permiso # para ver el resto de webs Require all granted
</Directory>
Si tienes alguna duda sobre algo de las configuraciones o tengo algo mal explicado en los manuales no tengas pegas en comentar.
Como vimos en el artículo anterior en el que hemos creado la base de una aplicación para trabajar con Java Swing y siguiendo con el proyecto para tener una consola completa que envíe comandos tanto por el puerto serie como por ethernet, ahora vamos a continuar con la parte de la consola. Siguiendo con el código generado en el artículo anterior vamos a agregarle un par de componentes de texto y un botón de envío. Abrimos el proyecto ConsolaControlArduino y pinchamos en Design.
1º En el panel de la derecha pinchamos sobre Campo de texto y seguidamente pinchamos sobre el marco que tenemos en el centro. Esto hará que se cree una caja de texto donde, en tiempo de ejecución, escribiremos los comandos que le enviaremos a Arduino. 2º Le vamos a cambiar un par de propiedades a este componente. Con él seleccionado, pinchamos en el panel derecho sobre Codigo y pinchamos en Nombre de variable y modificamos el nombre del objeto por uno más descriptivo. Por ejemplo: jTextFieldComandos.
Es buena práctica utilizar nombres descriptivos que podamos identificar rápidamente cuando tengamos más objetos, y más si son del mismo tipo. Tener nombres como jTextField1, jTextField2, jTextField3 no es buena idea. Después pinchamos en Propiedades y la propiedad text la dejamos en blanco. Estiramos el componente en el marco para que ocupe casi todo el marco y ya tenemos el primer componente.
3º De la misma forma que el anterior componente agregamos un Área de texto donde aparecerán los comandos que se le envían a Arduino. Le cambiamos el nombre por jTextAreaTransferencias y lo ajustamos al tamaño deseado. 4º Y de la misma forma agregamos un Botón para enviar los comandos. Le cambiamos el nombre por jButtonEnviar. Y en la propiedad text escribimos Envidar comando.
5º Ahora hacemos una pequeña programación para que al presionar el botón enviar la cadena de texto que se haya escrito en la caja jTextFieldComandos se borre de esa caja y pase a jTextAreaTransferencias. Primeramente pinchamos sobre el botón que ejecutará esa acción y nos vamos al panel derecho y pinchamos sobre Eventos. Y nos vamos hasta el evento mouseClicked y seleccionamos jButtonEnviarMouseClicked. Esto generará un pequeño código al que agreraremos las sentencias. if (!"".equals(jTextComandos.getText())) // Si la caja de texto no está vacía
enviarComando(jTextComandos.getText()); // ejecuta la función
NetBeans crea la cabecera del método y las llaves y solo podemos escribir en medio: private void jButtonEnviarMouseClicked(java.awt.event.MouseEvent evt){
if (!"".equals(jTextComandos.getText()))
enviarComando(jTextComandos.getText());
}
6º Ahora escribimos la función enviarComando(String mensaje). public void enviarComando(String mensaje){
jTextComandos.setText(""); // Borra el comando de la caja de texto
jTextAreaTransferencias.append(mensaje + "\n"); // Escribe el mensaje // en el TextArea
} Aunque de momento lo único que hace es borrar el texto de un sitio y escribirlo en otro. 7º También vamos a programar un evento para la caja de texto, que será qué cuando se pulse la tecla Enter, si hay algo en la caja, lo envíe. Más o menos como hace cualquier chat. Pinchamos sobre la caja de texto jTextFieldComandos y en el panel derecho pinchamos sobre Eventos nos vamos a keyPressed y seleccionamos jTextFieldKeyPressed que generará la cabecera de programación para el evento. En su interior escribimos el siguiente código: private void jTextFieldComandosKeyPressed(java.awt.event.KeyEvent evt) {
if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
if (!"".equals(jTextFieldComandos.getText()))
enviarComando(jTextFieldComandos.getText());
}
}
Marcará KeyEvent con error pero si le damos a la bombillita de la izquierda para que importe la librería correcta import java.awt.event.KeyEvent; o la escribimos nosotros el error desaparece. 8º Solo queda ejecutarlo y ver como funciona. Sobre este código descrito (descargar) seguiremos para añadirle unas sencillas sentencias para que envíe los comandos por ethernet.
Para crear un proyecto de Java en NetBeans que tenga un formulario Swing solo debemos: 1º Crear un nuevo proyecto con Nuevo proyecto → del tipo Java Application y le damos a Siguiente >
2º Escribir un nombre y seleccionar una carpeta donde estará almacenado. Presionamos Terminar.
3º Sobre el paquete que se ha creado (icono que parece una caja embalada) le damos a botón derecho para que aparezca el menú contextual y elegimos Nuevo → Formulario JFrame. Si no aparece esa opción nos vamos al final del menú contextural y elegimos → Otro… nos sale una caja de selección y elegimos en la parte izquierda Formulario de interfaz gráfica de AWT en la derecha Formulario Frame
4º Ahora tenemos dos clases candidatas a ser ejecutadas aunque solo es la prinpipal la que tiene el main que es la que se creo por defecto con el proyecto. Podemos ver como aparecen en la imagen:
Nos vamos a disponer a borrar la clase que no tiene swing. En la imagen sería la clase ConsolaControlArduino.java. Los iconos son distintos:
5º Borramos la clase que se creo por defecto. Dando al botón derecho del ratón sobre el archivo que queremos eliminar. Nos sale una nueva ventana y seleccionamos Aceptar.
6º Ejecutamos la aplicación y nos aparece una ventana en la que decimos que la nueva clase es la principal. Es fácil porque solo podemos aceptar siguiendo los pasos descritos.
7º Ejecutamos la aplicación y nos sale una ventana vacía.
Parece ser qué, por temas de seguridad no se puede crear un acceso directo a Virtual Box en Ubuntu 16.04 LTS. Por lo que voy a exponer mi solución para tener un icono bonito en el escritorio que arranque Virtual Box.
Hay dos métodos:
1º Creamos un script que ejecute la aplicación. 2º Creamos un programa desde cualquier lenguaje que nos arranque la aplicación Virtual-Box.
1º Para este caso lo único que tenemos que hacer es escribir en un fichero de texto las sentencias:
/usr/lib/virtualbox/VirtualBox exit El problema de este método es que cuando le das doble click al fichero gedit te pregunta si quieres mostrarlo o ejecutarlo. Y hay que modificar la acción de la aplicación gedit para ejecute los archivos o los edite. Cosa que hace para el resto de archivos. Y como esa opción no me entusiasma pasemos al segundo método.
2º Para este método he empleado dos lenguajes Java y C++: 2.A Para Java: package ejecutarvirtualbox; public class EjecutarVirtualBox { public static void main(String[] args) { try { Process p = Runtime.getRuntime().exec ("/usr/lib/virtualbox/VirtualBox"); } catch (Exception e) { System.out.println("Aplicación no encontrada: " + e); } } } Lo exportamos como jar, le damos permisos de ejecución y listo para abrir el programa. 2.B Para C++: #include <cstdlib> using namespace std; int main(int argc, char** argv) { system("/usr/lib/virtualbox/VirtualBox"); return 0; }
Arrastramos el jar y/o el ejecutable de C++ al escritorio y ya los tenemos listos. Nos vamos a las propiedades del archivo, pinchamos sobre el icono y lo cambiamos por el icono de VirtualBox que está en la carpeta /usr/share/pixmaps/ llamado virtualbox.xpm.
Este proyecto vengo pensándolo desde hace mucho tiempo pero es desde hace poco tiempo que me he puesto con él enserio. Se trata de comunicarse con Arduino usando la tarjeta ethernet SD usando un navegador cualquiera y la conexión USB con una consola programada en Java.
El proyecto no está completo. Lo estoy desarrollando de momento solo bajo Linux. Ubuntu para ser exactos. Esto es solo una aproximación. De hecho, esta versión tiene dos fallos al presentar en la consola los datos enviados y recibidos, y al capturar el evento de datos recibidos siempre da como positivo a tal evento. Cosas muy raras. A lo mejor me puedes ayudar a solucionar estos problemillas.
El siguiente código es el que estará almacenado en Arduino:
#include <Ethernet.h> #include <SPI.h>
const int BLUE =5; const int GREEN =6; const int RED =7; const int SPEAKER =3; // Configuration Night Light const int RLED =9; //Red LED on pin 9 (PWM) const int LIGHT =0; //Lght Sensor on Analog Pin 0 const int MIN_LIGHT=200; //Minimum expected light value const int MAX_LIGHT=900; //Maximum Expected Light value int val = 0; //variable to hold the analog reading String AnalogLed;
//For controlling LEDS and the speaker //If you want to control additional things, add variables to control them here. int freq = 0; int pin; char dato[16]; String inString = "";
//Set to your MAC address! //It should be on your sticker. If you can't find it, //make one up, or use this one. byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x4A, 0xE0 }; // the dns server ip IPAddress dnServer(192, 168, 0, 1); // the router's gateway address: IPAddress gateway(192, 168, 0, 1); // the subnet: IPAddress subnet(255, 255, 255, 0); // Set the static IP address to use if the DHCP fails to assign IPAddress ip(192, 168, 0, 20);
//Start the server on port 80 EthernetServer server = EthernetServer(80); //port 80
boolean receiving = false; //To keep track of whether we are getting data.
void setup() { Serial.begin(9600);
pinMode(RED, OUTPUT); pinMode(GREEN, OUTPUT); pinMode(BLUE, OUTPUT); // Configuration Night Light pinMode(RLED, OUTPUT); //Set LED pin as output
Ethernet.begin(mac, ip, dnServer, gateway, subnet);
//Start the server server.begin(); Serial.print("Server Started.\nLocal IP: "); Serial.println(Ethernet.localIP());
//This looks at the GET requests if(receiving) { //An LED command is specified with an L if (c == 'L') { Serial.print("Toggling Pin "); pin = client.parseInt(); Serial.println(pin); digitalWrite(pin, !digitalRead(pin));
break; } //A speaker command is specified with an S else if (c == 'S') { Serial.print("Setting Frequency to "); freq = client.parseInt(); Serial.println(freq); if (freq == 0) noTone(SPEAKER); else tone(SPEAKER, freq); break; } //Add similarly formatted else if statements here //TO CONTROL ADDITIONAL THINGS else if (c == 'A') { if (val < 0 || val > 255) { val = 0; break; } val = client.parseInt(); Serial.print("Dando brillo al led con valor analogico: "); Serial.println(val); analogWrite(RLED, val); //control the LED break; } }
//Print out the response header and the HTML page if(!sentHeader) { //Send a standard HTTP response header client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html\n");
// Control de salida analgica client.println("<form action='' method='get'>"); client.println("Introduzca un valor para la salida analogica (0-255): <input type='text' name='A' min='0' max='255' value='0' />"); //client.println("Introduzca un valor para la salida analogica (0-255): <input type='text' name='A' min='0' max='255' value='"+String(val)+"' />"); client.println("<input type='submit' value='Set Analogic Blue Light' />"); client.println("</form>");
//Add additional forms forms for controlling more things here.
sentHeader = true; }
if (c == '\n' && currentLineIsBlank) break;
if (c == '\n') { currentLineIsBlank = true; } else if (c != '\r') { currentLineIsBlank = false; } } } delay(100); //Give the web browser time to receive the data client.stop(); //Close the connection: }
}
Es una versión un poco extendida del código expuesto en GitHub control_led_speaker.ino. Solo que le he puesto que trate los datos recibidos por el puerto serie (a la postre USB, en Linux '/dev/ttyUSB0') y que devuelva por el puerto serie el mismo dato enviado por consola desde el PC. Puedes descargar el código desde mi web.
/* * To change this template, choose Tools | Templates * and open the template in the editor. *//** * @author mario */ public class JAVADUINO_Frame extends javax.swing.JFrame implements SerialPortEventListener {
/** * Creates new form JAVADUINO_Frame */ private static final String TURN_Verde="5"; private static final String TURN_Verde_ON="6"; private static final String TURN_Rojo_OFF="9"; private static final String TURN_Rojo_ON="7"; private String vBuffer;
//Variables de conexión private OutputStream output = null; SerialPort serialPort; InputStream inputStream; // Para leer el puerto serie /** * A BufferedReader which will be fed by a InputStreamReader converting the * bytes into characters making the displayed results codepage independent */ private BufferedReader input;
private InputStreamReader inputBuffer;
private final String PUERTO = "/dev/ttyUSB0"; private static final int TIMEOUT = 2000; //Milisegundos private static final int DATA_RATE = 9600;
/* * Bloque de código para abrir del puerto serie */ public SerialPort abrirPuertoSerie(final String nombrePuerto) throws Exception { CommPortIdentifier portId; // puerto: nombre original. SerialPort puertoSerie; final Enumeration portEnum = CommPortIdentifier.getPortIdentifiers(); // listaPuertos: nombre original.
while (portEnum.hasMoreElements()) { portId = (CommPortIdentifier) portEnum.nextElement(); if (portId.getName().equals(nombrePuerto)) { puertoSerie = (SerialPort)portId.open("PuertoSerie", TIMEOUT); puertoSerie.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); return puertoSerie; } } throw new Exception("Nombre de puerto invalido"); } /** * Manualmente un evento sobre el puerto serie. Lee los datos y los imprime. * Handle an event on the serial port. Read the data and print it. * Código extraido de http://playground.arduino.cc/Interfacing/Java * @param oEvent */ @Override public synchronized void serialEvent(SerialPortEvent oEvent) { // Web de Oracle que trata los eventos del puerto serie: // DATA_AVAILABLE: https://docs.oracle.com/cd/E17802_01/products/products/javacomm/reference/api/javax/comm/SerialPortEvent.html#DATA_AVAILABLE // DATA_AVAILABLE: https://docs.oracle.com/cd/E17802_01/products/products/javacomm/reference/api/constant-values.html#javax.comm.SerialPortEvent.DATA_AVAILABLE if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE && oEvent.getNewValue()) { // types int try {
jTextAreaEventos.append("Capturado evento: " + Integer.toString(oEvent.getEventType()) + "\n"); //String inputLine = input.readLine(); //jAreaMensajes.append(inputLine + "\n"); // Desde http://playground.arduino.cc/Interfacing/Java input = new BufferedReader(new InputStreamReader(serialPort.getInputStream())); jAreaMensajes.append(input + "\n"); System.out.println(oEvent.getSource().toString()); // " " + input } catch (Exception e) { System.err.println(e.toString()); } } // Ignore all the other eventTypes, but you should consider the other ones.
// add event listeners serialPort.addEventListener(this); serialPort.notifyOnDataAvailable(true); //serialPort.notifyOnOutputEmpty(rootPaneCheckingEnabled); // Para evaluar la segunda forma de tratar el evento del puerto serie. jAreaMensajes.append("Preparado para capturar el evento: " + Integer.toString(SerialPortEvent.DATA_AVAILABLE) + "\n"); } catch(Exception e){ mostrarError(e.getMessage()); System.exit(ERROR); } }
/** * Esto debería ser llamado cuando paras de usar el puerto. * Esto prevendrá que el puerto se quede bloqueado en las plataformas Linux. * This should be called when you stop using the port. This will prevent * port locking on platforms like Linux. * Código extraido de http://playground.arduino.cc/Interfacing/Java */ public synchronized void close() { if (serialPort != null) { serialPort.removeEventListener(); serialPort.close(); } }
public void openPort() { CommPortIdentifier puertoID=null; Enumeration puertoEnum = CommPortIdentifier.getPortIdentifiers();
// add event listeners serialPort.addEventListener(this); serialPort.notifyOnDataAvailable(true); //serialPort.notifyOnOutputEmpty(rootPaneCheckingEnabled); // Para evaluar la segunda forma de tratar el evento del puerto serie. jAreaMensajes.append("Preparado para capturar el evento: " + Integer.toString(SerialPortEvent.DATA_AVAILABLE) + "\n"); } catch(Exception e){ mostrarError(e.getMessage()); System.exit(ERROR); } } }
public void mostrarError(String mensaje){ JOptionPane.showMessageDialog(this, mensaje, "ERROR", JOptionPane.ERROR_MESSAGE); }
/** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() {
jButton1 = new javax.swing.JButton(); jButton2 = new javax.swing.JButton(); jLabel1 = new javax.swing.JLabel(); jRadioButton1 = new javax.swing.JRadioButton(); jRadioButton2 = new javax.swing.JRadioButton(); jLabel3 = new javax.swing.JLabel(); jScrollPane1 = new javax.swing.JScrollPane(); jAreaMensajes = new javax.swing.JTextArea(); jLabelPort = new javax.swing.JLabel(); jLabel2 = new javax.swing.JLabel(); jLblDatosConexcion = new javax.swing.JLabel(); jScrollPane2 = new javax.swing.JScrollPane(); jTextAreaEventos = new javax.swing.JTextArea(); jButtonClosePort = new javax.swing.JButton(); jButtonBorrarMensajes = new javax.swing.JButton(); jButtonOpenPort = new javax.swing.JButton();
Es una modificación sobre un proyecto llamado JAVADUINO hecho con swing. Solo que el código expuesto trata el evento de datos en el buffer de entrada. También lo podéis descargar desde mi web. Tiene algunos fragmentos más de código comentado de las pruebas realizadas para tratar el evento del buffer y leer correctamente del puerto serie.
El código está bastante comentado por lo que no veo necesario comentarlo externamente. Las webs que nombro ya comentan los códigos extendidamente y hay multitud de webs donde explican por separado cada una de las funciones. Además, es un código muy sencillo. Lo importante en este punto es: '¿que se quiere conseguir?' y el 'objetivo final' expuesto en el esquema. La web, con los archivos correspondientes, que servirá Arduino estará alojada en la tarjeta SD. Y esto es todo de momento sobre este proyecto.