W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
已經(jīng)定義了數(shù)百個通信協(xié)議來實現(xiàn)這種數(shù)據(jù)交換。每個協(xié)議可以分為兩類:并行或串行。
通過輸入/輸出端口在Arduino和外設(shè)之間進(jìn)行并行連接是短距離(最多幾米)的理想解決方案。然而,在其他情況下,當(dāng)需要在兩個設(shè)備之間建立較長距離的通信時,不可能使用并行連接。并行接口同時傳輸多個位。它們通常需要數(shù)據(jù)總線 - 通過八條,十六條或更多的線路進(jìn)行傳輸。數(shù)據(jù)以1和0的巨大波形傳輸。
并行通信肯定有其優(yōu)勢。它比串行更快,更直接,相對容易實施。然而,它需要許多的輸入/輸出(I / O)端口和線路。如果你曾經(jīng)把一個項目從一個基本的Arduino Uno移動到一個Mega,你就知道微處理器上的I/O線是很寶貴的,而且很少。因此,我們更喜歡串行通信,犧牲針腳空間的潛在速度。
今天,大多數(shù)Arduino板都是用幾種不同的串行通信系統(tǒng)作為標(biāo)準(zhǔn)設(shè)備。
使用哪個系統(tǒng)取決于以下因素:
有關(guān)串行通信的最重要的事情之一是協(xié)議,應(yīng)該嚴(yán)格遵守。它是一套規(guī)則,必須應(yīng)用這些規(guī)則才能使設(shè)備正確地解釋它們相互交換的數(shù)據(jù)。幸運的是,Arduino會自動處理這個問題,這樣程序員/用戶的工作就可以簡化為簡單的寫(發(fā)送的數(shù)據(jù))和讀(接收的數(shù)據(jù))。
串行通信可以進(jìn)一步分類為:
同步 - 同步的設(shè)備使用相同的時鐘,它們的時序彼此同步。
異步 - 異步的設(shè)備具有各自的時鐘,并由前一狀態(tài)的輸出觸發(fā)。
很容易找出設(shè)備是否同步。如果給所有連接的設(shè)備提供相同的時鐘,則它們是同步的。如果沒有時鐘線,它是異步的。
例如,UART(通用異步收發(fā)器)模塊是異步的。
異步串行協(xié)議有一些內(nèi)置的規(guī)則。這些規(guī)則只是有助于確??煽壳覠o誤的數(shù)據(jù)傳輸?shù)臋C制。這些避免外部時鐘信號的機制是:
同步位是與每個數(shù)據(jù)包傳輸?shù)膬蓚€或三個特殊位。它們是起始位和停止位。正如它們的名稱,這些位分別標(biāo)記數(shù)據(jù)包的開始和結(jié)束。
起始位始終只有一個,但停止位的數(shù)量可以配置為一個或兩個(盡管通常保持為1)。
起始位始終由從1到0的空閑數(shù)據(jù)線指示,而停止位將通過將線保持在1處而轉(zhuǎn)換回空閑狀態(tài)。
每個分組中的數(shù)據(jù)量可以設(shè)置為5到9位的任意大小。當(dāng)然,標(biāo)準(zhǔn)數(shù)據(jù)大小是基本8位字節(jié),但其他大小有它們的用途。7位數(shù)據(jù)包的效率可能比8位高,特別是如果你只是傳輸7位ASCII字符。
用戶可以選擇是否應(yīng)該有奇偶校驗位,如果是,則奇偶校驗應(yīng)該是奇數(shù)還是偶數(shù)。如果數(shù)據(jù)位中的1的數(shù)目是偶數(shù),則奇偶校驗位為0。奇數(shù)的奇偶校驗正好相反。
術(shù)語波特率用于表示每秒傳輸?shù)奈粩?shù)[bps]。注意,它指的是位,而不是字節(jié)。協(xié)議通常要求每個字節(jié)與幾個控制位一起傳輸。這意味著串行數(shù)據(jù)流中的一個字節(jié)可以包括11位。例如,如果波特率為300bps,則每秒可以傳輸最大37字節(jié)和最小27字節(jié)。
以下代碼將使Arduino在啟動時發(fā)送hello world。
void setup() { Serial.begin(9600); //set up serial library baud rate to 9600 Serial.println("hello world"); //print hello world } void loop() { }
將Arduino草圖上傳到Arduino后,打開Arduino IDE右上角的串口監(jiān)視器搜索。
在串口監(jiān)視器的頂部框中鍵入任意內(nèi)容,然后按發(fā)送鍵或鍵盤上的enter鍵。這將發(fā)送一系列字節(jié)到Arduino。
以下代碼返回它接收到的任何東西作為輸入。
以下代碼將使Arduino根據(jù)提供的輸入傳送輸出。
void setup() { Serial.begin(9600); //set up serial library baud rate to 9600 } void loop() { if(Serial.available()) //if number of bytes (characters) available for reading from { serial port Serial.print("I received:"); //print I received Serial.write(Serial.read()); //send what you read } }
請注意,Serial.print 和 Serial.println 將發(fā)回實際的ASCII代碼,而 Serial.write 將返回實際的文本。請參閱ASCII代碼了解更多信息。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: