Quiero pasar este código de C# a Java con NetBeans.
Instalar Java actualizado:
https://www.java.com/es/download/
Compilador NetBeans (En español), Java SE:
https://netbeans.org/downloads/index.html
Tutorial sobre instalación del NetBeans y las librerías RxTx para controlar el puerto serie de Arduino:
https://es.slideshare.net/Metaconta2/interfaz-java-y-arduino
Librería oficial RxTx solo para 32 bits:
http://rxtx.qbang.org/wiki/index.php/Download
Librería alternativa RxTx de 32 y de 64 bits. Usaremos 64 bits. (Recomendado):
http://jlog.org/rxtx-win.html
El código de C# es este aquí abajo.
Código
using System; using System.Text; using System.IO.Ports; using System.IO; using System.Diagnostics; using System.Threading; namespace Recibir_archivo_desde_Arduino_consola_06 { class Program { static int cantidadBytes; static void Main(string[] args) { string COM = ""; // Título de la ventana. Console.Title = "Recoger foto desde Arduino y crearlo en el disco duro"; // Tamaño ventana consola. Console.WindowWidth = 55; // X. Ancho. Console.WindowHeight = 18; // Y. Alto. // Crear un nuevo objeto SerialPort con la configuración predeterminada. // Configuración. Console.Write(@" Introduzca un número para seleccionar puerto COM. Por ejemplo el 4, sería COM4. Puerto: "); COM = Console.ReadLine(); // Escribir el número del puerto. Console.Clear(); Puerto_serie.PortName = "COM" + COM; // Número del puerto serie. Puerto_serie.BaudRate = 115200; // Baudios. 115200. Puerto_serie.Parity = Parity.None; // Paridad. Puerto_serie.DataBits = 8; // Bits de datos. Puerto_serie.StopBits = StopBits.One; // Bits de parada. Puerto_serie.Handshake = Handshake.None; // Control de flujo. // Establecer la lectura / escritura de los tiempos de espera. Puerto_serie.ReadTimeout = -1; // 500. Puerto_serie.WriteTimeout = -1; // 500. try { Puerto_serie.Open(); // Abrir el puerto serie. } catch (IOException) { Console.ForegroundColor = ConsoleColor.Red; // Texto en rojo. Console.CursorVisible = false; Console.SetCursorPosition(16, 6); Console.WriteLine(@"El puerto " + Puerto_serie.PortName + @" no existe o no lo encuentra."); Console.ReadKey(); // Pulse cualquier tecla para salir. } catch (UnauthorizedAccessException e) { Console.WriteLine(e); } Console.WriteLine("Esperando datos desde Arduino... \n"); Console.ReadKey(); Puerto_serie.Close(); // Cerrar puerto. } private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) { try { SerialPort sp = (SerialPort)sender; string indata = sp.ReadExisting(); string[] data = indata.Split('A'); cantidadBytes = int.Parse(data[0]); switch (data[1].ToString()) { case "1": Console.WriteLine("Tamaño: " + cantidadBytes + " Bytes."); Console.WriteLine("Foto: " + data[1] + ". Tipo de archivo: JPG"); break; case "2": Console.WriteLine("Tamaño: " + cantidadBytes + " Bytes."); Console.WriteLine("Foto: " + data[1] + ". Tipo de archivo: PNG."); break; default: Console.WriteLine("Cosas raras en 'data': " + data.ToString()); // Por si hal algún error. break; } int contador = 0; switch (indata) { case "17729A1": Thread.Sleep(100); // Retardo. byte[] miBuffer = Encoding.ASCII.GetBytes("OK1"); // Codificación ASCII. sp.Write(miBuffer, 0, miBuffer.Length); // Envía OK1 al puerto serie. break; case "2065A2": Thread.Sleep(100); // Retardo. byte[] miBuffer2 = Encoding.ASCII.GetBytes("OK2"); // Codificación ASCII. sp.Write(miBuffer2, 0, miBuffer2.Length); // Envía OK2 al puerto serie. break; default: Console.WriteLine("Cosas raras en 'indata': " + indata.ToString()); // Por si hal algún error. break; } while (true) { contador += sp.Read(datosArray, contador, datosArray.Length - contador); Console.SetCursorPosition(10, 6); Console.Write("Datos recibidos: {0}", contador + " Bytes."); Console.WriteLine(" "); if ((contador == cantidadBytes) && (contador == 17729)) { Mensaje1(); File.WriteAllBytes("fotón.jpg", datosArray); // Crear archivo en el disco duro. Mensaje2(); Process.Start("fotón.jpg"); // Ejecutar visualizador de imágenes. Mensaje3(); break; // Garantiza que el ciclo termine. } if ((contador == cantidadBytes) && (contador == 2065)) { Mensaje1(); File.WriteAllBytes("fotón.png", datosArray); // Crear archivo en el disco duro. Mensaje2(); Process.Start("fotón.png"); // Ejecutar visualizador de imágenes. Mensaje3(); break; // Garantiza que el ciclo termine. } } void Mensaje1() { Console.WriteLine(); Console.WriteLine("Creando archivo al disco duro..."); } void Mensaje2() { Console.WriteLine(); Console.WriteLine("Archivo creado. Ejecutando imagen."); } void Mensaje3() { Console.WriteLine(); Console.WriteLine("Imagen ejecutada."); Console.WriteLine(); Console.WriteLine("Cabecera recibida: " + indata + "\n"); Console.ForegroundColor = ConsoleColor.Yellow; // Letras amarillas. Console.WriteLine("FIN DE PROGRAMA."); Console.ForegroundColor = ConsoleColor.Gray; // Letras grises otra vez. } } catch (FormatException) { // System.FormatException: 'La cadena de entrada no tiene el formato correcto.' } } } }
En estos momentos estoy instalando la librería RxTx de 64 bits para Windwos 10 de 64 bits que es el que uso actualmente. El código de C# arriba fucniona de maravilla.
Esto de Java para adaptarme tardaré una eternidad, al menos se que el Hola mundo es Console.WriteLine("Hola mundo"); de C# es el equivalente a System.out.println("Hola mundo"); de Java.
Cualquier ayuda es bienvenida.