Re: [问题] 一个读取 uart 的 process

楼主: jimmytzeng (jimmytseng)   2021-05-02 20:34:38
※ 引述《gn00618777 (非常念旧)》之铭言:
: 版友好
: 我是在 Linux 写 C。之前写了一个 process ,是 1个 byte 1 个 byte 读取的
: blocking 程式,每读1个byte就检查是否是 header,但被说写得不好。
: 于是乎再写了一个 non-blocking的,主要是先蒐集我想要的长度后,再检查是否是
: header。
: protocol header 如下:
: byte0 sig1 (0xab)
: byte1 sig2 (0xba)
: byte2 id
: byte3 packet length
: byte4 seq num
: 概念上,我会读取 uart fd,读到的 rcv_len 加总起来,若有我达到的长度
: 就去检查这5个byte是不是有 header。 只要看到 0xab 0xba 我就认定是一个
: header 的起始。也有可能这2个byte出现在这5个byte的任何地方,甚至 byte4
: 会是 0xab,此时我们就有可能需要再读取1个byte来做判定是否有header。当我发
: 现一个header时,我就会从此header到结尾整个位移到packet的起始。并回传 left
: 值,此left值代表意思是说,我还需要读取几个byte来做判定。 我感觉我这写法满
: 囉嗦的,WAIT_HEADER status这样写,WAIT_PAYLOAD status也会这样写,后面势必
: 一大坨,但又想不出啥更好的方法,所以想来求助一下版友看有没有更好的写法?
: 这是我的范例 code: https://reurl.cc/bzrez3
: 恳请建议,谢谢。
我会建议采用producer/consumer多执行绪的设计,一个producer thread 采用token rin
g方式把uart收进资料结构,很单纯的把每一个byte都收进来。
那么另一个consumer 作为解析token ring的thread,在把解析完的packet送进queue或者
是做task dispatch
以上做法是增加你系统容错的程度,我还蛮建议的。
作者: Schottky (顺风相送)   2021-05-04 05:26:00
token ring 是指 circular queue?这其实不需要分成两个 thread 就是了

Links booklink

Contact Us: admin [ a t ] ucptt.com