在講串口通訊之前,我們先來講一講通訊的概念吧,因為我想讓大家知道通訊的本質是什麼,隻有在你知道了通訊的本質之後,你才能在學習通訊的大路上順風順水。
所以呢,你們要認真看完我為你們精心編制的小故事,看完之後,你會對現在的通訊有一個更加深刻的理解。
烽火台在遙遠的古代,沒有手機、電腦這樣的通訊工具,更沒有汽車、飛機之類的交通工具,那麼如果有敵人來攻城的話,如何快速傳遞把信息傳遞給千裡之外的兵營呢?
答案想必大家都知道,那就是烽火台!
而且是每隔數裡建設一個烽火台,等有敵人來犯就點燃煙草,烽煙會在短時間内傳到千裡之外的兵營。
我們暫且稱它為烽煙通訊,它的通訊原理很簡單,有烽煙的情況就代表着有敵人來犯,如果沒有烽煙就代表一切正常,它隻會出現兩種情況。
但是有烽煙并不一定是出現了戰争,比如說西周時期的周幽王為了博美人褒姒一笑,在沒有發生戰争的情況下,點燃了烽火台,各方諸侯諸侯紛紛趕來救駕,來了之後周幽王和褒姒在台上哈哈大笑,面對奇恥大辱,犬戎一怒之下殺死了周幽王。
因為烽煙意味着敵人來犯早已在人們心中達成共識,所以即使是假的,各方諸侯也會默認為真。通訊隻能事先代表約定俗成的東西、而不能反映事實上發生的事情。
烽火台這種通訊方式看似簡單,但卻是我們現在所有高級通訊的基礎,誇張一點的講,無論多麼複雜的通訊,像紅外遙控、wifi、3G、5G這些都可以說成是烽煙通訊的衍生品,無論現代多麼複雜的通訊方式,它的原理都是基于這種烽煙通訊演化而來的,即在某一時刻不是在傳遞高電平,就是低電平。
隻不過這些現代化通訊傳輸的速率極快,在一秒當中變換高低電平幾千萬次,甚至上億次,它可以使我們在及短的時間内接收/傳輸大量的信息。如果把時間放慢、放慢再放慢,你會發現這些現代化的通訊執行的就是不停的把烽火台點燃熄滅的過程。
串口通訊串口通訊是電子研發人員常用的一種通訊,也是最簡單的一種通訊之一。這種通訊目前最常見的一種形式是:芯片與電腦之間通訊,它的傳輸速率極慢,通常傳輸速率1-10KB/S,這個速率相比于我們現在的USB傳輸速度相差了幾千甚至上萬倍,但為什麼這種通訊至今還沒有被淘汰呢?
老式串口接口,現在已經淘汰
要知道電子開發人員所使用的芯片不是做存儲用的,它可能傳輸的就是溫度、距離、壓力這些,即使是1K/S,我們也能在1S之内接受1024個數據,對于人類而言,這個速度顯然是足夠快的,1024次/S的速度就把我們開的眼花缭亂了,面對如此‘多’的數據,你會自顧不暇,所以這種低端芯片與電腦通訊往往采用串口通訊。
接下來說一下串口到底是如何在芯片和電腦之間傳輸的。
串口通訊本來及其簡單的一種通訊,可是現在與之有關的教科書裡官腔太多,而且還摻雜着很多專業術語,比如各種寄存器、鎖存器這些,除此之外還講述了串口的很多情況,同步或者異步都有,很多情況是用不到的,學生們往往是懷着期望的心去學習,但是最終卻失望而歸,隻要有一個寄存器的原理不懂,就會影響到你學習的心情。
串口接線
很多人雖然會使用串口通訊了,但是具體是怎麼發出去的,可能知道的人就不多了,反正是配置好寄存器就可以使用串口通訊了,這種學習方法是最快的,但是對這個串口的基本工作原理理解的還是不到位。
接下來我們來更深一步的去了解串口,在了解串口之前我們首先要直到串口發送的是什麼?
串口其實發送的是高低電平,比如我們把要發送信息的高低電平發送給電腦,它就直到我們發送的信息,并且顯示出來、那麼問題又來了,電腦是如何直到這些高低電平代表的什麼呢?
這些呀,早就有人想過了,就像我們之前講過的烽煙通訊,烽煙代表敵人來犯。這個串口傳輸的高低電平也早就我們聰明的人類定義好了,不過這次不是中國人了,而是美國人定義的,然後全世界都這麼使用了。
ASCII碼
ASCII表如下圖所示,每一個圖形都對應的8位的二進制,比如A對應的是0100 0001,如果我們要給電腦發送A的話,是不是發送0100 0001對應的高低電平就可以了(1對應高電平)?
當然不是了,因為要成功的發送數據,在它發送數據之前,首先要給電腦發送一個開始信号,不然電腦接收就亂了,就像我們去取快遞,都是在收到短信之後再過去,不然去了可能快遞還沒有到呢。
串口發送數據也一樣,首先要發送一個開始的信号,這個信号也叫做起始位。在串口不工作的時候默認的都是高電平,如果要給電腦開始的信号,隻需要給一個低電平,電腦就會被喚醒接收我們發送的串口數據,然後我們再逐次發送ASCII數據,是一個一個的發送,而不是同一時刻一起發送。串口嘛,就跟串羊肉串一樣,都是一個個的往竹簽上串。
這也是串口的優勢,發送隻需要一根線,如果是并口的話,發送8位數據,就得需要8根線,就物理接線而言,顯然串口更有優勢。
在8位數據發送完成之後,最後還需要發送一位停止位,即最後一位把電平拉高,告訴電腦發送結束,讓電腦準備下一次接收。這東西和我們取快遞一樣,拿完貴重快遞,不能直接走吧,最後還需要簽字不是。
所以要發送A的話,需要發送:
10100 00010
1(停止位) 0100 0001(中間8個為字符A) 0(起始位)
無論是串口發送還是取快遞都是人類想出來的流程,所以存在共性。
波特率還有最後一個問題沒有解決,那就是這每一位的發送間隔是多少呢?
我們還拿烽煙通訊為例,站崗小兵也不是時時刻刻在盯着烽火台,可能是一小時看一次,然後他也許會做一些娛樂項目。
現在,我們發送串口數據也一樣,我們要提前約定好,多長時間發送一次,然後電腦上也要按照這個時間去接收,不然肯定會接收到錯誤的數據。
我們約定的這個時間就是電子專業中常說的波特率,它所指的是在一秒之内發送了多少位數據。
就拿最常用的波特率9600來說,它所代表的是在1秒之内傳輸9600位數據(0或1)。
知道波特率之後,我們也就知道了傳輸一位所需要的時間,即1/9600=104us。
104us對我們來說可能會很短暫,對芯片來卻是極其漫長的時間。
這時候還是會有人擔心,萬一接收的時序對不上怎麼辦。
這個不用擔心,因為芯片接收時也不是104us接收一次,它的接收精度是這個時間的16倍,即以6.5us的最小步長開始計數,它會在你每一位(104us)的中間時刻接收數據,這樣誤差就會變的很小。
模拟串口吧所以,串口通訊不需要配置寄存器,直接用單片機的I/O口輸出高低電平也可以實現,因為它和你在單片機上配置寄存器是一樣的,如果最開始你是使用的寄存器來學習串口,可能是隻會串口的收發,而不直到串口的最基本發送原理。
如果你有興趣的話,直接在單片機上用I/O模拟串口發送試一試,雖然最終我們都會使用配置寄存器的方式發送串口數據,但這樣做你會對串口發送有一個新的認識。
Final- 上述所講的串口通訊是最為常用的一種情況,即隻有一個起始偉和停止位、無奇偶校驗位、波特率為9600。
其它的情況不太常用,暫時就不做闡述。
然後再對上述情況做一個小總結:
發送的數據共10位。
第一位是起始位:把電平拉低。
第二位~第九位:數據位,由所傳輸的字符決定。在這10位當中,也就這8位是有意義的,因為起始位和停止位不代表任何東西,我們可以說串口傳輸的效率為80%。
第十位是停止位:把電平拉高。
為了檢測大家有沒有學會,給你們準備了一個小測試。
猜猜上圖這10位代表哪個字符呢?(參考上面的ASCII碼表)。
,