elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  MS-DOS y puerto serie
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: MS-DOS y puerto serie  (Leído 12,514 veces)
Meta


Desconectado Desconectado

Mensajes: 3.501



Ver Perfil WWW
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.


En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.885



Ver Perfil
Re: MS-DOS y puerto serie
« Respuesta #1 en: 6 Agosto 2017, 12:39 pm »

Quiero enviar datos al puerto serie con el CMD de Windows

En teoría se supone que en Batch puedes usar los operadores de redirección para enviar datos a la entrada de un dispositivo en un puerto serie. Prueba así:

Script.cmd
Código
  1. @Echo OFF & (CHCP 1252)1>Nul
  2.  
  3. MODE.com COM1 BAUD=9600 PARITY=n DATA=8 STOP=1
  4.  
  5. CHOICE.exe /C "12" /M "Choose an option..."
  6. If %ErrorLevel% EQU 1 (
  7.    Echo:Luz_ON>COM1
  8. )
  9. If %ErrorLevel% EQU 2 (
  10.    Echo:Luz_OFF>COM1
  11. )
  12.  
  13. Pause&Exit

...Y digo 'en teoría' por que nunca lo he necesitado probar ni tampoco puedo verificarlo ahora mismo.

Fuente:



o el sustituto del cmd que es PowerShell

@Meta, sabes manejarte con C#, y dado que estos temas los has tratado muchas veces en el subforo de programación .NET doy por hecho que sabes hacerlo en C#. Entonces, en mi opinión lo que más te convendría hacer sería desarrollar la lógica/tu clase en C# para tener una solución mucho más robusta, controlada y eficiente, y simplemente usar PowerShell para compilar el código escrito en C# y usarlo.

Aquí te dejo un ejemplo a seguir:

