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