新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 嵌入式環境下串行幀通信的設計與實現

        嵌入式環境下串行幀通信的設計與實現

        作者: 時間:2011-02-17 來源:網絡 收藏

        3.3 幀發送與接收
        鏈路層以幀為單位進行數據收發,一種普遍的界定幀起始與結束的方法是:在待發送數據的頭部和尾部加入特殊的起始碼和結束碼,如果在數據中出現了這個碼型,就必須在數據發送前進行轉義處理,把它轉換成其他碼型,否則將導致幀定位錯誤,數據失敗。很多協議實現者為求實現簡單沒有進行這種轉義,存在失敗的風險,其實在點對點協議(PPP協議)中的描述了一種轉義處理方法,經簡化后,實現起來也并不復雜,描述如下:
        數據發送方在幀首處發送0x7E作為起始碼,逐字節發送封裝后的數據,遇到0x7E時,發送0x7D,0x5E字節序列,遇到0x7D時,發送0x7 D,0x5D字節序列,最后在幀尾處發送0x7E作為結束碼;
        數據接收方在串口數據流中搜索第一個0x7E作為幀起始(連續的0x7E則以最后一個為幀起始),逐字節接收數據,遇到0x7D時,跳過不處理,而把該字節的后一個字節加上0x20,直到遇到0x7E認為幀結束。
        在鏈路幀發送前,應使用CRC16算法對封裝數據進行校驗,校驗多項式為,校驗值寫入校驗字段中;在鏈路幀接收后,先對其進行校驗,如果檢驗成功再進行數據解封裝處理,如果校驗失敗則按照下述重發機制進行重發。
        3.4 錯誤檢測與重發機制
        綜合考慮協議實現的簡單性和數據收發的可靠性,決定采用停等協議進行數據收發,過程如下:
        發送方發送一幀數據幀后,設置一個最長等待時間,等待接收對方的確認幀或拒絕幀,若收到確認幀則發送下一幀;若收到拒絕幀或者在超時時間內未收到確認幀或拒絕幀,則重發當前幀,因等待超時而重發的幀要設置超時指示位。當連續收到拒絕幀三次或連續超時重發三次,則認為對端不可達,取消當前幀的發送,上報錯誤給應用層。
        接收方收到數據幀后,當超時指示位為0時,如果校驗正確,則發送確認幀,并處理此幀,如果校驗錯誤,則發送拒絕幀,不處理該幀;當超時指示位為1時,說明對方未正確收到確認幀或拒絕幀,如果上次非重發幀的校驗結果是正確的,則該幀實際上已經處理過,直接發送確認幀即可;如果上次非重發幀的校驗結果是錯誤的,則根據校驗結果正常處理該幀。

        本文引用地址:http://www.104case.com/article/151026.htm

        4 鏈路層實現
        鏈路層采用C++語言實現,以便于代碼在各模塊程序中復用。應用層數據發送和接收流程如圖2,圖3所示。

        c.JPG

        5 結語
        鏈路層的作用是可靠地把應用層數據發送到對端設備,但如果僅僅是這樣,應用程序使用起來并不是很方便,如果使用面向對象編程的方法,把鏈路層代碼封裝在一個類中,向應用程序提供一些較為簡單的功能接口,如發送數據,接收數據,檢測對端是否可達等,就可以很好地解決易用性問題。另外當數據發送失敗時,應當以返回值或事件方式通知應用程序,當有應用層數據需要處理時,最好以回調函數或事件方式激活應用層處理程序,以避免應用程序低效的循環檢測。通過在協議設計和協議實現兩個方面同時進行優化,該協議在實際應用過程中表現出極好的可靠性和一定的通用性,可供參考借鑒。

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

        上一頁 1 2 下一頁

        關鍵詞: 嵌入式 通信

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 平塘县| 托里县| 双辽市| 沙洋县| 钟祥市| 新晃| 鹿邑县| 巢湖市| 和田县| 无锡市| 安顺市| 海淀区| 惠来县| 上林县| 叙永县| 曲靖市| 名山县| 拉萨市| 蕉岭县| 肇庆市| 合川市| 惠东县| 徐闻县| 龙泉市| 晋中市| 库伦旗| 银川市| 田东县| 海兴县| 永嘉县| 西和县| 周至县| 句容市| 镇坪县| 宁国市| 桂东县| 科技| 曲沃县| 唐河县| 兴安县| 东乡族自治县|