日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

串口协议的制定以及串口中怎样接收一个完整数据包的解析

發布時間:2024/4/18 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 串口协议的制定以及串口中怎样接收一个完整数据包的解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
里以串口作為傳輸媒介,介紹下怎樣來發送接收一個完整的數據包。過程涉及到封包與解包。設計一個良好的包傳輸機制很有利于數據傳輸的穩定性以及正確性。串口只是一種傳輸媒介,這種包機制同時也可以用于SPI,I2C的總線下的數據傳輸。在單片機通信系統(多機通信以及PC與單片機通信)中,是很常見的問題。

一、根據幀頭幀尾或者幀長檢測一個數據幀

1、幀頭+數據+校驗+幀尾

這是一個典型的方案,但是對幀頭與幀尾在設計的時候都要注意,也就是說幀頭、幀尾不能在所傳輸的數據域中出現,一旦出現可能就被誤判。如果用中斷來接收的話,程序基本可以這么實現:

unsigned char recstatu;//表示是否處于一個正在接收數據包的狀態

unsigned char?ccnt;????? //計數

unsigned char packerflag;//是否接收到一個完整的數據包標志

unsigned char?rxbuf[100];//接收數據的緩沖區

void UartHandler()

{

?????? unsigned char tmpch;

?????? tmpch = UARTRBR;

?????? if(tmpch 是包頭)????????????????????????? //檢測是否是包頭

?????? {??

??????????? recstatu = 1;

??????????? ccnt?? = 0 ;

??????????? packerflag = 0;

??????????? return ;

?????? }

?????? if(tmpch是包尾)????????????????????????? //檢測是否是包尾

?????? {

??????????? recstatu = 0;

??????????? packerflag = 1;????????????????????? //用于告知系統已經接收到一個完整的數據包

??????????? return ;

?????? }

????? if(recstatu ==1)?????????????????????????? //是否處于接收數據包狀態

????? {

????????????rxbuf[ccnt++] = tmpch;?

????? }

}

上面也就是接收一個數據包,但是再次提醒,包頭和包尾不能在數據域中出現,一旦出現將會出現誤判。另外一個。數據的校驗算法是很必要的,在數據傳輸中,由于受到干擾,很難免有時出現數據錯誤,加上校驗碼可在發現數據傳輸錯誤時,可以要求數據的另一方重新發送,或是進行簡單的丟棄處理。校驗算法不一定要很復雜,普通的加和,異或,以及循環冗余都是可以的。我上面的接收程序在接收數據時,已經將包頭和包尾去掉,這些可以根據自己的需求加上,關鍵是要理解原理。

上述包協議出現了以下的幾種變種:

1.1 幀頭+數據長度+數據+校驗值

1.2包長+校驗值

上面兩種其實都是知道了數據包的長度,然后根據接收字節的長度來判斷一個完整的數據包。例如,定義一個數據包的長度為256字節,那我們就可以一直接收,直到接收到256個字節,就認為是一個數據包。但是,會不會存在問題呢?比如說從機向主機發送數據,發送了一半,掉電,重啟,開機后繼續發送,這很明顯接收到的數據就不對了,所以此時很有必要定義一個超限時間,比如我們可以維護下面這樣的一個結構體。

struct? uartrd{

char? rd[ 256];

unsigned int timeout;

}

成員變量rd用來存放接收到的數據字節;成員變量timeout用來維護超時值,這里主要討論這個。這個數值怎么維護呢,可以用一個定時器來維護,以可以放在普通的滴答中斷里面來維護,也可以根據系統運行一條指令的周期,在自己的循環中來維護,給其設置個初值,比如說100,當有第一個數據到來以后,timeout在指定的時間就會減少1,減少到0時,就認為超時,不論是否接收到足夠的數據,都應該拋棄。

?

二、根據接收超時來判斷一個數據包

2.1? 數據+校驗

核心思想是如果在達到一定的時間沒有接受到數據,就認為數據包接收完成。modbus協議里就有通過時間間隔來判斷幀結束的。具體實現是要使用一個定時器,在接收到第一個數據時候,開啟定時器,在接收到一個數據時候,就將定時器清零,讓定時器重新開始計時,如果設定的超時時間到(超時時間長度可以設置為5個正常接收的周期),則認為在這一段時間內沒有接受到新的數據,就認為接收到一個完整的數據包了。流程大體如下圖所示:

?

進行一個簡單的小的總結,上述幾種方法都還是較為常用的,在具體的實現上,可以根據具體的實際情況,設計出具體的通訊協議。數據校驗位,有時候感覺不出來其重要性,但是一定要加上,對數據進行一個相關的驗證還是必要的。現在很在MCU都帶有FIFO,DMA等功能,所以有時候利用上這些特性,可以設計出更好的通訊方式。有的人問在接受串口數據時候是應該中斷一次接收一個,還是進入中斷后接收一段數據呢,我認為應該中斷接收一個,因為CPU是很快的,至少對于串口是這樣,在接受每個數據的間隔期間,處理器還是可以做些其他工作的。這是在裸機下的模型。在多線程中,那就可以直接建立一個數據接收線程

總結

以上是生活随笔為你收集整理的串口协议的制定以及串口中怎样接收一个完整数据包的解析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。