本發明涉及通信和控制領域中有關協議制定的編解碼方法,具體為一種適用于多機可靠通信的通信協議編解碼方法。
背景技術:
通信協議是需要通信設備間達成一種約定,它對包含數據格式、傳送速度、同步方式、校驗方式以及功能字符定義等問題作出統一規定,在設備間通信中必須共同遵守。在實際通信應用中,如果缺少一個合理、嚴格、規范的通信協議,將無法保證數據傳輸的正確性和通信的可靠性。一般傳送的數據內容被定義為字節的形式組織在協議幀中,并在幀中從前到后依次排列。傳統的幀編碼格式簡單,一般包括:起止標記位、數據長度、功能碼、數據、校驗和結束標志位,多適應于上位機和下位機之間通信,不能滿足多設備之間的通信需要。此外,傳統幀解碼時中只通過功能碼識別該幀功能,沒有對幀內容進行分類,導致代碼可讀性差不利于代碼維護和升級。
技術實現要素:
針對傳統幀編解碼方法的不足,本發明擬解決的問題是,提供一種適用于多機間可靠通信的具備幀內容分類的低誤碼率通信協議編解碼方法。該方法幀頭部分包含源地址、目標地址和幀類型,適用于多機通信,同時幀解析時可通過幀類型對幀數據進行分類解析,代碼可讀性強便于維護和升級。此外,該方法采用循環冗余校準方式,保證數據傳輸誤碼率低通信過程可靠。
本發明解決所述技術問題所采用的技術方案是,
一種適用于多機可靠通信的通信協議,所述的通訊協議的幀格式包括按照從前至后的順序依次排列的幀開始字段、幀頭字段、負載字段、校驗字段和結束字段;其中,所述的幀頭字段包含按照從前至后的順序依次排列的幀類型字段、源地址字段、目標地址字段、負載長度字段和功能碼字段;所述的負載字段按照負載內容表示成多個連續數據類型字段,形成負載結構模型。
幀開始字段和結束字段為兩到三個字節的固定值;所述的校驗字段為兩個字節的循環冗余校驗值,參與校驗的數據從幀類型字段到負載字段。
所述的負載長度字段為一個字節長度的數據,定義為負載長度值,該值為負載結構模型的長度;功能碼字段為兩個字節長度的幀識別碼用以標識不同的傳輸路徑、方向和幀類型。
數據類型為char型、short型、fool型、int型或自定義結構體類型。
幀類型字段為一個字節長度,用以標識數據幀類型、命令幀類型或應答幀類型。
所述的適用于多機可靠通信的通信協議的編解碼方法,其特征在于,包括以下步驟,組幀編碼過程和幀解析過程,
所述的組幀編碼過程包括,
負載裝載步驟,將發送的負載數據按照負載結構模型依次賦值,負載長度為連續類型字段的總長度即負載結構模型的長度;
幀頭打包步驟,數據發送設備創建字節數組緩沖區用于存儲發送數據幀,依次為幀頭字段的每個字段內容賦值并裝載到發送數據緩存區中,完成幀頭打包;
完整傳輸幀打包步驟,結合幀類型字段到負載字段,計算得到循環冗余校驗值,將負載內容、校驗碼和結束字段裝載到發送數據緩存區中,完成完整傳輸幀打包;最后裝載發送數據緩沖區,完成組幀編碼過程;
幀解析過程包括,
前導碼過濾步驟:創建接收數據字節數組緩沖區,對接收數據進行前導碼過濾,檢測數據包有效性,
過濾步驟:提取幀頭數據,依次對目標地址過濾,對幀類型過濾,提取功能碼,
解析步驟:進行幀功能碼適配,進入功能碼匹配的負載數據解析函數,結合該函數中的負載結構模型,完成負載數據解析。
在所述的負載裝載步驟還包括負載結構模型定義步驟,其為發送的負載內容定義負載結構模型,該負載結構模型為負載內容表示成的多個連續數據類型字段。
一種采用所述的的通信協議的通訊設備,包括數據總線和多個通過所述的數據總線通訊連接的設備,所述的設備分別包括組幀編碼模塊和幀解析模塊,
所述的組幀編碼模塊包括,
負載裝載子模塊,用以將發送的負載數據按照負載結構模型依次賦值,負載長度為連續類型字段的總長度即負載結構模型的長度;
幀頭打包子模塊,用以數據發送設備創建字節數組緩沖區用于存儲發送數據幀,依次為幀頭字段的每個字段內容賦值并裝載到發送數據緩存區中,完成幀頭打包;
完整傳輸幀打包子模塊,用以結合幀類型字段到負載字段,計算得到循環冗余校驗值,將負載內容、校驗碼和結束字段裝載到發送數據緩存區中,完成完整傳輸幀打包;最后裝載發送數據緩沖區,完成組幀編碼過程;
幀解析模塊包括,
前導碼過濾子模塊,用以創建接收數據字節數組緩沖區,對接收數據進行前導碼過濾,檢測數據包有效性,
過濾子模塊,用以提取幀頭數據,依次對目標地址過濾,對幀類型過濾,提取功能碼,
解析子模塊,用以進行幀功能碼適配,進入功能碼匹配的負載數據解析函數,結合該函數中的負載結構模型,完成負載數據解析。
在所述的負載裝載子模塊還包括負載結構模型定義模塊,其用以為發送的負載內容定義負載結構模型,該負載結構模型為負載內容表示成的多個連續數據類型字段。
多設備間利用can總線通信或can總線與串口結合通信,can總線間通信時,所有設備通過can口掛在can總線上,幀協議中目標地址和源地址作為總線上的canid,設備間通信時通過canid識別是否為自己設備處理的數據,如果是則進行數據解包處理;
串口與can總線間結合通信時,串口接收到數據后解析出原地址和目標地址,形成canid,即鏈接到can總線上的設備地址,再將該數據發送到can總線上,通過canid識別是否為自己設備處理的數據,如果是則進行數據解包處理。
與現有技術相比,本發明適用于多機可靠通信的通信協議編解碼方法的積極效果在于:
1、幀頭字段包含源地址字段和目標地址字段,適用于多設備間通信。
2、采用負載結構模型有效提高數據組幀和解析效率。
3、幀頭字段包含幀類型字段,幀解析時可通過幀類型對負載數據進行分類解析,有效提高代碼的可讀性和維護性。
4、采用循環冗余校準方式,保證數據傳輸誤碼率低通信質量高。
附圖說明
圖1為本發明適用于多機可靠通信的通信協議編解碼方法所采用的幀格式,其中a部分為幀頭部分,負載長度值為負載結構模型長度大小。
圖2為本發明適用于多機可靠通信的通信協議編解碼方法負載內容與負載結構模型對于關系。
圖3為本發明適用于多機可靠通信的通信協議編解碼方法多機通信示意圖。
圖4為本發明適用于多機可靠通信的通信協議編解碼方法組幀編碼流程圖。
圖5為本發明適用于多機可靠通信的通信協議編解碼方法幀解析流程圖。
具體實施方式
下面參考附圖描述本發明的實施例。
一種適用于多機可靠通信的通信協議,幀格式包含按照從前至后的順序依次排列的幀開始字段、幀頭字段、負載字段、校驗字段和結束字段;其中,幀開始字段和結束字段為兩到三個字節的固定值;幀頭字段包含按照從前至后的順序依次排列的幀類型字段、源地址字段、目標地址字段、負載長度字段和功能碼字段;
其中,負載字段按照負載內容表示成多個連續數據類型字段,形成負載結構模型,負載結構模型一般為用戶自定義的多個不同數據類型組成的結構體,結構體內每個負載類型字段連續排列。負載結構模型確定后,數據發送方和接收方都需要定義負載結構模型,數據發送方為負載結構模型的每個字段內容進行賦值,數據接收方需要完全按照負載結構模型的順序對負載內容進行解析;負載結構模型的存在能有效提高數據組幀和解析效率。
所述的校驗字段為兩個字節的循環冗余校驗值,參與校驗的數據從幀類型字段到負載字段;幀類型字段為一個字節的不同幀類型值,如數據幀、命令幀或應答幀等;幀類型字段不同于幀識別碼和目標地址,它是對數據負載類型的分類,數據解析時幀類型解析位于目的地址解析之后、幀識別碼解析之前。幀類型的存在使不同類型,如命令、數據或應答等的負載進行分類解析,與傳統協議相比有效提高了數據解析的可讀性和代碼的維護迭代性。
源地址字段為一個字節長度的數據,定義為發送方設備地址標識,不同設備地址標識唯一;目標地址字段為一個字節長度的數據,定義為接收方設備地址標識,不同設備地址標識唯一;負載長度字段為一個字節長度的數據,定義為負載長度值,該值為負載結構模型的長度;功能碼字段為兩個字節長度的幀識別碼,同一傳輸路徑、方向和幀類型的功能碼不能相同。
本發明的幀頭字段包含源地址字段和目標地址字段,適用于多設備間通信。采用負載結構模型有效提高數據組幀和解析效率。幀頭字段包含幀類型字段,幀解析時可通過幀類型對負載數據進行分類解析,有效提高代碼的可讀性和維護性。采用循環冗余校準方式,保證數據傳輸誤碼率低通信質量高。
本發明適用于多機可靠通信的通信協議編解碼方法,參見圖1-5,其具體步驟是:
步驟s1,建立通用幀格式:幀格式包含開始字段、幀頭字段、負載字段、校驗字段和結束字段,按照從前至后的順序依次排列,如幀格式如圖1所示)。
本實施例的開始字段和結束字段為兩個字節的固定值,開始字段為0x100x02,結束字段為0x310xaa。
步驟s2,建立幀頭字段:幀頭字段的格式包含幀類型字段、源地址字段、目標地址字段、負載長度字段和功能碼字段,各字段按照從前至后的順序依次排列,如圖1中a部分框所示。
負載字段按照負載內容表示成多個連續數據類型字段形成負載結構模型,其中負載內容數據類型可以是char型、short型、fool型、int型以及自定義結構體類型等,如圖2所示。
校驗字段為兩個字節的循環冗余校驗值,參與校驗的數據從幀類型字段開始到負載字段結束。結合圖1計算本實施例中的校驗值為0x350xdb。
幀類型字段為一個字節長度的不同幀類型值,如數據幀(0x01)、命令幀(0x02)、應答幀(0x03)等;本實施例中幀類型為數據幀。
源地址字段為一個字節長度的數據,定義為數據發送方設備地址標識,如圖3所示,不同設備地址標識唯一,設備0x02為數據發送方。
目標地址字段為一個字節長度的數據,定義為數據接收方設備地址標識,如圖3所示,不同設備地址標識唯一,設備0x03為數據接收方。不同的設備間都可以通過數據總線通信,不同設備通過目的地址字段來識別是否為發給自己的數據。
負載長度字段為一個字節長度的數據,定義為負載長度值,該值的大小取決于負載結構模型長度。
功能碼字段為兩個字節長度的幀識別碼,用于定義該幀功能的唯一標識,對于同一傳輸路徑、方向和幀類型的功能碼不能相同,本實施例中數據從設備0x02發送到設備0x03,幀類型為數據幀,功能碼0x100x22用于表示該幀功能的唯一標識。
步驟s3組幀編碼過程:首先完成負載裝載,然后創建發送數據字節數組緩沖區完成幀頭打包,最后完成完整傳輸幀打包,并裝載發送數據字節數組緩沖區,完成組幀編碼過程;
所述步驟s3具體如圖4所示。
1、為發送的負載內容定義負載結構模型,該模型為負載內容表示成的多個連續數據類型字段。將發送的負載數據按照負載結構模型依次賦值。負載長度為連續類型字段的總長度即負載結構模型的長度,完成負載內容裝載。
2、數據發送設備0x02創建數據發送字節數組緩沖區sendbuf[],結合源地址、發送地址、幀類型、負載長度和功能碼內容打包幀頭,并裝載到發送數據緩沖區中,完成幀頭打包裝載。
3、結合幀頭內容和負載內容計算循環冗余校驗值,并將負載內容、校驗碼和結束字段按幀格式順序裝載到發送數據緩沖區中,完成完整傳輸數據幀打包裝載。
步驟s4,幀解析過程:創建接收數據字節數組緩沖區,對接收數據進行前導碼過濾,檢測數據包有效性,提取幀頭數據,對目標地址過濾,對幀類型過濾,提取功能碼,結合負載結構模型完成負載數據解析。
所述步驟s4具體如圖5所示。
1、數據接收設備0x03創建接收數據字節數組緩沖區receivebuf[],存放設備0x02發來的數據。
2、結合開始字段信息對緩沖區接收到的數據進行前導碼過濾,驗證收到第一個字節內容是否為開始字段,如果是則繼續執行解析過程,否則拋棄該幀從新解析新收到的幀內容。
3、結合幀格式進行循環冗余校驗,參與校驗的數據從幀類型字段到負載字段結束,驗證數據包的有效性,如果計算得到的校驗碼和幀格式中的校驗位一致表示該數據包有效繼續執行解析過程,否則拋棄該幀從新解析新收到的幀內容。
4、去除開始字段、結束字段和校驗位字段形成有效的數據報文,結合幀格式提取幀頭信息。
5、對步驟4)形成的有效數據報文進行目標地址過濾,接收到的目標地址為本地址(0x03),則繼續執行解析過程,否則拋棄該幀從新解析新收到的幀內容。
6、進行幀類型適配,針對不同的幀類型(如數據幀類型、命令幀類型、應答幀類型)進入不同類型數據處理函數。
7、提取功能碼,進行幀功能碼適配,進入功能碼匹配的負載數據解析函數,結合該函數中的負載結構模型,完成負載數據解析。
同時本發明還公開了一種采用所述的的通信協議的通訊設備,包括數據總線和多個通過所述的數據總線通訊連接的設備,所述的設備分別包括組幀編碼模塊和幀解析模塊,
所述的組幀編碼模塊包括,
負載裝載子模塊,用以將發送的負載數據按照負載結構模型依次賦值,負載長度為連續類型字段的總長度即負載結構模型的長度;
幀頭打包子模塊,用以數據發送設備創建字節數組緩沖區用于存儲發送數據幀,依次為幀頭字段的每個字段內容賦值并裝載到發送數據緩存區中,完成幀頭打包;
完整傳輸幀打包子模塊,用以結合幀類型字段到負載字段,計算得到循環冗余校驗值,將負載內容、校驗碼和結束字段裝載到發送數據緩存區中,完成完整傳輸幀打包;最后裝載發送數據緩沖區,完成組幀編碼過程;
幀解析模塊包括,
前導碼過濾子模塊,用以創建接收數據字節數組緩沖區,對接收數據進行前導碼過濾,檢測數據包有效性,
過濾子模塊,用以提取幀頭數據,依次對目標地址過濾,對幀類型過濾,提取功能碼,
解析子模塊,用以進行幀功能碼適配,進入功能碼匹配的負載數據解析函數,結合該函數中的負載結構模型,完成負載數據解析。
其中,在所述的負載裝載子模塊還包括負載結構模型定義模塊,其用以為發送的負載內容定義負載結構模型,該負載結構模型為負載內容表示成的多個連續數據類型字段。
具體來說,多設備間利用can總線通信或can總線與串口結合通信,can總線間通信時,所有設備通過can口掛在can總線上,幀協議中目標地址和源地址作為總線上的canid,設備間通信時通過canid識別是否為自己設備處理的數據,如果是則進行數據解包處理;
串口與can總線間結合通信時,串口接收到數據后解析出原地址和目標地址,形成canid,即鏈接到can總線上的設備地址,再將該數據發送到can總線上,通過canid識別是否為自己設備處理的數據,如果是則進行數據解包處理。
本發明的通訊設備的優勢表現為:1、實現多設備間穩定可靠通信。2、can總線通信時,canid為總線上的設備地址,同時幀協議中包含目標地址,這兩個地址是一一對應的,canid用于總線設備尋址,幀協議中目標地址可用于數據傳輸校驗,提高數據傳輸的可靠性。3、該協議中采用負載結構模型有效提高數據組幀和解析效率。4、該幀幀頭字段包含幀類型字段,幀解析時可通過幀類型對負載數據進行分類解析,有效提高代碼的可讀性和維護性。
以上所述僅是本發明的優選實施方式,應當指出的是,對于本技術領域的普通技術人員來說,在不脫離本發明原理的前提下,還可以做出若干改進和潤飾,這些改進和潤飾也應視為本發明的保護范圍。