Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Meta en 8 Diciembre 2015, 00:42 am



Título: Puerto serie con F#
Publicado por: Meta 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.


Título: Re: Puerto serie con F#
Publicado por: Eleкtro 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.

  • Serial Port Reader in F# (http://www.fssnip.net/9s)

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

Saludos


Título: Re: Puerto serie con F#
Publicado por: Meta 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 (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.


Título: Re: Puerto serie con F#
Publicado por: Eleкtro 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


Título: Re: Puerto serie con F#
Publicado por: Meta 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 (https://drive.google.com/file/d/0B6HKwsbbpgrLMWNqZEp5a3pkWkE/view) 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.
(http://www.subeimagenes.com/img/chat-1558931.png)

Con Windows Form si em funciona en C#.
F6P0ZOceTko

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

Un cordial saludo.