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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Puerto serie con F#
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Puerto serie con F#  (Leído 3,940 veces)
Meta


Desconectado Desconectado

Mensajes: 3.501



Ver Perfil WWW
Puerto serie con F#
« en: 8 Diciembre 2015, 00:42 am »

Hola:

Antes que nada, quiero saber si F# se puede usar el puerto serie.
Mirando en este enlace se puede ver un ejemplo de C#, VB y C++.
https://msdn.microsoft.com/es-es/library/system.io.ports.serialport.datareceived%28v=vs.110%29.aspx

Cuando le doy a F# para ver el código no aparece, es decir, que no tiene.
Código
  1. using System;
  2. using System.IO.Ports;
  3.  
  4. class PortDataReceived
  5. {
  6.    public static void Main()
  7.    {
  8.        SerialPort mySerialPort = new SerialPort("COM1");
  9.  
  10.        mySerialPort.BaudRate = 9600;
  11.        mySerialPort.Parity = Parity.None;
  12.        mySerialPort.StopBits = StopBits.One;
  13.        mySerialPort.DataBits = 8;
  14.        mySerialPort.Handshake = Handshake.None;
  15.        mySerialPort.RtsEnable = true;
  16.  
  17.        mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
  18.  
  19.        mySerialPort.Open();
  20.  
  21.        Console.WriteLine("Press any key to continue...");
  22.        Console.WriteLine();
  23.        Console.ReadKey();
  24.        mySerialPort.Close();
  25.    }
  26.  
  27.    private static void DataReceivedHandler(
  28.                        object sender,
  29.                        SerialDataReceivedEventArgs e)
  30.    {
  31.        SerialPort sp = (SerialPort)sender;
  32.        string indata = sp.ReadExisting();
  33.        Console.WriteLine("Data Received:");
  34.        Console.Write(indata);
  35.    }
  36. }

Quiero saber si existe la posibilidad de mostrar el código o saber si se puede usar el puerto serie en F#.

Gracias.


En línea

Eleкtro
Ex-Staff
*
Conectado Conectado

Mensajes: 9.878



Ver Perfil
Re: Puerto serie con F#
« Respuesta #1 en: 8 Diciembre 2015, 10:49 am »

saber si se puede usar el puerto serie en F#.

Que no haya un código demostrativo en MSDN no significa que no se pueda, a veces solo hay ejemplos para Vb.Net, C#, o C++ administrado, pero excepto algunas diferencias todos pueden realizar practicamente lo mismo usando código administrado (la librería de classes de .Net Framework), aunque a veces no es así.

F# es un lenguaje multi-plataforma desarrollado por Microsoft (entre otros) completamente soportador por .Net Framework.


Lo único es que creo que tiene ciertas limitaciones para el desarrollo de aplicación con interfáz gráfica.

Saludos


« Última modificación: 8 Diciembre 2015, 13:17 pm por Eleкtro » En línea



Meta


Desconectado Desconectado

Mensajes: 3.501



Ver Perfil WWW
Re: Puerto serie con F#
« Respuesta #2 en: 8 Diciembre 2015, 12:45 pm »

Hola:

Me alegra que exista la posibilidad, aunque sea solo en modo consola. He intentado generar el código a ver que tal. A parte de intentar ponerle un título de la ventana y no me sale.

Código
  1. module ReadTape
  2.  
  3.    // Intenté poner un título de la ventana, pero no se como es.
  4.  //  System.Console.Title = "Título del programa"
  5.  
  6.    open System.IO
  7.  
  8.    exception NoTape  // used to force exit when no further tape to read
  9.  
  10.    // Open serial port
  11.    let OpenPort () =
  12.        let port = new System.IO.Ports.SerialPort ("COM1", 115200, Ports.Parity.None, 8, Ports.StopBits.Two)
  13.        port.Open ()
  14.        port.DtrEnable   <- true
  15.        port.RtsEnable   <- true
  16.        port.ReadTimeout <- 1000
  17.        port
  18.  
  19.    let port = OpenPort ()                  
  20.  
  21.    let ReadRaw f =
  22.        let buffer: byte[] = Array.zeroCreate (250*60*30) // 15 minutes of paper tape reading
  23.        let rec GetBytes i =
  24.            try
  25.                    buffer.[i] <- byte (port.ReadByte ())
  26.                    GetBytes (i+1)
  27.            with
  28.            _   ->  i // finish on timeout    
  29.        printfn "La lectura de cinta para %s" f
  30.        printf "Cinta de carga y el tipo de golpe cualquier tecla ..."
  31.        System.Console.ReadLine () |> ignore
  32.        let count = (GetBytes 30)+30 // force 3 inches of leader and trailer)
  33.        printfn "%d
  34. bytes de entrada" (count-60)
  35.        let rec TrimLeft i =
  36.            if   i = count
  37.            then printfn "cinta vacía"
  38.                 0
  39.            elif buffer.[i] = 0uy
  40.            then TrimLeft (i+1)
  41.            else i
  42.        let rec TrimRight i =
  43.            if   i = 0
  44.            then printfn "cinta vacía"
  45.                 count
  46.            elif buffer.[i] = 0uy
  47.            then TrimRight (i-1)
  48.            else i
  49.        let start  = max 30 ((TrimLeft 0)-30)
  50.        let finish = min (count-30) ((TrimRight count)+30)      
  51.        let trimmed = buffer.[start..finish]
  52.        printfn "%d bytes de salida" trimmed.Length
  53.        try File.WriteAllBytes (f, trimmed) with
  54.        e   -> System.Console.WriteLine f
  55.  
  56.  
  57.    let  cmdLine = System.Environment.GetCommandLineArgs()
  58.    if   cmdLine.Length < 2
  59.    then System.Console.WriteLine "Error: archivo READTAPE"
  60.    else ReadRaw cmdLine.[1]

