Test Foro de elhacker.net SMF 2.1

Programación => Programación General => .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 (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.
Título: Re: Puerto serie con F#
Publicado por: Eleкtro en 8 Diciembre 2015, 10:49 AM
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
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 (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 (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.
Título: Re: Puerto serie con F#
Publicado por: Eleкtro en 8 Diciembre 2015, 13:04 PM
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
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 (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.
(http://www.subeimagenes.com/img/chat-1558931.png)

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.