|
501
|
Programación / Scripting / MS-DOS y puerto serie
|
en: 6 Agosto 2017, 09:06 am
|
Hola: Quiero enviar datos al puerto serie con el CMD de Windows, o el sustituto del cmd que es PowerShell, hacen lo mismo. Consiste en configurar dicho puerto que se hace así: MODE COM1:9600,n,8,1 Y en la consola aparece esto: Quiero crear un archivo .bat en el que solo tengo que pulsar la tecla 1 y envía esto: Luz_ON. Si pulso la tecla 2, envía por el puerto serie Luz_OFF. ¿Existe la posibilidad de hacerlo? Si es así. ¿Cómo se hace? Saludos.
|
|
|
502
|
Seguridad Informática / Hacking / Re: ¿Cómo meten Linux en dispositivos?
|
en: 4 Agosto 2017, 08:45 am
|
Hola: Hay algún tutorial que se entienda como instalar Linux en algún dispositivo que en realidad no está pensado para ello. He buscado cosas en San Google y la mayoría muestra lo que han hecho, no quieren explicar como lo hicieron. Tacaños. Saludos.
|
|
|
503
|
Programación / Programación C/C++ / Re: No me funciona este código
|
en: 1 Agosto 2017, 03:07 am
|
Funciona igual. Lo dejo aquí por si acaso. #include "stdafx.h" #using <System.dll> using namespace System; using namespace System::Text; using namespace System::IO::Ports; ref class PortDataReceived { public: static void Main() { // Título de la ventana. Console::Title = "Recibir datos desde Arduino con C++ CLR"; // Tamaño ventana consola. Console::WindowWidth = 55; // X. Ancho. Console::WindowHeight = 18; // Y. Alto. SerialPort^ Puerto_serie = gcnew SerialPort("COM4"); Puerto_serie->BaudRate = 115200; Puerto_serie->Parity = Parity::None; Puerto_serie->StopBits = StopBits::One; Puerto_serie->DataBits = 8; Puerto_serie->Handshake = Handshake::None; Puerto_serie->RtsEnable = true; Puerto_serie->DataReceived += gcnew SerialDataReceivedEventHandler(DataReceivedHandler); Puerto_serie->Open(); // Abrir puerto. ConsoleKey tecla; Console::WriteLine("Pulse tecla 1 para encender y 2 para apagar:"); do { tecla = Console::ReadKey(true).Key; // Espera pulsación de teclas. switch (tecla) { case ConsoleKey::D1: // Tecla 1 del teclado estandar. case ConsoleKey::NumPad1: // Tecla 1 del número del pad. { array<Byte> ^miBuffer1 = Encoding::ASCII->GetBytes("Luz_ON"); // Codificación ASCII y guarda en la variable array tipo byte. Puerto_serie->Write(miBuffer1, 0, miBuffer1->Length); // Envía los datos del buffer todo su contenido. Console::WriteLine("Comando \"Luz_ON\" enviado."); // Muestra en pantalla comandos enviado. break; } case ConsoleKey::D2: case ConsoleKey::NumPad2: { array<Byte> ^miBuffer2 = Encoding::ASCII->GetBytes("Luz_OFF"); Puerto_serie->Write(miBuffer2, 0, miBuffer2->Length); Console::WriteLine("Comando \"Luz_OFF\" enviado."); break; } default: { Console::WriteLine("Tecla el 1, el 2 y Escape para salir."); break; } } } while (tecla != ConsoleKey::Escape); // Pulsa Escape para salir del menú. Console::WriteLine("Presione cualquier tecla para terminar..."); Console::WriteLine(); Console::ReadKey(); // Espera pulsar una tecla cualquiera. Puerto_serie->Close(); // Cierra el puerto serie. } // Detecta cualquier dato entrante. private: static void DataReceivedHandler(Object^ sender, SerialDataReceivedEventArgs^ e) { SerialPort^ sp = (SerialPort^)sender; String^ entradaDatos = sp->ReadExisting(); // Almacena los datos recibidos en la variable tipo string. Console::WriteLine("Dato recibido desde Arduino: " + entradaDatos); // Muestra en pantalla los datos recibidos.; } }; int main(array<System::String ^> ^args) { PortDataReceived::Main(); }
Saludos.
|
|
|
504
|
Programación / Programación C/C++ / Re: No me funciona este código
|
en: 31 Julio 2017, 20:51 pm
|
Trata de no declarar variables directamente dentro del ámbito de un switch. Si realmente lo necesitas, entonces colócale llaves al código del case.
Resuelto un problema. En cuando al Switch. https://docs.microsoft.com/en-us/cpp/cpp/switch-statement-cpp?f1url=https%3A%2F%2Fmsdn.microsoft.com%2Fquery%2Fdev15.query%3FappId%3DDev15IDEF1%26l%3DES-ES%26k%3Dk(switch_CPP)%3Bk(switch)%3Bk(TargetFrameworkMoniker-.NETFramework%2CVersion%3Dv4.6.2)%3Bk(TargetFrameworkMoniker-.NETFramework%2CVersion%3Dv4.6.2)%3Bk(DevLang-C%2B%2B)%3Bk(TargetOS-Windows)%3Bk(TargetFrameworkMoniker-.NETFramework%2CVersion%3Dv4.6.2)%26rd%3Dtrue Si no lo hago como lo hice en en C# y VB .net me funciona. ¿Cómo se hace en C++? En C#: using System; using System.Text; using System.IO.Ports; namespace Envio_y_recepcion_puerto_serie_cs { class Program { static void Main(string[] args) { // Título de la ventana. Console.Title = "Recibir datos desde Arduino con C#"; // Tamaño ventana consola. Console.WindowWidth = 55; // X. Ancho. Console.WindowHeight = 18; // Y. Alto. // Cree un nuevo objeto SerialPort con la configuración predeterminada. SerialPort Puerto_serie = new SerialPort ("COM4"); Puerto_serie.BaudRate = 115200; Puerto_serie.Parity = Parity.None; Puerto_serie.StopBits = StopBits.One; Puerto_serie.DataBits = 8; Puerto_serie.Handshake = Handshake.None; Puerto_serie.RtsEnable = true; // Establecer los tiempos de espera de lectura / escritura. Puerto_serie.ReadTimeout = 500; // Milisegundos. Puerto_serie.WriteTimeout = 500; // Detecta cualquier dato recibido. Puerto_serie .DataReceived += new SerialDataReceivedEventHandler (DataReceivedHandler ); Puerto_serie.Open(); // Abrir puerto. ConsoleKey tecla; Console.WriteLine("Pulse tecla 1 para encender y 2 para apagar:"); do { tecla = Console.ReadKey(true).Key; // Espera pulsación de teclas. switch (tecla) { case ConsoleKey.D1: // Tecla 1 del teclado estandar. case ConsoleKey.NumPad1: // Tecla 1 del número del pad. byte[] miBuffer1 = Encoding.ASCII.GetBytes("Luz_ON"); // Codificación ASCII y guarda en la variable array tipo byte. Puerto_serie.Write(miBuffer1, 0, miBuffer1.Length); // Envía los datos del buffer todo su contenido. Console.WriteLine("Comando \"Luz_ON\" enviado."); // Muestra en pantalla comandos enviado. break; case ConsoleKey.D2: case ConsoleKey.NumPad2: byte[] miBuffer2 = Encoding.ASCII.GetBytes("Luz_OFF"); Puerto_serie.Write(miBuffer2, 0, miBuffer2.Length); Console.WriteLine("Comando \"Luz_OFF\" enviado."); break; default: Console.WriteLine("Tecla el 1, el 2 y Escape para salir."); break; } } while (tecla != ConsoleKey.Escape); // Pulsa Escape para salir del menú. Console.WriteLine("Presione cualquier tecla para terminar..."); Console.WriteLine(); Console.ReadKey(); // Espera pulsar una tecla cualquiera. Puerto_serie.Close(); // Cierra el puerto serie. } // Detecta cualquier dato entrante. private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) { SerialPort sp = (SerialPort)sender; string entradaDatos = sp.ReadExisting(); // Almacena los datos recibidos en la variable tipo string. Console.WriteLine("Dato recibido desde Arduino: " + entradaDatos); // Muestra en pantalla los datos recibidos. } } }
Visual Basic .net: Imports System.IO.Ports Imports System.Text Module Module1 Sub Main() ' Título de la ventana. Console.Title = "Recibir datos desde Arduino con Visual Basic .net" ' Tamaño ventana consola. Console.WindowWidth = 55 ' X. Ancho. Console.WindowHeight = 18 ' Y. Alto. ' Cree un nuevo objeto SerialPort con la configuración predeterminada. Dim Puerto_serie As New SerialPort("COM4") Puerto_serie.BaudRate = 115200 Puerto_serie.Parity = Parity.None Puerto_serie.StopBits = StopBits.One Puerto_serie.DataBits = 8 Puerto_serie.Handshake = Handshake.None Puerto_serie.RtsEnable = True ' Establecer los tiempos de espera de lectura / escritura. Puerto_serie.ReadTimeout = 500 ' Milisegundos. Puerto_serie.WriteTimeout = 500 ' Detecta cualquier dato recibido. AddHandler Puerto_serie.DataReceived, AddressOf DataReceivedHandler Puerto_serie.Open() ' Abrir puerto. Dim tecla As ConsoleKey Console.WriteLine("Pulse tecla 1 para encender y 2 para apagar:") Do tecla = Console.ReadKey(True).Key ' Espera pulsación de teclas. Select Case tecla ' Tecla 1 del teclado estandar. Case ConsoleKey.D1, ConsoleKey.NumPad1 ' Tecla 1 del número del pad. Dim miBuffer1 As Byte() = Encoding.ASCII.GetBytes("Luz_ON") ' Codificación ASCII y guarda en la variable array tipo byte. Puerto_serie.Write(miBuffer1, 0, miBuffer1.Length) ' Envía los datos del buffer todo su contenido. Console.WriteLine("Comando ""Luz_ON"" enviado.") ' Muestra en pantalla comandos enviado. Exit Select Case ConsoleKey.D2, ConsoleKey.NumPad2 Dim miBuffer2 As Byte() = Encoding.ASCII.GetBytes("Luz_OFF") Puerto_serie.Write(miBuffer2, 0, miBuffer2.Length) Console.WriteLine("Comando ""Luz_OFF"" enviado.") Exit Select Case Else Console.WriteLine("Tecla el 1, el 2 y Escape para salir.") Exit Select End Select Loop While tecla <> ConsoleKey.Escape ' Pulsa Escape para salir del menú. Console.WriteLine("Presione cualquier tecla para terminar...") Console.WriteLine() Console.ReadKey() ' Espera pulsar una tecla cualquiera. Puerto_serie.Close() ' Cierra el puerto serie. End Sub Private Sub DataReceivedHandler(sender As Object, e As SerialDataReceivedEventArgs) Dim sp As SerialPort = DirectCast(sender, SerialPort) Dim entradaDatos As String = sp.ReadExisting() ' Almacena los datos recibidos en la variable tipo string. Console.WriteLine(Convert.ToString("Dato recibido desde Arduino: ") & entradaDatos) ' Muestra en pantalla los datos recibidos. End Sub End Module
Que majadero trabajar en C++- Con razón que hoy en día solo lo hacen los que se acostumbraron en el pasado. Edito:Ya funciona al 100 %. Muchas gracias mi muy distinguido amigo. Dejo el código por si alguien lo necesita. #include "stdafx.h" #using <System.dll> using namespace System; using namespace System::Text; using namespace System::IO::Ports; ref class PortDataReceived { public: static void Main() { // Título de la ventana. Console::Title = "Recibir datos desde Arduino con C++ CLR"; // Tamaño ventana consola. Console::WindowWidth = 55; // X. Ancho. Console::WindowHeight = 18; // Y. Alto. SerialPort^ Puerto_serie = gcnew SerialPort("COM4"); Puerto_serie->BaudRate = 115200; Puerto_serie->Parity = Parity::None; Puerto_serie->StopBits = StopBits::One; Puerto_serie->DataBits = 8; Puerto_serie->Handshake = Handshake::None; Puerto_serie->RtsEnable = true; Puerto_serie->DataReceived += gcnew SerialDataReceivedEventHandler(DataReceivedHandler); Puerto_serie->Open(); ConsoleKey tecla; Console::WriteLine("Pulse tecla 1 para encender y 2 para apagar:"); do { tecla = Console::ReadKey(true).Key; // Espera pulsación de teclas. switch (tecla) { { case ConsoleKey::D1: // Tecla 1 del teclado estandar. case ConsoleKey::NumPad1: // Tecla 1 del número del pad. array<Byte> ^miBuffer1 = Encoding::ASCII->GetBytes("Luz_ON"); // Codificación ASCII y guarda en la variable array tipo byte. Puerto_serie->Write(miBuffer1, 0, miBuffer1->Length); // Envía los datos del buffer todo su contenido. Console::WriteLine("Comando \"Luz_ON\" enviado."); // Muestra en pantalla comandos enviado. break; } { case ConsoleKey::D2: case ConsoleKey::NumPad2: array<Byte> ^miBuffer2 = Encoding::ASCII->GetBytes("Luz_OFF"); Puerto_serie->Write(miBuffer2, 0, miBuffer2->Length); Console::WriteLine("Comando \"Luz_OFF\" enviado."); break; } { default: Console::WriteLine("Tecla el 1, el 2 y Escape para salir."); break; } } } while (tecla != ConsoleKey::Escape); // Pulsa Escape para salir del menú. Console::WriteLine("Presione cualquier tecla para terminar..."); Console::WriteLine(); Console::ReadKey(); // Espera pulsar una tecla cualquiera. Puerto_serie->Close(); // Cierra el puerto serie. } // Detecta cualquier dato entrante. private: static void DataReceivedHandler(Object^ sender, SerialDataReceivedEventArgs^ e) { SerialPort^ sp = (SerialPort^)sender; String^ entradaDatos = sp->ReadExisting(); // Almacena los datos recibidos en la variable tipo string. Console::WriteLine("Dato recibido desde Arduino: " + entradaDatos); // Muestra en pantalla los datos recibidos.; } }; int main(array<System::String ^> ^args) { PortDataReceived::Main(); }
|
|
|
506
|
Programación / Programación C/C++ / No me funciona este código
|
en: 31 Julio 2017, 18:38 pm
|
Hola: Estoy probando y modificando este código en C++ con Visual Studio Community 2017. En el C++ CLR. Sigo este enlace. https://msdn.microsoft.com/es-es/library/system.io.ports.serialport.datareceived(v=vs.110).aspx?cs-save-lang=1&cs-lang=cpp#code-snippet-2 El codigo nuevo que he indicado es este. // Envio_y_recepcion_puerto_serie_cpp.cpp: archivo de proyecto principal. #include "stdafx.h" #using <System.dll> using namespace System; using namespace System::Text; using namespace System::IO::Ports; // array<System::String ^> ^args ref class PortDataReceived { public: static void Main() { // Título de la ventana. Console::Title = "Recibir datos desde Arduino con C++ CLR"; // Tamaño ventana consola. Console::WindowWidth = 55; // X. Ancho. Console::WindowHeight = 18; // Y. Alto. SerialPort^ Puerto_serie = gcnew SerialPort("COM4"); Puerto_serie->BaudRate = 115200; Puerto_serie->Parity = Parity::None; Puerto_serie->StopBits = StopBits::One; Puerto_serie->DataBits = 8; Puerto_serie->Handshake = Handshake::None; Puerto_serie->RtsEnable = true; Puerto_serie->DataReceived += gcnew SerialDataReceivedEventHandler(DataReceivedHandler); Puerto_serie->Open(); ConsoleKey tecla; Console::WriteLine("Pulse tecla 1 para encender y 2 para apagar:"); do { tecla = Console::ReadKey(true).Key; // Espera pulsación de teclas. switch (tecla) { case ConsoleKey::D1: // Tecla 1 del teclado estandar. case ConsoleKey::NumPad1: // Tecla 1 del número del pad. array<Byte> ^miBuffer1 = Encoding::ASCII->GetBytes("Luz_ON"); // Codificación ASCII y guarda en la variable array tipo byte. Puerto_serie->Write(miBuffer1, 0, miBuffer1->Length); // Envía los datos del buffer todo su contenido. Console::WriteLine("Comando \"Luz_ON\" enviado."); // Muestra en pantalla comandos enviado. break; case ConsoleKey::D2: case ConsoleKey::NumPad2: array<Byte> ^miBuffer2 = Encoding::ASCII->GetBytes("Luz_OFF"); Puerto_serie->Write(miBuffer2, 0, miBuffer2->Length); Console::WriteLine("Comando \"Luz_OFF\" enviado."); break; default: Console::WriteLine("Tecla el 1, el 2 y Escape para salir."); break; } } while (tecla != ConsoleKey::Escape); // Pulsa Escape para salir del menú. Console::WriteLine("Presione cualquier tecla para terminar..."); Console::WriteLine(); Console::ReadKey(); // Espera pulsar una tecla cualquiera. Puerto_serie->Close(); // Cierra el puerto serie. } // Detecta cualquier dato entrante. private: static void DataReceivedHandler(Object^ sender, SerialDataReceivedEventArgs^ e) { SerialPort^ sp = (SerialPort^)sender; String^ entradaDatos = sp->ReadExisting(); // Almacena los datos recibidos en la variable tipo string. Console::WriteLine("Dato recibido desde Arduino: " + entradaDatos); // Muestra en pantalla los datos recibidos.; } }; int main(array<System::String ^> ^args) { PortDataReceived::Main(); }
En apariencia no parece tener errores, al compilar me suelta estos 5 errrores. Gravedad Código Descripción Proyecto Archivo Línea Estado suprimido Error C1854 no se puede sobrescribir la información realizada durante la creación del encabezado precompilado en el archivo objeto: 'c:\users\meta\documents\visual studio 2017\projects\envio_y_recepcion_puerto_serie_cpp\envio_y_recepcion_puerto_serie_cpp\debug\stdafx.obj' Envio_y_recepcion_puerto_serie_cpp C:\Users\Meta\documents\visual studio 2017\Projects\Envio_y_recepcion_puerto_serie_cpp\Envio_y_recepcion_puerto_serie_cpp\stdafx.cpp 5 Gravedad Código Descripción Proyecto Archivo Línea Estado suprimido Error C2361 la inicialización de 'miBuffer2' se omite en la etiqueta 'default' Envio_y_recepcion_puerto_serie_cpp C:\Users\Meta\documents\visual studio 2017\Projects\Envio_y_recepcion_puerto_serie_cpp\Envio_y_recepcion_puerto_serie_cpp\Envio_y_recepcion_puerto_serie_cpp.cpp 64 ¿Cómo lo soluciono? Saludos.
|
|
|
510
|
Programación / Programación C/C++ / Re: Elegir el evento exacto
|
en: 27 Julio 2017, 05:40 am
|
Hola: De todo el formulario este es du código: // MFC_ArduinoDlg.cpp: archivo de implementación // #include "stdafx.h" #include "MFC_Arduino.h" #include "MFC_ArduinoDlg.h" #include "afxdialogex.h" #include "SerialClass.h" #include <iostream> #include <fstream> #include <Windows.h> #ifdef _DEBUG #define new DEBUG_NEW #endif // Cuadro de diálogo de CMFC_ArduinoDlg // Puerto serie. Serial* Puerto = new Serial("COM4"); // Comandos para Arduino. char Luz_ON[] = "Luz_ON"; // Envía "Luz_ON" al puerto serie. char Luz_OFF[] = "Luz_OFF"; char lectura[50] = "\0"; // Guardan datos de entrada del puerto. CMFC_ArduinoDlg::CMFC_ArduinoDlg(CWnd* pParent /*=NULL*/) : CDialogEx(IDD_MFC_ARDUINO_DIALOG, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CMFC_ArduinoDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CMFC_ArduinoDlg, CDialogEx) ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON2, &CMFC_ArduinoDlg::OnBnClickedButton2) ON_BN_CLICKED(IDC_BUTTON1, &CMFC_ArduinoDlg::OnBnClickedButton1) ON_EN_UPDATE(IDC_EDIT_MENSAJE_DESDE_ARDUINO, &CMFC_ArduinoDlg::OnEnUpdateEditMensajeDesdeArduino) END_MESSAGE_MAP() // Controladores de mensaje de CMFC_ArduinoDlg BOOL CMFC_ArduinoDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // Establecer el icono para este cuadro de diálogo. El marco de trabajo realiza esta operación // automáticamente cuando la ventana principal de la aplicación no es un cuadro de diálogo SetIcon(m_hIcon, TRUE); // Establecer icono grande SetIcon(m_hIcon, FALSE); // Establecer icono pequeño // TODO: agregar aquí inicialización adicional return TRUE; // Devuelve TRUE a menos que establezca el foco en un control } // Si agrega un botón Minimizar al cuadro de diálogo, necesitará el siguiente código // para dibujar el icono. Para aplicaciones MFC que utilicen el modelo de documentos y vistas, // esta operación la realiza automáticamente el marco de trabajo. void CMFC_ArduinoDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // Contexto de dispositivo para dibujo SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // Centrar icono en el rectángulo de cliente int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Dibujar el icono dc.DrawIcon(x, y, m_hIcon); } else { CDialogEx::OnPaint(); } } // El sistema llama a esta función para obtener el cursor que se muestra mientras el usuario arrastra // la ventana minimizada. HCURSOR CMFC_ArduinoDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } void CMFC_ArduinoDlg::OnBnClickedButton2() { // Encender luz. Puerto->WriteData(Luz_ON, sizeof(Luz_ON) - 1); // Envía al puerto el texto "Luz_ON". } void CMFC_ArduinoDlg::OnBnClickedButton1() { // Apagar Luz. Puerto->WriteData(Luz_OFF, sizeof(Luz_OFF) - 1); // Envía al puerto el texto "Luz_OFF". } /* // Este código qu eme dieron da error. HANDLE hCom; OVERLAPPED o; BOOL fSuccess; DWORD dwEvtMask; if (WaitCommEvent(hCom, &dwEvtMask, &o)) { OnEnUpdateEditMensajeDesdeArduino(); } */ void CMFC_ArduinoDlg::OnEnUpdateEditMensajeDesdeArduino() { int n = Puerto->ReadData(lectura, 49); if (n > 0) { lectura[n + 1] = '\0'; SetDlgItemText(IDC_EDIT_MENSAJE_DESDE_ARDUINO, lectura); } }
Los códigos son generados, mira a partir de la línea 101 que ahí es cuando empecé a codear. No entiendo la parte del CreateFile, ni papa, cero patatero y estoy pescando. Cazando moscas. Uso la librería Seriaclass. https://github.com/Gmatarrubia/LibreriasTutorialesEspero resolver esto. Si que es complicado el tema del MFC C++, con razón que nadie lo puede ver, ajjajaj ajjaj ajajaj aa.
|
|
|
|
|
|
|