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.
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.
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.
- 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
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.
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#.
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:
then System.Console.WriteLine "Error: archivo READTAPE"
No se si esto es normal.
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
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
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.
// 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.