我是 F# 新手,需要帮助来解决此问题。
我有一个字节流,它来自串行端口并在 F# 中表示为序列。流由帧组成,每个帧以 0xFE 开始,以 0xFF 结束。连续传输字节,为了同步,我必须跳过一些字节直到 0xFE。但流可能已损坏并且可能缺少 0xFE 或 0xFF。
我有一个通过串行端口的输入进行迭代的函数。函数代码为:
let getFrame s =
let r = s |> Seq.skipWhile (fun x->x<>0xFEuy)
|> Seq.takeWhile (fun x->x<>0xFFuy)
if Seq.isEmpty r then r else Seq.skip 1 r
如何重写此代码以跳过字节直到 0xFE 或跳过一定数量的字节,如果没有发生 0xFE,则以功能方式返回错误?
对于取帧字节直到 0xFF 也是如此。
最佳答案
您可以使用Option<'T>
键入作为函数的结果,其中 Some x
意味着从输入序列中捕获了一些帧,并且 None
没有找到帧数据:
let getFrame s =
let r = s |> Seq.skipWhile ((<>) 0xFEuy)
|> Seq.takeWhile ((<>) 0xFFuy)
if Seq.isEmpty r then None
else Some (Seq.skip 1 r)
但是,正确的故障处理实现取决于 getFrame
的语义功能。例如,如果 0xFE
会怎样?存在,但没有 0xFF
?这是否意味着这不是一个数据框?这是否意味着数据帧被分割成多个序列?等等
关于error-handling - 如何在 F# 中正确读取带有帧边界的字节流并进行错误处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18273647/