Script.ps1
Código
  1. # PowerShell template by Elektro
  2.  
  3. # # # # # # # # # # # # # # # # # # # #
  4. # C# CodeDom Provider Compiler Sample #
  5. # # # # # # # # # # # # # # # # # # # #
  6. $csharpCode = @'
  7. using Microsoft.VisualBasic;
  8. using System;
  9.  
  10. namespace CSharpNamespace {
  11.  
  12.    public sealed class CSharpClass {
  13.  
  14.        public static bool CSharpFunction() {
  15.            return true;
  16.        }
  17.  
  18.    }
  19.  
  20. }
  21. '@
  22. $csType = Add-Type -TypeDefinition $csharpCode `
  23.                   -CodeDomProvider (New-Object Microsoft.CSharp.CSharpCodeProvider) `
  24.                   -PassThru `
  25.                   -ReferencedAssemblies "Microsoft.VisualBasic.dll", `
  26.                                         "System.dll" `
  27.          | where { $_.IsPublic }
  28.  
  29. [bool]$result = [CSharpNamespace.CSharpClass]::CSharpFunction()
  30.  
  31. # # # # # # # # # # # # # #
  32. # Application Termination #
  33. # # # # # # # # # # # # # #
  34. [System.Console]::WriteLine("Press any key to exit...")
  35. [System.Console]::ReadKey($true)
  36. Exit(0)


« Última modificación: 6 Agosto 2017, 12:53 pm por Eleкtro » En línea



Meta


Desconectado Desconectado

Mensajes: 3.501



Ver Perfil WWW
Re: MS-DOS y puerto serie
« Respuesta #2 en: 6 Agosto 2017, 19:09 pm »

Hola:

Centrándome en el .cmd, o lo que es lo mismio, el .bat, no funciona el código:
Código
  1.    @Echo OFF & (CHCP 1252)1>Nul
  2.  
  3.    MODE.com COM4 BAUD=115200 PARITY=n DATA=8 STOP=1
  4.  
  5.    CHOICE.exe /C "12" /M "Escoge una opción..."
  6.    If %ErrorLevel% EQU 1 (
  7.        Echo:Luz_ON>COM4
  8.    )
  9.    If %ErrorLevel% EQU 2 (
  10.        Echo:Luz_OFF>COM4
  11.    )
  12.  
  13.    Pause&Exit

Lo que he hecho es hacer guardar hacer dos archivos, uno llamado puerto_Luz_ON.txt y el otro llamado puerto_Luz_OFF.txt. En el puerto_Luz_ON.txt tiene solo el texto Luz_ON y el otro Luz_OFF de los txt.

Luego en el cmd puse:
Código
  1. copy puerto_Luz_ON.txt COM4:

Ya me funciona, he enviado Luz_ON que está en el interior del archivo puerto_Luz_ON.txt.

Modificando el Scrip.cmd de arriba lo he hecho funcionar así:
Código
  1.    @Echo OFF & (CHCP 1252)1>Nul
  2.  
  3.    MODE.com COM4 BAUD=115200 PARITY=n DATA=8 STOP=1
  4.  
  5.    CHOICE.exe /C "12" /M "Escoge una opción..."
  6.    If %ErrorLevel% EQU 1 (
  7.        copy puerto_Luz_ON.txt COM4:
  8.    )
  9.    If %ErrorLevel% EQU 2 (
  10.        copy puerto_Luz_OFF.txt COM4:
  11.    )
  12.  
  13.    Pause&Exit

Lo que no me hace gracia es que tengo que crear dos archivos .txt al lado del Script.cmd. La idea es tener todo en un solo archivo .cmd. Para eso se podría que no se si se puede, el Script.cmd crear los dos archivos .txt y su contenido Luz_ON y Luz_OFF. Poco a poco va tomando forma.

Datos de interés, el modo más rápido y abreviado frente a este:
Código
  1. MODE.com COM4 BAUD=115200 PARITY=n DATA=8 STOP=1

Es este:
Código
  1. MODE COM4:115200,n,8,1



En cuanto hacer el control del puerto serie con F#, no tiene que ver con C#, su codigo en C# si lo tengo hecho.
Código
  1. using System;
  2. using System.IO.Ports;
  3. using System.Text;
  4.  
  5. namespace Arduino_Consola_cs
  6. {
  7.    class Program
  8.    {
  9.        static void Main(string[] args)
  10.        {
  11.            // Título de la ventana.
  12.            Console.Title = "Arduino Consola C#";
  13.  
  14.            // Tamaño ventana consola.
  15.            Console.WindowWidth = 55; // X. Ancho.
  16.            Console.WindowHeight = 18; // Y. Alto.
  17.  
  18.            // Cree un nuevo objeto SerialPort con la configuración predeterminada.
  19.            SerialPort Puerto_serie = new SerialPort("COM4");
  20.  
  21.            Puerto_serie.BaudRate = 115200;
  22.            Puerto_serie.Parity = Parity.None;
  23.            Puerto_serie.StopBits = StopBits.One;
  24.            Puerto_serie.DataBits = 8;
  25.            Puerto_serie.Handshake = Handshake.None;
  26.            Puerto_serie.RtsEnable = true;
  27.  
  28.            // Establecer los tiempos de espera de lectura / escritura.
  29.            Puerto_serie.ReadTimeout = 500; // Milisegundos.
  30.            Puerto_serie.WriteTimeout = 500;
  31.  
  32.            // Detecta cualquier dato recibido.
  33.            Puerto_serie.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
  34.  
  35.            Puerto_serie.Open(); // Abrir puerto.
  36.  
  37.            ConsoleKey tecla;
  38.            Console.WriteLine("Pulse tecla 1 para encender y 2 para apagar:");
  39.  
  40.            do
  41.            {
  42.                tecla = Console.ReadKey(true).Key; // Espera pulsación de teclas.
  43.  
  44.                switch (tecla)
  45.                {
  46.                    case ConsoleKey.D1: // Tecla 1 del teclado estandar.
  47.                    case ConsoleKey.NumPad1: // Tecla 1 del número del pad.
  48.                        byte[] miBuffer1 = Encoding.ASCII.GetBytes("Luz_ON"); // Codificación ASCII y guarda en la variable array tipo byte.
  49.                        Puerto_serie.Write(miBuffer1, 0, miBuffer1.Length); // Envía los datos del buffer todo su contenido.
  50.                        Console.WriteLine("Comando \"Luz_ON\" enviado."); // Muestra en pantalla comandos enviado.
  51.                        break;
  52.  
  53.                    case ConsoleKey.D2:
  54.                    case ConsoleKey.NumPad2:
  55.                        byte[] miBuffer2 = Encoding.ASCII.GetBytes("Luz_OFF");
  56.                        Puerto_serie.Write(miBuffer2, 0, miBuffer2.Length);
  57.                        Console.WriteLine("Comando \"Luz_OFF\" enviado.");
  58.                        break;
  59.  
  60.                    default:
  61.                        Console.WriteLine("Tecla el 1, el 2 y Escape para salir.");
  62.                        break;
  63.                }
  64.            } while (tecla != ConsoleKey.Escape); // Pulsa Escape para salir del menú.
  65.  
  66.            Console.WriteLine("Presione cualquier tecla para terminar...");
  67.            Console.WriteLine();
  68.            Console.ReadKey(); // Espera pulsar una tecla cualquiera.
  69.            Puerto_serie.Close(); // Cierra el puerto serie.
  70.        }
  71.  
  72.        // Detecta cualquier dato entrante.
  73.        private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
  74.        {
  75.            SerialPort sp = (SerialPort)sender;
  76.            string entradaDatos = sp.ReadExisting(); // Almacena los datos recibidos en la variable tipo string.
  77.            Console.WriteLine("Dato recibido desde Arduino: " + entradaDatos); // Muestra en pantalla los datos recibidos.
  78.        }
  79.    }
  80. }
  81.  

Si C# ayuda hacer lo mismo en F#, lo tengo crudo porque apenas conozco sus cosas. ;)

Como curiosidad de una noticia nueva del CMD de Windows.



www.muycomputer.com/2017/08/04/consola-de-windows-color/

Saludos.
En línea

Meta


Desconectado Desconectado

Mensajes: 3.501



Ver Perfil WWW
Re: MS-DOS y puerto serie
« Respuesta #3 en: 9 Agosto 2017, 21:37 pm »

Hola:

La mejor opción para enviar datos al puerto serie y funciona bien es este código:
Código
  1.    @Echo OFF & (CHCP 1252)1>Nul
  2.  
  3.    MODE.com COM4 BAUD=115200 PARITY=n DATA=8 STOP=1
  4.  
  5.    CHOICE.exe /C "12" /M "Escoge una opción..."
  6.    If %ErrorLevel% EQU 1 (
  7.       copy puerto_Luz_ON.txt COM4:
  8.    )
  9.    If %ErrorLevel% EQU 2 (
  10.        copy puerto_Luz_OFF.txt COM4:
  11.    )
  12.  
  13.    Pause & Exit

Hay un problemilla. Si pulso la tecla 1 o la tecla 2 para enviar datos, se cierra el CMD. Debería dejarte pulsar las teclas 1 y 2 siempre, no que pulse una tecla y se cierra.

¿Se puede arreglar esto o es así?

Saludos.
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.885



Ver Perfil
Re: MS-DOS y puerto serie
« Respuesta #4 en: 10 Agosto 2017, 09:12 am »

Hay un problemilla. Si pulso la tecla 1 o la tecla 2 para enviar datos, se cierra el CMD. Debería dejarte pulsar las teclas 1 y 2 siempre, no que pulse una tecla y se cierra.

¿Se puede arreglar esto o es así?

( ...en un rango del 1 al "infinito". )

O también:

Saludos
En línea



Meta


Desconectado Desconectado

Mensajes: 3.501



Ver Perfil WWW
Re: MS-DOS y puerto serie
« Respuesta #5 en: 10 Agosto 2017, 12:58 pm »

Hola:

Hice esto, funciona pero no se si es el más adecuado hacerlo de esta manera, me siento que hice chapuza.

Código
  1. @Echo OFF
  2. title Arduino CMD y puerto serie
  3.  
  4. CHCP 1252 >Nul
  5. MODE.com COM4 BAUD=115200 PARITY=n DATA=8 STOP=1
  6. :Menu
  7.    CLS
  8.    echo.
  9.    echo.
  10.    echo.                   1.- Luz  ON
  11.    echo.
  12.    echo.                   2.- Luz  OFF
  13.    echo.
  14.    echo.                   3.- Salir
  15.    echo.
  16.    echo.
  17.    echo.
  18.  
  19.    CHOICE.exe /C "123" /M "                   Escoge una opción "
  20.    echo.
  21.    echo.
  22.    echo.
  23.  
  24.    If %ErrorLevel% EQU 1 (
  25.        copy puerto_Luz_ON.txt  COM4:
  26.        echo Puerto COM4: Luz ON
  27.        timeout 1 >nul
  28.        goto Menu
  29.    )
  30.  
  31.    If %ErrorLevel% EQU 2 (
  32.        copy puerto_Luz_OFF.txt COM4:
  33.        echo Puerto COM4: Luz OFF
  34.        timeout 1 >nul
  35.        goto Menu
  36.    )
  37.  
  38.    Pause
  39.  
  40.    Exit /B

Hay otra cosa que no se como se hace.

A la hora de recibir datos por el puerto serie. ¿Cómo se hace?

Lo comento porque cada vez que envío al puerto serie Luz_ON, desde el puerto serie me devuelve Luz encendido. Este mensaje tiene que mostrarse en pantalla.

Saludos.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Adaptador de puerto de serie a ps2?
Electrónica
jaciga 1 3,962 Último mensaje 18 Abril 2005, 11:38 am
por + enrique ZP
Puerto serie con C#
.NET (C#, VB.NET, ASP)
Meta 0 8,506 Último mensaje 6 Agosto 2008, 18:43 pm
por Meta
Puerto serie con F#
.NET (C#, VB.NET, ASP)
Meta 4 3,986 Último mensaje 9 Diciembre 2015, 10:39 am
por Meta
Puerto serie por Web
.NET (C#, VB.NET, ASP)
Meta 0 1,887 Último mensaje 9 Enero 2022, 12:58 pm
por Meta
Recibir email y enviar al puerto serie
.NET (C#, VB.NET, ASP)
Meta 1 3,404 Último mensaje 10 Febrero 2023, 18:14 pm
por Meta
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines