上節咱們說到,我們已經可以實現兩個單片機之前通訊了,這次我們就需要來研究一下,他們之間到底說了些什么,以及他們之間是怎么說的?以下所有內容和說明的類比對象,都以串口(Usart 為例子,以串口機制來講解傳輸的原理,然后推廣到其他方面的傳輸接口)。
首先,還記得我們之前說的兩個單片機之間通訊是通過單片機 A 的 Tx 和單片機 B 的 Rx 連接在一起的,然后進行的數據傳輸。那么,我們就想一下,這兩個單片機,一個是小明,一個是小紅。他們如何通過一個手電筒來進行信息傳遞的。
-
首先,我想問問大家,還記得我們單片機的引腳可以干嘛的嗎?對了,就是可以控制外部輸出,你想想一下,比如小明的 Tx 引腳輸出高電平,那么如果小紅的 Rx 引腳此時處于接受狀態的話是不是就可以收到一個高電平?當然是可以的。那么小明就做到了給小紅傳輸一個高低的信號(也就是所說的 0 或則 1)。如果小紅和小明之間規定 0 代表關門, 1代表開門。那么小紅在收到小明的指令后,就會按照事先的規定按步執行了。
-
有沒有感覺一根線上只是傳輸了一個 0 或則 1 有點浪費?這確實浪費了,那么好了,想象一下,一個字節是多少位的?1byte = 8bit。一個字節是 8 位。有沒有什么辦法,直接將一個字節在這根線上傳輸呢?也就是說,小明這邊傳輸一個 8 bit 數據,而小紅那邊接受一個 8 bit 數據呢?(有人會想:每次傳輸 1 位,傳輸 8 次,這樣全部信息不就傳輸過去了???)大方向是這樣的,但是有所欠缺,下面我就詳細的給大家講解一下,為什么有缺陷。
- 比如,小明在傳輸完成 8 bit 數據之后小紅按照指令去把風扇打開了,可是小明突然感覺到冷想讓小紅再把風扇關掉。可惜小紅正在認真聽講沒有注意小明又給她傳輸信息。結果他們就錯過了彼此。小明也隨即凍死在了教室里。針對這個矛盾點,我們可以讓小明在要傳輸的時候先叫一聲,“小紅,我要開始裝逼了,你快看過來。”這也就是我們常說的:起始標志(或則起始碼,起始位。。。)。它在此的作用也就預示著一段信息傳輸即將開始。有開始當然也需要結束啦,有始有終才是一個合格的男孩子嘛。就這樣,小明在傳輸完成之后也會在末尾增加一個停止位。這樣小紅就知道什么時候需要看著小明那邊來等待小明傳輸的信息。
- 其實 8bit 數據包里面還有部分需要注意的地方,比如兩個相鄰的低電平是如何區分的,比如小明連續傳送了兩次低電平,小紅如何區分?這其實得益于小紅和小明各自的手表(也就是串口規定的通訊波特率)。比如小明每個發送的狀態都持續 1s 。小紅每次觀察小明發過來的信息只持續 1s。超過 1s 就算到了下一個 bit 上。
- 以上幾點說明簡化如下:開始位 + 數據位 + 停止位 == 1字節傳輸結構。
現在我們實現了小明給小紅傳輸 8bit 的數據。這也就是單片機之間交流的最小單元(1字節)。那么有人會問,8bit 的數據最多可以包含 256 種情況,如果我們傳輸的可能狀態是 10000 種,那該怎么辦呢?(那我們傳輸兩次就好啦,一次一個字節,兩次就是兩個字節,這樣直接就傳輸了一個 16bit 的信息,那么最多包含 65536 種狀態了)。為什么不是 16bit 添加開頭和結尾這種模式傳輸呢?因為我們 51 單片機是一個 8 位機,每次只能處理 8 bit 的數據。所以得分兩次發送,通過程序邏輯來處理兩次的數據。
你可以任意規定兩個單片機傳輸一個字節代表什么含義,比如傳輸:一個字節為:0x12代表開風扇,0x22代表關風扇。。。等等等等!!!而外國棒子就將1個字節編碼成了對應的字符信息形成了 ascii 碼的“密碼表”。比如 0x30 代表字符“0”,0x31代表字符“1”。這里不了解也沒關系,我們后面還會繼續詳細說明,在此只是點一下。這就好像 apple = 蘋果。它們只是中國人和外國佬對于蘋果這個東西的一種稱呼。ascii 碼0x30 是計算機對于看到的符號 “0” 的叫法,而 零 是我們的叫法。