Si es posible, quiero lograr hacer el código sencillo como indica el de C#.
Código
  1.    using System;
  2.    using System.IO.Ports;
  3.  
  4.    class PortDataReceived
  5.    {
  6.        public static void Main()
  7.        {
  8.            SerialPort mySerialPort = new SerialPort("COM1");
  9.  
  10.            mySerialPort.BaudRate = 9600;
  11.            mySerialPort.Parity = Parity.None;
  12.            mySerialPort.StopBits = StopBits.One;
  13.            mySerialPort.DataBits = 8;
  14.            mySerialPort.Handshake = Handshake.None;
  15.            mySerialPort.RtsEnable = true;
  16.  
  17.            mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
  18.  
  19.            mySerialPort.Open();
  20.  
  21.            Console.WriteLine("Press any key to continue...");
  22.            Console.WriteLine();
  23.            Console.ReadKey();
  24.            mySerialPort.Close();
  25.        }
  26.  
  27.        private static void DataReceivedHandler(
  28.                            object sender,
  29.                            SerialDataReceivedEventArgs e)
  30.        {
  31.            SerialPort sp = (SerialPort)sender;
  32.            string indata = sp.ReadExisting();
  33.            Console.WriteLine("Data Received:");
  34.            Console.Write(indata);
  35.        }
  36.    }

A lo mejor en la página en Inglés si está el código y no en español de esta Web. He comprobado que tampoco.
https://msdn.microsoft.com/en-us/library/system.io.ports.serialport.datareceived%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396&cs-save-lang=1&cs-lang=fsharp#code-snippet-1

La verdad, este lenguaje estoy empezando a tener curiosidad, y quiero ser capaz de enviar y recibir datos con F# alguna ven en la vida.Por ahora se resiste.

El código de arriba en F# ejecuta la entrada:
Código
  1. then System.Console.WriteLine "Error: archivo READTAPE"

No se si esto es normal.
En línea

Eleкtro
Ex-Staff
*
Conectado Conectado

Mensajes: 9.878



Ver Perfil
Re: Puerto serie con F#
« Respuesta #3 en: 8 Diciembre 2015, 13:04 pm »

El código de arriba en F# ejecuta la entrada:
...
No se si esto es normal.

¿Realmente esto de aquí abajo no te dice nada de nada?, por que ya te expliqué el motivo en otro post recientemente.

Código
  1. let  cmdLine = System.Environment.GetCommandLineArgs()
  2. if   cmdLine.Length < 2
  3.    then System.Console.WriteLine "Error: archivo READTAPE"
  4. else ReadRaw cmdLine.[1]

De todas formas el código de ese snippet está adaptado para leer el puerto de un dispositivo en específico que envia una cantidad de datos en particular; en lugar de copiar/pegar y traducir códigos aleatorios deberías empezar a practicar con otras cosas mucho más simples en C# (o F#), empezando por búcles, ifs, tipos de excepciones de .Net framework, etc, para ir entendiendo muchas cosas básicas que te ayuden a avanzar. Ya es hora de que te introduzcas en ese aspecto para adquirir características resolutivas a todo tipo de problemas (como este). Ponte a practicar otras cosas generales, ese es mi consejo.

Saludos
« Última modificación: 8 Diciembre 2015, 13:11 pm por Eleкtro » En línea



Meta


Desconectado Desconectado

Mensajes: 3.501



Ver Perfil WWW
Re: Puerto serie con F#
« Respuesta #4 en: 9 Diciembre 2015, 10:39 am »

Hola:

Por lo que entiendo en lo último, no está reciniendo nada. Cosa de F# pesco mucho.

Tengo el código de Arduino preparado para enviar al puerto serie, con C# funciona.

La parte que más o menos entiendo es esta.
Código
  1.    // Open serial port
  2.    let OpenPort () =
  3.        let port = new System.IO.Ports.SerialPort ("COM1", 115200, Ports.Parity.None, 8, Ports.StopBits.Two)
  4.        port.Open ()
  5.        port.DtrEnable   <- true
  6.        port.RtsEnable   <- true
  7.        port.ReadTimeout <- 1000
  8.        port
  9.  
  10.    let port = OpenPort ()  

Programarlo de alguna manera que se puede racibir comandos o textos en F#. De todas maneras, voy a modifiar tanto para enviar y recibir comandos en C# modo consola.

Sigo haciendo pruebas.


Con Windows Form si em funciona en C#.


Por eso, como sea, quiero hacerlo funcionar con F#.

Un cordial saludo.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Lograr comunicar puerto serie con VirtaulBox
GNU/Linux
Meta 1 2,420 Último mensaje 26 Enero 2017, 16:30 pm
por xv0
Puerto serie C++. Mejorar el programa. « 1 2 ... 7 8 »
Programación C/C++
Meta 74 27,996 Último mensaje 31 Marzo 2017, 02:31 am
por Meta
MS-DOS y puerto serie
Scripting
Meta 5 12,429 Último mensaje 10 Agosto 2017, 12:58 pm
por Meta
Puerto serie por Web
.NET (C#, VB.NET, ASP)
Meta 0 1,871 Ú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,361 Último mensaje 10 Febrero 2023, 18:14 pm
por Meta
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines