溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么理解C語言與物聯(lián)網(wǎng)的簡單通信協(xié)議

發(fā)布時間:2021-11-02 16:42:54 來源:億速云 閱讀:154 作者:iii 欄目:web開發(fā)

本篇內(nèi)容介紹了“怎么理解C語言與物聯(lián)網(wǎng)的簡單通信協(xié)議”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

用C語言做物聯(lián)網(wǎng)網(wǎng)關(guān)開發(fā)時,經(jīng)常需要通過串口、485接口等從一些傳感器讀取數(shù)據(jù),由于網(wǎng)關(guān)設(shè)備和傳感器所處的環(huán)境復(fù)雜多樣,電磁干擾等常常會破壞傳輸?shù)臄?shù)據(jù),為了確保傳輸數(shù)據(jù)的可靠性,通常會采取一些策略,常用的策略:數(shù)據(jù)校驗+超時重傳,具體過程如下:

發(fā)送方在發(fā)送數(shù)據(jù)時,在元數(shù)據(jù)的基礎(chǔ)上增加校驗數(shù)據(jù)形成請求數(shù)據(jù)包(data pack),然后將請求數(shù)據(jù)包發(fā)送出去,并啟動守衛(wèi)計時器(Guard  Timer)。

接收方在收到請求數(shù)據(jù)包后,以跟發(fā)送方相同的算法對元數(shù)據(jù)進行計算得到校驗數(shù)據(jù),然后跟收到的校驗數(shù)據(jù)進行比較,若相同,則說明數(shù)據(jù)可靠,可以使用;反之,說明數(shù)據(jù)被破壞,直接丟棄掉。若數(shù)據(jù)可靠,接收方以同樣的格式做成響應(yīng)數(shù)據(jù)包回復(fù)給發(fā)送方;若發(fā)現(xiàn)數(shù)據(jù)被破壞,接收方不回復(fù)任何數(shù)據(jù)。

如果發(fā)送方在守衛(wèi)計時器超時前正確地接收到了接收方回復(fù)的響應(yīng)數(shù)據(jù)包,則停止守衛(wèi)計時器,并進行后續(xù)的處理;若發(fā)送方在守衛(wèi)計時器超時時仍未收到接收方回復(fù)的響應(yīng)數(shù)據(jù)包,則重新發(fā)送"1."中的數(shù)據(jù)包,如此反復(fù),直到正確發(fā)送或達到了重傳次數(shù)。

步驟1~3重點為了講述如何確保數(shù)據(jù)可靠傳輸,真實情景中為了能正確地斷包(識別數(shù)據(jù)包),通常會按照如下結(jié)構(gòu)來定義數(shù)據(jù)包:

怎么理解C語言與物聯(lián)網(wǎng)的簡單通信協(xié)議
  • 包起始標(biāo)識:通常使用固定數(shù)據(jù),比如0xFA, 0xAA, 0xA5等;

  • 元數(shù)據(jù)長度:根據(jù)元數(shù)據(jù)長度進行斷包。比如:元數(shù)據(jù)長度占1字節(jié),校驗數(shù)據(jù)占2字節(jié),當(dāng)元數(shù)據(jù)長度取值為10時,則數(shù)據(jù)包大小為14字節(jié);

  • 元數(shù)據(jù):發(fā)送的或接收的,有一定格式或意義的應(yīng)用數(shù)據(jù);

校驗數(shù)據(jù):按照某種校驗算法(比如checksum,crc等)計算得到的值。

#define MAX_DATA_LEN  100     /* 假設(shè)元數(shù)據(jù)的最大長度為100字節(jié) */ typedef struct tag_data_pack {     uint8_t sop;                     /* 包起始標(biāo)識,(Start Of Pack) */     uint8_t len;                     /* 元數(shù)據(jù)長度,假設(shè)為1字節(jié) */     uint8_t datas[MAX_DATA_LEN + 2]; /* 元數(shù)據(jù) + 2字節(jié)的校驗數(shù)據(jù) */ }data_pack_t;

總線式的通信中,通常還會在數(shù)據(jù)包中加入目標(biāo)設(shè)備的地址,以便于確定數(shù)據(jù)是發(fā)往總線上的哪個設(shè)備,數(shù)據(jù)包的參考結(jié)構(gòu)如下:

怎么理解C語言與物聯(lián)網(wǎng)的簡單通信協(xié)議

用C語言描述如下:

#define MAX_DATA_LEN  100     /* 假設(shè)元數(shù)據(jù)的最大長度為100字節(jié) */ typedef struct tag_data_pack {     uint8_t sop;                     /* 包起始標(biāo)識,(Start Of Pack) */     uint8_t addr;                    /* 目標(biāo)設(shè)備地址,假設(shè)為1字節(jié) */     uint8_t len;                     /* 元數(shù)據(jù)長度,假設(shè)為1字節(jié) */     uint8_t datas[MAX_DATA_LEN + 2]; /* 元數(shù)據(jù) + 2字節(jié)的校驗數(shù)據(jù) */ }data_pack_t;

“怎么理解C語言與物聯(lián)網(wǎng)的簡單通信協(xié)議”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI