Puerto serie con F#

Iniciado por Meta, 8 Diciembre 2015, 00:42 AM

0 Miembros y 1 Visitante están viendo este tema.

Meta

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 (csharp) [Seleccionar]
using System;
using System.IO.Ports;

class PortDataReceived
{
    public static void Main()
    {
        SerialPort mySerialPort = new SerialPort("COM1");

        mySerialPort.BaudRate = 9600;
        mySerialPort.Parity = Parity.None;
        mySerialPort.StopBits = StopBits.One;
        mySerialPort.DataBits = 8;
        mySerialPort.Handshake = Handshake.None;
        mySerialPort.RtsEnable = true;

        mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

        mySerialPort.Open();

        Console.WriteLine("Press any key to continue...");
        Console.WriteLine();
        Console.ReadKey();
        mySerialPort.Close();
    }

    private static void DataReceivedHandler(
                        object sender,
                        SerialDataReceivedEventArgs e)
    {
        SerialPort sp = (SerialPort)sender;
        string indata = sp.ReadExisting();
        Console.WriteLine("Data Received:");
        Console.Write(indata);
    }
}


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

Gracias.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Eleкtro

#1
Cita de: Meta en  8 Diciembre 2015, 00:42 AMsaber 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








Meta

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 (csharp) [Seleccionar]
module ReadTape
   
    // Intenté poner un título de la ventana, pero no se como es.
  //  System.Console.Title = "Título del programa"

    open System.IO

    exception NoTape  // used to force exit when no further tape to read

    // Open serial port
    let OpenPort () =
        let port = new System.IO.Ports.SerialPort ("COM1", 115200, Ports.Parity.None, 8, Ports.StopBits.Two)
        port.Open ()
        port.DtrEnable   <- true
        port.RtsEnable   <- true
        port.ReadTimeout <- 1000
        port

    let port = OpenPort ()                   

    let ReadRaw f =
        let buffer: byte[] = Array.zeroCreate (250*60*30) // 15 minutes of paper tape reading
        let rec GetBytes i =
            try
                    buffer.[i] <- byte (port.ReadByte ())
                    GetBytes (i+1)
            with
            _   ->  i // finish on timeout   
        printfn "La lectura de cinta para %s" f
        printf "Cinta de carga y el tipo de golpe cualquier tecla ..."
        System.Console.ReadLine () |> ignore
        let count = (GetBytes 30)+30 // force 3 inches of leader and trailer)
        printfn "%d
bytes de entrada" (count-60)
        let rec TrimLeft i =
            if   i = count
            then printfn "cinta vacía"
                 0
            elif buffer.[i] = 0uy
            then TrimLeft (i+1)
            else i
        let rec TrimRight i =
            if   i = 0
            then printfn "cinta vacía"
                 count
            elif buffer.[i] = 0uy
            then TrimRight (i-1)
            else i
        let start  = max 30 ((TrimLeft 0)-30)
        let finish = min (count-30) ((TrimRight count)+30)       
        let trimmed = buffer.[start..finish]
        printfn "%d bytes de salida" trimmed.Length
        try File.WriteAllBytes (f, trimmed) with
        e   -> System.Console.WriteLine f


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


Si es posible, quiero lograr hacer el código sencillo como indica el de C#.
Código (csharp) [Seleccionar]
    using System;
    using System.IO.Ports;
     
    class PortDataReceived
    {
        public static void Main()
        {
            SerialPort mySerialPort = new SerialPort("COM1");
     
            mySerialPort.BaudRate = 9600;
            mySerialPort.Parity = Parity.None;
            mySerialPort.StopBits = StopBits.One;
            mySerialPort.DataBits = 8;
            mySerialPort.Handshake = Handshake.None;
            mySerialPort.RtsEnable = true;
     
            mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
     
            mySerialPort.Open();
     
            Console.WriteLine("Press any key to continue...");
            Console.WriteLine();
            Console.ReadKey();
            mySerialPort.Close();
        }
     
        private static void DataReceivedHandler(
                            object sender,
                            SerialDataReceivedEventArgs e)
        {
            SerialPort sp = (SerialPort)sender;
            string indata = sp.ReadExisting();
            Console.WriteLine("Data Received:");
            Console.Write(indata);
        }
    }


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 (csharp) [Seleccionar]
then System.Console.WriteLine "Error: archivo READTAPE"

No se si esto es normal.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Eleкtro

#3
Cita de: Meta en  8 Diciembre 2015, 12:45 PMEl 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.

Cita de: Meta en  8 Diciembre 2015, 12:45 PM
Código (csharp,1,2,3) [Seleccionar]
let  cmdLine = System.Environment.GetCommandLineArgs()
if   cmdLine.Length < 2
   then System.Console.WriteLine "Error: archivo READTAPE"
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








Meta

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 (csharp) [Seleccionar]
    // Open serial port
    let OpenPort () =
        let port = new System.IO.Ports.SerialPort ("COM1", 115200, Ports.Parity.None, 8, Ports.StopBits.Two)
        port.Open ()
        port.DtrEnable   <- true
        port.RtsEnable   <- true
        port.ReadTimeout <- 1000
        port

    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#.
[youtube=640,360]https://www.youtube.com/watch?v=F6P0ZOceTko[/youtube]

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

Un cordial saludo.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/