[問題] 一個讀取 uart 的 process

看板C_and_CPP (C/C++)作者 (非常念舊)時間3年前 (2021/04/25 21:24), 編輯推噓5(508)
留言13則, 5人參與, 3年前最新討論串1/3 (看更多)
版友好 我是在 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 懇請建議,謝謝。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 59.115.86.19 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1619357089.A.EEF.html

04/25 21:27, 3年前 , 1F
此 code 只是概念,不能編過也少了寫語法宣告
04/25 21:27, 1F

04/25 23:44, 3年前 , 2F
看起來每次都從packet的開頭重新確認是否有0xba跟0xab
04/25 23:44, 2F

04/25 23:45, 3年前 , 3F
還是可先記著這次的結尾讓下次不要從for int i = 0開始
04/25 23:45, 3F

04/25 23:46, 3年前 , 4F
還是每次packet都是新的?
04/25 23:46, 4F

04/25 23:48, 3年前 , 5F
我本身是不太懂serial driver
04/25 23:48, 5F

04/25 23:49, 3年前 , 6F
if(i == check_len -1 &&..) 應該可以單獨拉出去迴圈
04/25 23:49, 6F

04/25 23:49, 3年前 , 7F
避免每次loop都檢查一次\
04/25 23:49, 7F

04/25 23:52, 3年前 , 8F
我23:44的推文可以忽略 我看懂了
04/25 23:52, 8F

04/26 00:13, 3年前 , 9F
我第一個想法是sliding window
04/26 00:13, 9F

04/26 00:18, 3年前 , 10F
有沒有一些checksum 用數學方法去算0xab 0xba
04/26 00:18, 10F

04/26 08:46, 3年前 , 11F
你是要收到訊息就能反應的,還是可以慢點再去回應?
04/26 08:46, 11F

04/26 09:20, 3年前 , 12F
https://ideone.com/gBs4nf 用個state machine?
04/26 09:20, 12F

04/26 13:30, 3年前 , 13F
怎麼有一種在重刻tcp的感覺(只是比喻)
04/26 13:30, 13F
文章代碼(AID): #1WXMsXxl (C_and_CPP)
文章代碼(AID): #1WXMsXxl (C_and_CPP)