串口通訊學(xué)習(xí)最后一站,包學(xué)會(huì)
在講串口通訊之前,我們先來(lái)講一講通訊的概念吧,因?yàn)槲蚁胱尨蠹抑劳ㄓ嵉谋举|(zhì)是什么,只有在你知道了通訊的本質(zhì)之后,你才能在學(xué)習(xí)通訊的大路上順風(fēng)順?biāo)?/p>
所以呢,你們要認(rèn)真看完我為你們精心編制的小故事,看完之后,你會(huì)對(duì)現(xiàn)在的通訊有一個(gè)更加深刻的理解。
烽火臺(tái)
在遙遠(yuǎn)的古代,沒(méi)有手機(jī)、電腦這樣的通訊工具,更沒(méi)有汽車(chē)、飛機(jī)之類(lèi)的交通工具,那么如果有敵人來(lái)攻城的話,如何快速傳遞把信息傳遞給千里之外的兵營(yíng)呢?
答案想必大家都知道,那就是烽火臺(tái)!
而且是每隔數(shù)里建設(shè)一個(gè)烽火臺(tái),等有敵人來(lái)犯就點(diǎn)燃煙草,烽煙會(huì)在短時(shí)間內(nèi)傳到千里之外的兵營(yíng)。
我們暫且稱它為烽煙通訊,它的通訊原理很簡(jiǎn)單,有烽煙的情況就代表著有敵人來(lái)犯,如果沒(méi)有烽煙就代表一切正常,它只會(huì)出現(xiàn)兩種情況。
但是有烽煙并不一定是出現(xiàn)了戰(zhàn)爭(zhēng),比如說(shuō)西周時(shí)期的周幽王為了博美人褒姒一笑,在沒(méi)有發(fā)生戰(zhàn)爭(zhēng)的情況下,點(diǎn)燃了烽火臺(tái),各方諸侯諸侯紛紛趕來(lái)救駕,來(lái)了之后周幽王和褒姒在臺(tái)上哈哈大笑,面對(duì)奇恥大辱,犬戎一怒之下殺死了周幽王。
因?yàn)榉闊熞馕吨鴶橙藖?lái)犯早已在人們心中達(dá)成共識(shí),所以即使是假的,各方諸侯也會(huì)默認(rèn)為真。通訊只能事先代表約定俗成的東西、而不能反映事實(shí)上發(fā)生的事情。
烽火臺(tái)這種通訊方式看似簡(jiǎn)單,但卻是我們現(xiàn)在所有高級(jí)通訊的基礎(chǔ),夸張一點(diǎn)的講,無(wú)論多么復(fù)雜的通訊,像紅外遙控、wifi、3G、5G這些都可以說(shuō)成是烽煙通訊的衍生品,無(wú)論現(xiàn)代多么復(fù)雜的通訊方式,它的原理都是基于這種烽煙通訊演化而來(lái)的,即在某一時(shí)刻不是在傳遞高電平,就是低電平。
只不過(guò)這些現(xiàn)代化通訊傳輸?shù)乃俾蕵O快,在一秒當(dāng)中變換高低電平幾千萬(wàn)次,甚至上億次,它可以使我們?cè)诩岸痰臅r(shí)間內(nèi)接收/傳輸大量的信息。如果把時(shí)間放慢、放慢再放慢,你會(huì)發(fā)現(xiàn)這些現(xiàn)代化的通訊執(zhí)行的就是不停的把烽火臺(tái)點(diǎn)燃熄滅的過(guò)程。
串口通訊
串口通訊是電子研發(fā)人員常用的一種通訊,也是最簡(jiǎn)單的一種通訊之一。這種通訊目前最常見(jiàn)的一種形式是:芯片與電腦之間通訊,它的傳輸速率極慢,通常傳輸速率1-10KB/S,這個(gè)速率相比于我們現(xiàn)在的USB傳輸速度相差了幾千甚至上萬(wàn)倍,但為什么這種通訊至今還沒(méi)有被淘汰呢?
老式串口接口,現(xiàn)在已經(jīng)淘汰
要知道電子開(kāi)發(fā)人員所使用的芯片不是做存儲(chǔ)用的,它可能傳輸?shù)木褪菧囟?、距離、壓力這些,即使是1K/S,我們也能在1S之內(nèi)接受1024個(gè)數(shù)據(jù),對(duì)于人類(lèi)而言,這個(gè)速度顯然是足夠快的,1024次/S的速度就把我們開(kāi)的眼花繚亂了,面對(duì)如此‘多’的數(shù)據(jù),你會(huì)自顧不暇,所以這種低端芯片與電腦通訊往往采用串口通訊。
接下來(lái)說(shuō)一下串口到底是如何在芯片和電腦之間傳輸?shù)摹?/p>
串口通訊本來(lái)及其簡(jiǎn)單的一種通訊,可是現(xiàn)在與之有關(guān)的教科書(shū)里官腔太多,而且還摻雜著很多專(zhuān)業(yè)術(shù)語(yǔ),比如各種寄存器、鎖存器這些,除此之外還講述了串口的很多情況,同步或者異步都有,很多情況是用不到的,學(xué)生們往往是懷著期望的心去學(xué)習(xí),但是最終卻失望而歸,只要有一個(gè)寄存器的原理不懂,就會(huì)影響到你學(xué)習(xí)的心情。
串口接線
很多人雖然會(huì)使用串口通訊了,但是具體是怎么發(fā)出去的,可能知道的人就不多了,反正是配置好寄存器就可以使用串口通訊了,這種學(xué)習(xí)方法是最快的,但是對(duì)這個(gè)串口的基本工作原理理解的還是不到位。
接下來(lái)我們來(lái)更深一步的去了解串口,在了解串口之前我們首先要直到串口發(fā)送的是什么?
串口其實(shí)發(fā)送的是高低電平,比如我們把要發(fā)送信息的高低電平發(fā)送給電腦,它就直到我們發(fā)送的信息,并且顯示出來(lái)、那么問(wèn)題又來(lái)了,電腦是如何直到這些高低電平代表的什么呢?
這些呀,早就有人想過(guò)了,就像我們之前講過(guò)的烽煙通訊,烽煙代表敵人來(lái)犯。這個(gè)串口傳輸?shù)母叩碗娖揭苍缇臀覀兟斆鞯娜祟?lèi)定義好了,不過(guò)這次不是中國(guó)人了,而是美國(guó)人定義的,然后全世界都這么使用了。
ASCII碼
ASCII表如下圖所示,每一個(gè)圖形都對(duì)應(yīng)的8位的二進(jìn)制,比如A對(duì)應(yīng)的是0100 0001,如果我們要給電腦發(fā)送A的話,是不是發(fā)送0100 0001對(duì)應(yīng)的高低電平就可以了(1對(duì)應(yīng)高電平)?
當(dāng)然不是了,因?yàn)橐晒Φ陌l(fā)送數(shù)據(jù),在它發(fā)送數(shù)據(jù)之前,首先要給電腦發(fā)送一個(gè)開(kāi)始信號(hào),不然電腦接收就亂了,就像我們?nèi)ト】爝f,都是在收到短信之后再過(guò)去,不然去了可能快遞還沒(méi)有到呢。
串口發(fā)送數(shù)據(jù)也一樣,首先要發(fā)送一個(gè)開(kāi)始的信號(hào),這個(gè)信號(hào)也叫做起始位。在串口不工作的時(shí)候默認(rèn)的都是高電平,如果要給電腦開(kāi)始的信號(hào),只需要給一個(gè)低電平,電腦就會(huì)被喚醒接收我們發(fā)送的串口數(shù)據(jù),然后我們?cè)僦鸫伟l(fā)送ASCII數(shù)據(jù),是一個(gè)一個(gè)的發(fā)送,而不是同一時(shí)刻一起發(fā)送。串口嘛,就跟串羊肉串一樣,都是一個(gè)個(gè)的往竹簽上串。
這也是串口的優(yōu)勢(shì),發(fā)送只需要一根線,如果是并口的話,發(fā)送8位數(shù)據(jù),就得需要8根線,就物理接線而言,顯然串口更有優(yōu)勢(shì)。
在8位數(shù)據(jù)發(fā)送完成之后,最后還需要發(fā)送一位停止位,即最后一位把電平拉高,告訴電腦發(fā)送結(jié)束,讓電腦準(zhǔn)備下一次接收。這東西和我們?nèi)】爝f一樣,拿完貴重快遞,不能直接走吧,最后還需要簽字不是。
所以要發(fā)送A的話,需要發(fā)送:
10100 00010
1(停止位) 0100 0001(中間8個(gè)為字符A) 0(起始位)
無(wú)論是串口發(fā)送還是取快遞都是人類(lèi)想出來(lái)的流程,所以存在共性。
波特率
還有最后一個(gè)問(wèn)題沒(méi)有解決,那就是這每一位的發(fā)送間隔是多少呢?
我們還拿烽煙通訊為例,站崗小兵也不是時(shí)時(shí)刻刻在盯著烽火臺(tái),可能是一小時(shí)看一次,然后他也許會(huì)做一些娛樂(lè)項(xiàng)目。
現(xiàn)在,我們發(fā)送串口數(shù)據(jù)也一樣,我們要提前約定好,多長(zhǎng)時(shí)間發(fā)送一次,然后電腦上也要按照這個(gè)時(shí)間去接收,不然肯定會(huì)接收到錯(cuò)誤的數(shù)據(jù)。
我們約定的這個(gè)時(shí)間就是電子專(zhuān)業(yè)中常說(shuō)的波特率,它所指的是在一秒之內(nèi)發(fā)送了多少位數(shù)據(jù)。
就拿最常用的波特率9600來(lái)說(shuō),它所代表的是在1秒之內(nèi)傳輸9600位數(shù)據(jù)(0或1)。
知道波特率之后,我們也就知道了傳輸一位所需要的時(shí)間,即1/9600=104us。
104us對(duì)我們來(lái)說(shuō)可能會(huì)很短暫,對(duì)芯片來(lái)卻是極其漫長(zhǎng)的時(shí)間。
這時(shí)候還是會(huì)有人擔(dān)心,萬(wàn)一接收的時(shí)序?qū)Σ簧显趺崔k。
這個(gè)不用擔(dān)心,因?yàn)樾酒邮諘r(shí)也不是104us接收一次,它的接收精度是這個(gè)時(shí)間的16倍,即以6.5us的最小步長(zhǎng)開(kāi)始計(jì)數(shù),它會(huì)在你每一位(104us)的中間時(shí)刻接收數(shù)據(jù),這樣誤差就會(huì)變的很小。
模擬串口吧
所以,串口通訊不需要配置寄存器,直接用單片機(jī)的I/O口輸出高低電平也可以實(shí)現(xiàn),因?yàn)樗湍阍趩纹瑱C(jī)上配置寄存器是一樣的,如果最開(kāi)始你是使用的寄存器來(lái)學(xué)習(xí)串口,可能是只會(huì)串口的收發(fā),而不直到串口的最基本發(fā)送原理。
如果你有興趣的話,直接在單片機(jī)上用I/O模擬串口發(fā)送試一試,雖然最終我們都會(huì)使用配置寄存器的方式發(fā)送串口數(shù)據(jù),但這樣做你會(huì)對(duì)串口發(fā)送有一個(gè)新的認(rèn)識(shí)。
Final
上述所講的串口通訊是最為常用的一種情況,即只有一個(gè)起始偉和停止位、無(wú)奇偶校驗(yàn)位、波特率為9600。
其它的情況不太常用,暫時(shí)就不做闡述。
然后再對(duì)上述情況做一個(gè)小總結(jié):
發(fā)送的數(shù)據(jù)共10位。
第一位是起始位:把電平拉低。
第二位~第九位:數(shù)據(jù)位,由所傳輸?shù)淖址麤Q定。在這10位當(dāng)中,也就這8位是有意義的,因?yàn)槠鹗嘉缓屯V刮徊淮砣魏螙|西,我們可以說(shuō)串口傳輸?shù)男蕿?0%。
第十位是停止位:把電平拉高。
為了檢測(cè)大家有沒(méi)有學(xué)會(huì),給你們準(zhǔn)備了一個(gè)小測(cè)試。
猜猜上圖這10位代表哪個(gè)字符呢?(參考上面的ASCII碼表)。