通用可靠的串口/以太網網關設計
1.2.2 串口接收
串口接收使用中斷方式,從串口接收到的字節數據并不直接處理,而是先存入一個環形緩沖,環形緩沖示意圖如圖4所示。從頭偏移處寫入,從尾偏移處讀出,每寫入或讀出一字節頭或尾都將模遞增,且頭偏移處為空,尾偏移處為滿。本文引用地址:http://www.104case.com/article/148750.htm
只要串口接收到數據,就將其從頭偏移處寫入串口的環形緩沖。如果緩沖滿了,則用新數據覆蓋未處理的舊數據。
在將一個字節數據寫入緩沖的同時,判斷其是否等于幀結束定界符EFD,如果等于,則表示緩沖中可能存在一個完整的幀(只是可能,并不能完全確定,因為一個普通的字節數據完全有可能正好等于EFD),此時便可從環形緩沖中按幀格式解析數據。若解析到完整的幀,則做相應的處理:首先,根據幀中FCS字段做差錯校驗,如果校驗正確,則從串口回送一個同序號的確認幀;然后從幀中取出凈荷數據從Socket發送。
從緩沖中解析數據的過程簡述如下:從環形緩沖的尾偏移處開始讀字節數據,查驗是否等于幀開始定界符SFD,若不等于則丟棄并繼續讀下一字節,若等于則向后偏移讀取長度域LEN,根據長度值,便能確定幀結束定界符EFD的位置。查驗此位置的字節數據,若不等于EFD,則認為之前等于SFD的字節只是個普通數據,并不是幀開始定界符,將其丟棄并繼續讀取查驗下一字節;若等于EFD,則認為SFD到FFD之間為一個完整的幀。
1.3 Socket數據傳送
Socket數據傳送的幀格式如下:
相比串口幀格式,少了Seq.、Type和FCS字段。這三個字段在串口數據傳送中是用來保證可靠性的,而網關使用TCP Socket,下層的TCP協議會保證通信的可靠性,應用層只需要保證數據的完整性,所以不需要這些字段。其他字段相同,意義也分別相同。
1 3.1 Socket發送
Socket接收過程同串口接收類似,接收的數據并不直接處理,而是先存入環形緩沖。然后,按Socket幀格式,解析環形緩沖中的數據。解析到的數據幀插入串口發送隊列,從串口轉發。
1.3.2 Socket接收
Socket發送相比串口發送操作更簡單,因為下層的TCP協議會保證通信的可靠性,所以不需要再另外實現確認、重發等機制,發送隊列中只需要一個待發送隊列即可,不需要待確認隊列。而且在具體實現中,并沒有真的構造一個Socket發送隊列,而是利用了操作系統提供的線程間通信機制中的郵箱通信方式,需要從Socket發送數據時,只需將數據的首地址以郵件的方式發送到Socket發送線程指定的郵箱中。
2 網關實現
2.1 軟硬件平臺
網關軟硬件平臺包括操作系統RT-Thread和ARM9開發板Mini2440。
tcp/ip相關文章:tcp/ip是什么
評論