|
591
|
Programación / Programación C/C++ / Re: Puerto serie C++. Mejorar el programa.
|
en: 16 Marzo 2017, 23:16 pm
|
Hola: Muchas gracias. Si te digo la verdad, no entiendo ni papa. Jajaajjajajaja. Soy de C# y este C de Win32 o en WinAPI. Lo que tiene que hacer el programa es enviar este comando que lo hace bien. cout << "Enviando: " << L_ON << endl; Puerto -> WriteData(L_ON, sizeof(L_ON) - 1);
Arduino lo detecta. Luego recibir este comando que no se si lo hace bien. Cuando Arduino le envía mensajes a C++ del PC. Puerto -> ReadData(lectura, 50); cout << "Recibido: " << lectura << endl;
Para los que me respondieron en privado lo pongo en público. ¿Alguna ayuda? Saludos.
|
|
|
592
|
Programación / Programación C/C++ / Puerto serie C++. Mejorar el programa.
|
en: 16 Marzo 2017, 22:21 pm
|
Buenas: Tengo un programa aquí que no está bien hecho del todo. Envía datos al puerto seria, concretamente llega a Arduino. Los datos llegan bien, al recibir, ya no tanto. Si pulsas la tecla, por ejemplo 5, primero se ve reflejado y luego tengo que pulsar Enter. Lo que quiero lograr es que si pulse el número 5, automáticamente ejecuta la instruacción del case 5 del Switch. Otra cosa, es que no me llegan los datos desde Arduino cuando le pulso un botón. C++ tiene que ser capaz, desde que le llegue algún dato, reflejarlo en pantalla. La librería a usar es esta. https://github.com/Gmatarrubia/LibreriasTutorialesEl código de C++ es: #include <iostream> #include <fstream> #include <Windows.h> #include "SerialClass.h" using namespace std; void main() { SetConsoleTitle("Control Led 13 de Arduino UNO y saludos."); Serial* Puerto = new Serial("COM4"); while (Puerto -> IsConnected()) { // Comandos para Arduino. char L_ON[] = "Led13_ON"; char L_OFF[] = "Led13_OFF"; char Saludar[] = "Hola Arduino. Saludos desde el PC con C++ bajo Win32."; char Luz_ON[] = "Luz_ON"; char Luz_OFF[] = "Luz_OFF"; char lectura[50]; int opc; cout << "Introduzca la opcion deseada: "; cin >> opc; switch (opc) { case 1: cout << "caso 1\n"; // Enviar encender Led. cout << "Enviando: " << L_ON << endl; Puerto -> WriteData(L_ON, sizeof(L_ON) - 1); break; case 2: cout << "caso 2\n"; // Enviar apagar Led. cout << "Enviando: " << L_OFF << endl; Puerto -> WriteData(L_OFF, sizeof(L_OFF) - 1); break; case 3: cout << "caso 3\n"; // Mensaje saludar. cout << "Enviando: " << Saludar << endl; Puerto -> WriteData(Saludar, sizeof(Saludar) - 1); break; case 4: cout << "caso 4\n"; // Mensaje saludar. cout << "Enviando: " << Luz_ON << endl; Puerto->WriteData(Luz_ON, sizeof(Luz_ON) - 1); break; case 5: cout << "caso 5\n"; // Mensaje saludar. cout << "Enviando: " << Luz_OFF << endl; Puerto->WriteData(Luz_OFF, sizeof(Luz_OFF) - 1); break; default: cout << "Puse del 1 al 5."; } Puerto -> ReadData(lectura, 50); cout << "Recibido: " << lectura << endl; cout << "-------------------" << endl; // system("PAUSE"); } }
¿Alguna ayuda? Un cordial saludo. PD: Uso Visual Studio Community 2017, lenguaje C++ bajo Win32.
|
|
|
593
|
Programación / Programación C/C++ / Re: Instalar esta librería en C++
|
en: 16 Marzo 2017, 11:52 am
|
Resuelto: El primer problema, las librerías SerialClass.ccp y SerialClass.h, mejor ponerlas directamente en las capeta del proyecto. Borras las demás que te crea solo el compilador. A parte de esto da otros errores. Gravedad Código Descripción Proyecto Archivo Línea Estado suprimido Error (activo) E0167 un argumento de tipo "char *" no es compatible con un parámetro de tipo "LPCWSTR" Cpp_Win32_Consola_Arduino c:\Users\Usuario\Documents\Visual Studio 2017\Projects\Cpp_Win32_Consola_Arduino\Cpp_Win32_Consola_Arduino\SerialClass.cpp 9 Se soluciona aquí. Hay que ir arriba en la barra. Proyecto --> Propiedades. Se abre una ventana que dice: "Páginas de propiedades". En la pestaña General --> Juego de caracteres --> """"Utilizar juego de caracteres multibyte"""". Los dejo aquí por si lo necesitan.
|
|
|
594
|
Programación / Programación C/C++ / Instalar esta librería en C++
|
en: 16 Marzo 2017, 06:23 am
|
Hola: Quiero usar e instalar esta librería para Visual C++, concretamente Visual Studio Community 2017. https://github.com/Gmatarrubia/LibreriasTutorialesSu código es este: #include #include #include "SerialClass.h" using namespace std; void main () { Serial* Arduino = new Serial("COM7"); while( Arduino->IsConnected() ){ char palabra[] = "PalabraDelMundo"; cout<<"Arduino conectado"<<endl; cout<<"Enviando :"<<palabra<<endl; Arduino->WriteData(palabra,sizeof(palabra)-1); Sleep(500); Arduino->ReadData(palabra,sizeof(palabra)-1); cout<<"Recibido: "<<palabra<<endl; cout<<"-------------------"<<endl; Sleep(1000); }
Creo un proyecto nuevo. Me crea este código. Añado las librerías com indica abajo. Lo mismo para la hora y lo refleja, tanto en cpp como en h indicado abajo. Como que no detecta la librería. ¿En que fallo? Un cordial saludo.
|
|
|
595
|
Programación / Java / Re: Pasar de C# a Java. Código en modo consola
|
en: 16 Marzo 2017, 04:56 am
|
Hola: No sabía ni me imaginaba un convertidos de C# a Java. He intslado ya las librerías del puerto RxTx, espero que lo haya hecho bien y funcione. Cada vez que hago un ejemplo en Java, me aparece en NetBeans, esperaba ver un hola mundo como si fuera un CMD de Windows, es decir, la consola negra. Hay que activarlo en Administrador, Java, en esta opción, activar consola. Lo que tengo que descubrir. Voy haber si hay otro convertidos y sino, paso a paso como se traduce. Saludos.
|
|
|
596
|
Programación / Java / Pasar de C# a Java. Código en modo consola
|
en: 16 Marzo 2017, 03:13 am
|
Hola: 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.htmlTutorial 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-arduinoLibrería oficial RxTx solo para 32 bits: http://rxtx.qbang.org/wiki/index.php/DownloadLibrería alternativa RxTx de 32 y de 64 bits. Usaremos 64 bits. (Recomendado): http://jlog.org/rxtx-win.htmlEl código de C# es este aquí abajo. 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 StringBuilder sb = new StringBuilder (); 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. SerialPort Puerto_serie = new SerialPort (); // 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); } Puerto_serie .DataReceived += new SerialDataReceivedEventHandler (DataReceivedHandler ); 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; byte[] datosArray = new byte[cantidadBytes ]; 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.
|
|
|
597
|
Programación / .NET (C#, VB.NET, ASP) / Cerrar y abrir la bandeja del lector con el botón manualmente, y que lo sepa C#
|
en: 15 Marzo 2017, 11:11 am
|
Hola: Quiero cerrar y abrir la bandeja del lector de DVD con el botón manualmente, y que lo sepa C#. Estoy usando Visual Studio Community 2017. En otro momento hicimos desde C#, controlar la bandeja abrirla y cerrarla pulsando los botones como indica en la interfaz de abajo. Código fuente sencillo de C#: using System; using System.Runtime.InteropServices; // No olvidar. using System.Text; using System.Windows.Forms; namespace Lector_discos_cs { public partial class Form1 : Form { public Form1() { InitializeComponent(); } [DllImport("winmm.dll")] public static extern Int32 mciSendString(string lpstrCommand, StringBuilder lpstrReturnString, int uReturnLength, IntPtr hwndCallback); StringBuilder rt = new StringBuilder (127); private void button_Abrir_Click(object sender, EventArgs e) { label_Mensaje.Text = "Abriendo..."; Application.DoEvents(); mciSendString("set CDAudio door open", rt, 127, IntPtr.Zero); label_Mensaje.Text = "Abierto"; } private void button_Cerrar_Click(object sender, EventArgs e) { label_Mensaje.Text = "Cerrando..."; Application.DoEvents(); mciSendString("set CDAudio door closed", rt, 127, IntPtr.Zero); label_Mensaje.Text = "Cerrado"; } } }
Hasta aquí todo bien. Ahora quiero hacer, saber antes que nada, si es posible que al meter la bandeja con la mano o pulsar el botón físicamente del lector, C# puede saber su estado, cunado está abierto y cuando está cerrado. En este caso, no hay botones para Windows Form de C#, solo un label que indica el estado "ABIERTO" y "CERRADO". ¿Es posible hacerlo? Si es así. ¿Cómo se hace? Lo único que pensé que este enlace valdría la pena o te daba información, pero es otra cosa. Que tengan buena semana.
|
|
|
598
|
Programación / .NET (C#, VB.NET, ASP) / Re: Modificar el array de byte[]
|
en: 15 Marzo 2017, 10:40 am
|
Hola de nuevo: He hecho este programa. Arduino ulsa un botón y este programa de C# lo descodifica como dijeron arriba. Como puedes ver, el archivo viene desde Arduino por el puerto serie/USB. ¿Existe la manera de usar la descodificación de la foto? C#: 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 StringBuilder sb = new StringBuilder (); static void Main(string[] args) { string COM = ""; // Tamaño ventana consola. Console.WindowWidth = 55; // X. Ancho. Console.WindowHeight = 18; // Y. Alto. Console.Title = "Recoger foto desde Arduino y crearlo en el disco duro"; // Título de la ventana. // Crear un nuevo objeto SerialPort con la configuración predeterminada. SerialPort Puerto_serie = new SerialPort (); // 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); } Puerto_serie .DataReceived += new SerialDataReceivedEventHandler (DataReceivedHandler ); 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; byte[] datosArray = new byte[cantidadBytes ]; //byte[] miBuffer = Encoding.ASCII.GetBytes("OK1"); //sp.Write(miBuffer, 0, miBuffer.Length); // Envía OK1 a Arduino. 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.' } } } }
Saludos.
|
|
|
|
|
|
|