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.
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
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 =newSystem.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#.
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
then System.Console.WriteLine"Error: archivo READTAPE"
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
« Última modificación: 8 Diciembre 2015, 13:11 pm por Eleкtro »
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
// Open serial port
let OpenPort ()=
let port =newSystem.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#.
Por eso, como sea, quiero hacerlo funcionar con F#.