在小伙伴學習嵌入式的時候,往往都會對各類協議的理解和想象搞得很是頭疼,因為這類實物我們實在難以看到,往往也是通過各類儀器看到一些曲曲折折的線段組成,但依舊不能形成很完善的印象,在這里呢,我就簡單的打個比喻,方便大家去理解協議這一個概念,其實物理器件與器件之間進行交流(數據傳輸)就相當于我們和周圍朋友進行聊天一樣,大家如果都說著各自的方言,那么顯然一定會造成溝通上的障礙,要么會錯意思,要么曲解意思,因此,如果大家能夠統一語言,是不是就可以完成兩個人之間的無障礙溝通了,你說的我懂,我講的你明白,這樣就皆大歡喜,放在物理器件中,也是一樣的道理。
協議,可以通俗理解為器件與器件之間的方言(通訊規則),當然,器件又不能完全和人類進行溝通一樣,所以,需要先規定,器件A給器件B發送一個數據,那么第一個數據代表幾個意思,然后每個意思怎么樣去識別,第二個、第三個......如此下去,只要A器件按照這個規則發送數據,那么B數據只需要識別第一個數據的意思,那么這樣就實現了數據的接受與發送。我們以串行通信為例
現在的A器件要給B器件發送數據,兩個設備通過一條數據線連接(規則),然后A設備每次只能發送一個比特位的數據,然后發送多次連續的比特位數據(規則),這里要注意,因為硬件里有時鐘,所以每一個比特位的數據需要的時間是固定的。(規則),
那么到這里了,就需要考慮一個問題,這么多比特位如何組合呢,所以,還規定發送數據的順序以及如何組合的格式。
以上這個圖叫做——時序圖
意思就是器件之間既然要統一方言(協議規則),那么方言怎么說呢?就需要規定,A器件先發送什么,后發送什么,再發送什么,這樣B器件也就按照先接受什么,再接受什么,最后接收什么的樣式進行數據發送
起始位:指示數據傳輸開始的信號位,通常為邏輯低電平。
數據位:每個數據傳輸單元中實際的數據位數,通常為8位。
奇偶校驗位:可選的位,用于驗證數據的正確性。
停止位:指示數據傳輸結束的信號位,通常為邏輯高電平。
空閑位:通常用來表示數據傳輸未進行或通信線路空閑的狀態。
假設現在A設備要給B設備發送一個數據hello
那么A設備需要做的事情就是
1.發送一個0 表示起始信號
2.發送八個bit位數據 01101000(ASCII h的二進制)
3.發送一個奇偶校驗位0/1(可選),用于接受設備判斷數據是否準確
4.發送一個停止位,用來準備發送下一個ASCII數據
5.發送八個bit位數據01100101(ASCII e的二進制)
6.發送一個奇偶校驗位 0/1(可選),用于接受設備判斷數據是否準確
。。。。。。
直到數據發送完成
B設備要做的事情就是
1.接受一個0,接受起始信號
2.接受八個bit位數據 01101000(ASCII h的二進制)
3.接受一個奇偶校驗位,重新組裝數據,與之前的數據進行對比,查看是否正確
4.接受一個停止位,用來準備接受下一個ASCII數據
。。。。。。
以上就是Uart協議進行串行通信的演示,當然,只要熟悉了通信的數據發送順序以及意思,那么相信大家學習任何協議 應該也會手到擒來。