Arduino 通信

2018-11-16 18:37 更新

已經(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)點和缺點

并行通信肯定有其優(yōu)勢。它比串行更快,更直接,相對容易實施。然而,它需要許多的輸入/輸出(I / O)端口和線路。如果你曾經(jīng)把一個項目從一個基本的Arduino Uno移動到一個Mega,你就知道微處理器上的I/O線是很寶貴的,而且很少。因此,我們更喜歡串行通信,犧牲針腳空間的潛在速度。

串行通信模塊

今天,大多數(shù)Arduino板都是用幾種不同的串行通信系統(tǒng)作為標(biāo)準(zhǔn)設(shè)備。

使用哪個系統(tǒng)取決于以下因素:

  • 微控制器有多少個器件與數(shù)據(jù)交換?
  • 數(shù)據(jù)交換的速度有多快?
  • 這些設(shè)備之間的距離是多少?
  • 是否需要同時發(fā)送和接收數(shù)據(jù)?

有關(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制。這些避免外部時鐘信號的機制是:

  • Synchronization bits 同步位
  • Data bits 數(shù)據(jù)位
  • Parity bits 奇偶校驗位
  • Baud rate 波特率

同步位

同步位是與每個數(shù)據(jù)包傳輸?shù)膬蓚€或三個特殊位。它們是起始位和停止位。正如它們的名稱,這些位分別標(biāo)記數(shù)據(jù)包的開始和結(jié)束。

起始位始終只有一個,但停止位的數(shù)量可以配置為一個或兩個(盡管通常保持為1)。

起始位始終由從1到0的空閑數(shù)據(jù)線指示,而停止位將通過將線保持在1處而轉(zhuǎn)換回空閑狀態(tài)。


同步位

數(shù)據(jù)位

每個分組中的數(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 UART

以下代碼將使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)視器搜索Search。

在串口監(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代碼了解更多信息。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號