串列埠通訊 通訊協議

2021-10-02 03:48:13 字數 1959 閱讀 5934

我們的串列埠程式,除了通用的,進行串列埠監聽收發的簡單工具,大多都和下位機有關,這就需要關心我們的通訊協議如何快取,分析,以及通知介面。

所謂通訊協議是指通訊雙方的一種約定。約定包括對資料格式、同步方式、傳送速度、傳送步驟、檢糾錯方式以及控制字元定義等問題做出統一規定,通訊雙方必須共同遵守。因此,也叫做通訊控制規程,或稱傳輸控制規程,它屬於osi七層參考模型中的資料鏈路層。目前,採用的通訊協議有兩類:非同步協議和同步協議。

非同步協議為起止式非同步協議。非同步通訊是按字元傳輸的,每傳輸乙個字元,就用起始位來通知收方,以此來重新核對收發雙方同步。若接收裝置和傳送裝置兩者的時鐘頻率略有偏差,這也不會因偏差的累積而導致錯位,加之字元之間的空閒位也為這種偏差提供一種緩衝,所以非同步序列通訊的可靠性高。但由於要在每個字元的前後加上起始位和停止位這樣一些附加位,使得傳輸效率變低了,只有約80%。因此,起止協議一般用在資料速率較慢的場合(小於19.2kbit/s)。同步協議分為面向字元和面向位元以及面向位元組計數三種。在高速傳送時,一般要採用同步協議。

總的來說,通訊協議就是通訊雙方共同遵循的一套規則,定義協議的原則是盡可能的簡單以提高傳輸率,盡可能的具有安全性保證資料傳輸完整正確。基於這2點規則,我們乙個通訊協議應該是這樣的:頭+資料長度+資料正文+校驗

例如:aa 44 05 01 02 03 04 05 ea

這裡我假設的一條資料,協議如下:

資料頭:     aa 44

資料長度: 05

資料正文: 01 02 03 04 05

校驗:       ea

一般資料的校驗,都會採用常用的方式,crc16,crc32,xor。

有的資料安全要求高的,不允許丟包的,可能還要加入重發機制或是加入資料恢復演算法,在校驗後根據前面資料新增恢復位元組流以恢復資料。我這裡採用的是簡單的異或校驗,包含資料頭的所有位元組,依次異或得到的。

協議很簡單,我也認為分析協議是很簡單的事情,下面我們就如何分析協議來實際的結合c#看一下。

er…再等等,在我們實際開始編碼之前,還有乙個規則需要了解,我們有了通訊協議,如何結合串列埠的協議來分析,需要關心什麼呢?一般就是3個問題:

1、如何快取收到的所有資料

2、如何找到一條完整資料

3、如何分析資料

如果分的更詳細一點,比如針對快取收到的所有資料這個問題,我們想到最高效的辦法就是順序表,也就是陣列,但陣列的操作比較複雜,當你使用完一條資料後,用過的需要移除;新資料如果過多的時候,快取過大需要清理;資料搬移等等,很有可能乙個不小心就會丟資料導致軟體出些莫名其妙的小問題。個人建議,使用list,內部是陣列方式實現,每次資料不足夠的時候會擴容1倍,資料的增刪改都已經做的很完善了。不會出現什麼小問題。

如何找到完整資料呢?就我們例子的這個協議,首先在快取的資料中找aa 44,當我們找到後,探測後面的位元組,發現是05,然後看快取剩下的資料長度是否足夠,不足夠就不用判斷,減少時間消耗,如果剩餘資料》=6個(包含1個位元組的校驗),我們就算乙個校驗,看和最後的校驗是否一致。

分析資料:鑑於網路的開放性,我無法確定讀者對c#的了解程度,介紹一下,常用的方式就是bitconvert.toint32這一系列的方法,把連續的位元組(和變數長度一樣)讀取並轉換為對應的變數。c++下使用memcpy,或直接型別轉換後進行值拷貝,vb6下使用copymemory這個api。

校驗:前面說過了。完整性判斷的時候需要和校驗對比,大多系統都不太嚴格,不支援重發,所以資料錯誤就直接丟棄。導致資料錯誤的原因很多,比如電磁干擾導致資料不完整或錯誤、硬體驅動效率不夠導致資料丟失、我們的軟體快取出錯等。這些軟體因素資料系統錯誤,需要修改,但是電磁干擾麼,有這個可能的。雖然很少。

我們在回顧一下,一般二進位制格式資料就是這樣分析,分析資料長度是否足夠,找到資料頭,資料長度,校驗,然後分析。

分析方式很多。結合各自實際情況操作,可以使用序列化方式,但是wince不支援,也可以用bitconvert方式將連續的位元組讀取為某個型別的變數。

參考:

串列埠通訊協議

簡介 通訊協議分層理解 物理層和協議層 物理層規定通訊系統中具有機械 電子功能部分的特性,確保原始資料在物理 的傳輸。協議層規定通訊邏輯,統一收發雙方的資料打包 解包標準。物理層串列埠通訊結構圖 電平標準 ttl電平標準 理想狀態下使用5v表示二進位制邏輯1,使用0v表示二進位制邏輯0 rs232電...

串列埠通訊協議簡介

串列埠通訊 serial communication 是一種裝置間非常常用的序列通訊方式,因為它簡單便捷,大部分電子裝置都支援該通訊方式,電子工程師在除錯裝置時也經常使用該通訊方式輸出除錯資訊。電平標準根據通訊使用的電平標準不同,串列埠通訊可分為ttl標準及rs 232標準,見如下 通訊標準 電平標...

FPGA 串列埠通訊協議

fpga 串列埠通訊協議 波特率 波特率就是串列埠的通訊速率,常見的波特率有12000bps 4800bps 9600bps 115200bps 256000bps 500000bps,這裡波特率的意思是每秒可以傳輸bit的個數,這裡的5207 500000000 9600 傳遞乙個位元組需要的時間...