arduino通訊硬件介紹?如果按照百度百科裡面的定義,那麼通訊協議的解釋如下:,今天小編就來說說關于arduino通訊硬件介紹?下面更多詳細答案一起來看看吧!
如果按照百度百科裡面的定義,那麼通訊協議的解釋如下:
通信協議又稱通信規程,是指通信雙方對數據傳送控制的一種約定。約定中包括對數據格式, 同步方式,傳送速度,傳送步驟,檢糾錯方式以及控制字符定義等問題做出統一規定,通信雙方 必須共同遵守,它也叫做鍊路控制規程。 好吧,如果抄襲到這裡,我肯定不會收到讀者的鮮花,而是闆磚和臭雞蛋。文抄公誰不會做?那麼,對于業餘電子愛好者而言,如何來快速而又簡單地理解通訊協議?其實,我們可以簡單地這麼來理解,對于人類世界來說,在中國範圍内,那麼我們可以将普通話看成是一個通訊協議。也就是說,當有一個人懂得漢語的人要對另外一個懂得漢語的人表達自己意見的時候,他可 以使用“普通話”這個通訊協議和另外一個懂得普通話的人進行溝通。同樣的,我們也可以将英語看成人類世界的另外一個版本的通訊協議。而在電子世界中,我們通常所謂的通訊協議都是數字通訊協議,在數字通訊協議中,小到 各種電子零件,大到電腦,它們之間互相溝通其實都是通過 0 或者 1 兩個電位水平來進行通訊的(當 然,還有别的表達方式,如差分電位,這裡不細表,作為愛好者,我們将且這麼認為罷)。
大家知道,當我們采用 0,1 來進行信息表達的時候,如果隻表達一次,即每次隻說 1 或者 0 。那麼這次表達隻能夠蘊含兩個意思,或者你說了 0,這就表示“沒有”,或者你說了 1,這就表示“有”。但是,我們總該知道,這個世界哪裡這麼簡單?比如你女友問你現在溫度是多少度,你卻 回答說“沒有”或者“有”,我相信,你的女友少不得給你來一記九陰白骨抓。幸好,我們并沒有走到絕路,其實,如果你有一個比較耐得住性子且願意陪你搞怪的女友。那麼我們可以這樣來解決“問溫度”的問題:我們這樣設想,如果你事先和女朋友約定如下:
如果她問你溫度,如果并且她會有足夠的耐心會反複這樣問:現在的溫度是 0°?如果對了,你回答“是”,如果不對,你回答“否”如果回答了否,她就将上次問的溫度增加一度重新問你。(如第二次就該問是否是 1°)直到你回答了“是”。也就是說,當你回答了“是”的時候,你的女友也就知道了現在溫度。
好吧,恭喜你,盡管這個例子非常地無聊。但是,你和你的女友已經共同創造了一種全新的“通 訊協議”。當然,我們不能想得這麼簡單,這個世界非常複雜,所以,我們需要進行複雜的表達。比如說,你女友正在問你溫度問題的時候,你忽然發現她老娘在背後看着你們倆發傻,我 相信,明智的你肯定不會繼續這樣傻幹下去了。這個時候,你肯定得想辦法打個哈哈蒙混過關, 諸如“阿姨,您怎麼親自來了?”什麼的。人類世界的溝通,可以用語言來進行複雜的表達,而語言由于其音節音調的多樣性。所以 可以進行複雜的表達。普通話中的“你”“我”“他”三個字,有三種發音,聽者肯定可以區分三者的含義。但是,在電子的數字通訊世界裡,隻有 0 和1這兩個基本元素。就如前面提到的,它隻能在一個時刻裡面隻表達一次。怎麼辦?解決的方法是,我們用一組 0 和 1 的組合來進行複雜意義的表達。如,我們可以用 00001 表示現在溫度是 1°,00010 表示現在是 2°,00011 表示現在是 3°。 當然,這種表達的方法是二進制的(關于二進制,八進制,十進制等數學進制的概念和互相轉換, 請參考網上的文檔)。所以,簡而言之,在電子的世界裡面,所謂的通訊協議,其實就是一個事先規定的規則, 我發送什麼樣的 0 和 1 的組合代表什麼意思。你如果事先了解了這個規則,這就是所謂的你“兼容”這個通訊協議。如果不了解,那 就是所謂的“不兼容”。
2、一個通訊協議涉及到的關鍵要素一個通訊協議包含哪些要素呢?在此羅列如下:
A、電壓規範。處于一個通訊網絡下的各個電子零件在進行通訊的時候,首先必須要采用共同的電壓 水平。因為,數字通訊的基本規則就是 LOW(通常是 0V,當然還有别的電壓水平,如果是 0V,這個電壓并非指确定的 0V,而是大約在 0V 左右)表示 0,表示“沒有”。HIGH(事先 約定的高電平,如 3.3V,5V,12V 等。如果是 3.3V,那麼這個值并非是确定的 3.3V 等,而 是電壓高到大約 3.3V 左右)表示 1,表示“有”。
試想一下,如果兩個電子零件相互之間連基本的工作電壓都不一緻,你還妄圖讓它們進 行通訊,那麼除了冒煙或者是通訊失敗,你幾乎得到什麼别的結果。
舉個例子,如你手頭的一個零件 A,輸出 0V 表示開關閉合,輸出 5V 表示開關打開。現 在另外一個零件 B,它認為 -12V 表示開關閉合,0V 代表開關打開。姑且不去讨論會不會燒掉 電路的問題。那麼不管 A 發送什麼電壓給 B,B 會永遠都認為 A 是處于開關打開的狀态,因為 不管是 0V 還是 5V 都已經高于了 0V 這個限度。
繼續舉一個例子,如,你和你的女友約定,如果你拿手指頭點點她的額頭表示你現在很無奈(你的手指很溫暖,女友很幸福)。如果你拿着一把燒紅的烙鐵打算點點她的額頭,這還 會讓她認為你打算讓她認為你很無奈嗎?不過,需要注意的一點是:通常情況下,我們在網上可以下載到的各種 IEEE 的通訊協議 标準規範裡面都不會對電壓進行直接的規定。其實,這也很好理解,我們隻需要保證處于通訊中的雙方采用同樣的電壓就行了。這就好像,如果你和你的女友是超人和女超人,那麼你拿個烙鐵點她的額頭,她還是會理 解為你是在表達你的無奈。實際上的例子則是:在實際應用中,如 canbus 總線,有的總線的通訊電壓是 3.3V,有的 在是 5V,甚至還有使用 12V。而之所以在此提出這一點。是因為有很多的新人愛好者在使用數字傳感器的時候,往往不 會去考察它的通訊電壓。而這往往會導緻通訊失敗,甚至燒毀電路元器件。
B、幀長度所謂的幀長度就是:到底一個信息用了多少個 0 和 1 來組成。這個好理解,因為是采用一串的 0 和 1 的組合來代表意義,那麼我們設想,信息的發送方 如果沒有預定多少個用 0-1 來表示一個完整的組合。那麼假設我們按照如下的方式發送信息呢:一次性發送:0101001011100101001010100如果拆分成 4 個一組呢?: 0101-0010-1100-1010-0101-0100顯然,前者你根本就不知道是什麼意思。你哪裡知道是多少個數字代表一個信息?而後者,你雖然不知道意思,但是好歹,知道發送了 6 個信息過來。在幀長度的實際應用中,有些通訊協議采用了停止位的方法,而所謂的停止位,類似于上 面的 0101-0010 之間的“-”,通常的做法是使用一個較長的低電平或者高電平。而有些的通 訊協議則是,事先約定了多少個 0-1 組合就是表示一個信息。也就是發送方一旦開始發送,接 收方直接照着固定的個數,自行将一整個的 0-1 序列拆分。 無奈(你的手指很溫暖,女友很幸福)。如果你拿着一把燒紅的烙鐵打算點點她的額頭,這還 會讓她認為你打算讓她認為你很無奈嗎?
我們常見的序列長度有 8 個 0-1,16 個,32 個,64 個。看一下,正好是 2 的倍數。當然,前言 8 個的最常見,8 個 0-1 序列就可以排出 256 個可能。而我們必須要接觸到的 ASCII 編碼,其 基本的 0-1 序列長度就是 8 位。
C、通訊速率關于這一點,我們可以使用一個簡單的實驗來得到體現。我們在 Arduino 中輸入如下的 代碼:
void setup(){Serial.begin(9600);} void loop(){Serial.println(“Hello!”);delay(1000);}
如果在電腦中打開串口監視器,除非我們選擇的波特率是 9600,否則,我們在串口監視 器中将隻能看到一堆的亂碼。
我們打一個比方:好吧,你和你的女友郎情妾意,她在給你喂飯。如果你當時感到幸福,于是閉上了眼感覺 自己徜徉在幸福的海洋中,而女友也感到幸福,于是也閉眼享受和你一樣的幸福。如果她這個 時候還給你繼續喂飯呢?你知道她什麼時候會喂給你,而你恰好張開嘴?于是飯勺子很可能就 直接戳你嘴皮上了。
當然,如果你們兩個都具有大哲學家的冷靜,事先約定了:
“親,你每 5 秒給我喂一次哦”
那麼上面煞風景的事情就不會發生。 這是因為,你們約定了喂飯的頻率。
其實,處于通訊兩端的兩個電子零件也相當于這麼一對閉眼享受幸福還要秀恩愛喂飯的男 女,一個在發送信息(喂飯)一個在接收信息(張嘴吃飯)。如果通訊雙方不事先約定好頻率, 那麼就會出現信息丢失的現象。
D、校驗如果說,兩個人互相之間是在扯談,比如像我現在正在幹的事情。那麼說過了也就罷了, 沒啥大問題。但是,如果是在非常重要和嚴肅的場合呢?萬一聽的人聽錯了,那肯定會出大問 題。在軍事指揮中,有這麼一種方法來防止出問題:命令複述。也就是指揮官下重要命令的時候, 聽從命令者必須複述指揮官的命令以做确認。同樣的,在電子世界的通訊中,因為通信線路的幹擾,信息發送方和接收方可能出偶爾的 問題,那麼也會面臨同樣的問題—信息發送出現了失誤(術語叫誤碼)。這個時候,我們就必 須想辦法來解決。當然,如果接收方在接收到信息之後原封不動的反饋給發送方,發送方比對,如果對了就 回複确認;如果錯了就回複錯誤,然後重新發送,這種方法可以确保絕對的正确。但是,這種 方法顯然是相當無效率的,除非是非常重要的,一點錯都不能出的通訊場合,否則這種檢驗方 法很少會被采用。
幸好專家們想到了更有效率的方法,即所謂的校驗。通常的校驗方法有所謂的奇偶校驗, 和值校驗等等。如奇偶校驗,則是在發送信息的同時在末尾再帶上這次發送信息的 0-1 中的 0 的個數或者 1 的個數的模值。
如前面的數據列
>0101-0010-1100-1010-0101-0100
如果為了确保信息發送的完全。我們可以采用在每個4位數的後面再加上一個奇偶校驗位, 即一次性發送 5 個。
如果我們采用耦校驗位,那麼我們的上面的序列就變成了如下的串列:
>0101(0)-0010(1)-1100(0)-1010(0)-0101(0)-0100(1)
括号裡面的 0-1 就是所謂的校驗字(注:事實上,括号是不存在的)
采用數學的方法。如第一串 0101(0) 我們可以根據校驗字來判斷,前面的 0101 是否正确。
如果發生了錯誤,我們原本打算發送 0101,但是因為通訊出了問題,結果隻接收成了0001,那麼我們可以發現,這個時候的校驗位卻是 0 的話,顯然,0001 絕對是錯誤的值。那 麼這個串列就可以簡單抛棄,然後要求重發了。 當然,在實際過程中。如 TTL 串口通訊。如果你要求不是那麼高,那大可以不搞什麼校驗。 而如果你對奇偶校驗有跟多的興趣,可以參考維基百科。
E、握手這個概念非常好理解。如果你在圖書館聚精會神地讀書,忽然坐你邊上的人開始說話,我 相信,你的第一反應肯定不會認為那個家夥是在對你說話,并且你幾乎記不住那個家夥剛剛在 說什麼。但是,如果那個家夥先用手肘碰碰你,然後說:“喂”。等你擡頭看着他,他再和你叽裡 呱啦的時候,你肯定可以聽到他對你說了什麼。
在電子通訊世界裡面也是如此,兩個或者多個需要進行互相通訊的電子零件可能正在執行 各自的工作。結果,接收方正在進行某個工作的處理,結果發送方忽然發送了一大段的信息過去。 很有可能的結果就是接收方沒法接受到這個信息。解決這個問題的方法有幾種。一種是采用所謂的握手信号,有的是一個專門的電路,如 Arduino 中的 SPI 通訊,發送方 會使用 CS 引腳發送一個高電平,告訴接受方,我要開始和你通訊了。
還有一種類似于老師在課堂上點名回答問題,參與通訊的各個電子元件事先都規定好了各 自的 ID,當發送方發送信息的時候在開頭的時候發送這個 ID。那麼具有這個 ID 的接受者就會 根據 ID 判斷這個信息是否是發送給自己的。這類似于在信封上面寫地址一樣。再有就是沒有握手信号。純粹雙方都具有專門的發送和接收的模塊。如 Arduino 上的 RS232 中的 RX 端口,它是相對獨立于 Arduino 的 CPU 的,一旦 Arduino 上電,它就會随時 監聽來自于電線上的信号。一旦收到就立即存儲起來供 CPU 調用。這就好像一個老闆給自己配 了一個電話秘書,随時替老闆接收電話,然後把電話内容記錄下來供老闆随時浏覽。
F、并行通訊和串行通訊關于這個,其實很好理解,如果隻有一根導線,那麼我們一次隻能發送 0 或者 1。如果我 們要發送 0101,那麼我們就需要按照先後順序連續發送四次。這就是所謂的串行通訊。但是, 如果我們在通訊的雙方連接 4 條導線呢?那麼一次性我們就可以把 0101 中的第一位的 0 通過 第一根導線,第一位的 1 通過第二根,第三位的 0 通過第三根,第四位的 1 通過第四根一次性 地發送出去。 串行通訊的速度相對較慢,但是這節省連接電路,也就是說省錢。并行通訊速度相對較快, 但是這相對來說非常不省錢。并且,随着連接電路的數量增多,它的可靠性也成級數往下降。所以, 選擇哪種通訊方式,這在于速度 VS 可靠和經濟的權衡。 通常情況下,遠距離、低速的通訊通常都是串行的。而近距離、高速的通訊通常都是并行的。
G、單工,半雙工,全雙工。這三個概念也比較簡單。單工就是發送方隻能發送,接收方隻能接受。這種方式在現實的世界中比如說廣播、電視。 這些就是單工。半雙工則是,雙方都能夠發送和接收,但是如果是發送信息,那麼它在同一個時刻下隻能 發送或者接收。無法在同一個時刻下同時幹兩件事情。如 Arduino 上的 IIC 總線(TWI)就是 半雙工通訊。比較形象的就是步話機。
全雙工則是,雙方不僅能夠發送和接收,而且發送和接收可以同時進行。在 Arduino 上 的 SPI 總線和 TTL RS232 都屬于全雙工。而現實中的例子如電話,互聯網連接等。
3、了解這些對于應用 Arduino 的意義。1、了解了關于電平的概念,那麼我們在未來連接電路的時候就不會出現随便拿一個數字 傳感器就往 Arduino 上接的低級錯誤。好歹我們得注意看一下,它的通訊電壓是多少的。當然, 還有一些特例,如 CMOS 電平和 TTL 電平兼容,這些是後來的升級概念。我們這兒不做延伸說明。2、了解了關于通訊速率的概念,那麼我們就明白了,為什麼需要設定 Serial.begin()。3、了解了奇偶校驗,那麼我們在未來讀取數字傳感器的發來的數字的時候就會應用這 個位來判定讀數值正确與否。4、了解串行和并行通訊,其實,是為了讓我們理解 shiftout() 函數。5、了解握手的概念,這樣我們才會理解為何 IIC 需要設定一個 ID 去發送或者接收,而 TTL RS232 和 SPI 則不需要。6、了解了單工,半雙工,全雙工。好吧,這個概念貌似對于 Arduino 的初級應用的确沒啥用。 隻是純粹為了補齊概念和湊字數。
很多的時候,很多的愛好者往往不清楚這些概念,所以總是會犯一些讓業内人士嘲笑的 低級錯誤。但是,這些錯誤正是因為缺乏基礎知識才會發生的錯誤。如何避免?難道要像那些 業内人士一樣老老實實地抱着專業書開啃?但是,我們真的隻是愛好者,我們隻需要搞清楚大概的理論框架就行了。所以,才 有了這個水煮通訊協議的扯談篇。希望能夠給有需要的讀者以幫助
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!