У меня есть простые инструкции чтения и записи в f # для связи между последовательными портами:
async {
do! port.AsyncWriteLineAsByte messange
let! response = port.AsyncReadLineAsByte()
return response
}
Где ответ - байт [], а метод прост:
member this.AsyncReadLineAsByte() : Async<byte[]> =
async {
let buffer_ref = ref (Array.zeroCreate<byte> this.ReadBufferSize)
let buffer = !buffer_ref
let! read_bytes = this.BaseStream.AsyncRead(buffer, 0, this.ReadBufferSize)
return buffer
}
Ихорошо это работает, это отправляет и получает сообщения, есть один, но во всем этом.Чтение ответов должно быть на каком-то событии.Я новичок в F #, но я попробовал что-то вроде:
async {
let data_recived_event = port.AsyncReadLineAsByte()
do! port.AsyncWriteLineAsByte messange
port.DataReceived.AddHandler(data_recived_event) // it says SerialDataReciveHandler is what he expects
let! response = ???
return response
}
Но не повезло, документация скорее, для f # она просто определяет прототип и конструкцию метода, а не практическое использование.Мне нужно событие и способ вернуть это значение, есть ли способ?
РЕДАКТИРОВАТЬ:
Я смог добавить событие, поскольку пространство имен последовательного порта имеет подписку на событие DataReceived.AddHandler.
Так что теперь это выглядит:
async {
let data_recived() =
async{
let! buffer = port.AsyncReadLineAsByte()
printfn "Response from event %A" buffer
// return buffer
} |> fun response -> Async.RunSynchronously(response)
port.DataReceived.AddHandler(fun _ _ -> data_recived())
do! port.AsyncWriteLineAsByte messange
let! response = port.AsyncReadLineAsByte()
return response
}
И это работает, проблема все еще в том, как вернуть такое значение из события, если я сделаю что-то вроде:
let data_recived() =
async{
let! buffer = port.AsyncReadLineAsByte()
printfn "Response from event %A" buffer
return buffer
} |> fun response -> Async.RunSynchronously(response)
port.DataReceived.AddHandler(fun _ _ -> response = data_recived())
Isговорит, что ожидает Uint и получить bool