Arduino學習筆記⑥ 硬件串口通訊

1.前言

    Ardunio與計算機通訊最經常使用的方式就是串口通訊。在Arduino控制器上,串口都是位於Rx和Tx兩個引腳,Arduino的USB口經過一個轉換芯片與這兩個串口引腳鏈接。該轉換芯片會經過USB接口在計算機上虛擬出一個用於Arduino通訊的串口。當你使用串口功能的時候,就意味着你不能引用串口引腳做爲輸入或者輸出。
    要想使串口與計算機通訊,首先須要先啓用串口功能,初始化Arduino的串口通訊功能,也就是:git

  • Serial.begin(speed)

    其中參數speed指串口通訊波特率,用於設定串口通訊速率的參數。串口通訊雙方必須使用相同的波特率才能夠正確通訊。
    波特率是一個衡量通訊速度的參數,表示每秒傳送的bit的個數。如9600波特表示每秒發送9600bit的數據,經常使用如下波特率:300,600,1200,2400,4800,9600,14400,19200,28800,38400,57600,115200。波特率高表示串口通訊速率越快。
    你可使用Arduino IDE內置的串口監視器與Arduino板子通訊。點擊工具欄上的串口監視器按鈕(注意設置相同波特率),咱們接下來的實驗就是用到它。
    Arduino Mega上有三個額外的串口:Serial1,Serial2,Serial3。如有使用這三對引腳與您的我的電腦通訊,你須要一個額外的USB轉串口適配器;若要用它們來與外部的TTL串口設備進行通訊,將Tx引腳鏈接到設備Rx引腳,將Rx引腳鏈接到設備的Tx引腳,將GND鏈接到設備的GND。緩存

2.經常使用串口函數

    接下來介紹一下串口經常使用函數。函數

2.1 begin —— 啓用串口

  • 打開串口,設置波特率。
  • 對於Arduino Mega:Serial1.begin(speed) Serial2.begin(speed) Serial3.begin(speed)

2.2 end —— 停用串口

  • 停用串口通訊,使Rx和Tx引腳用於通常輸入輸出;
  • 要從新使用串口通訊,須要Serial.begin()語句;
  • 對於Mega:Serial1.end() Serial2.end() Serial3.end();

2.3 print、println、printF —— 打印輸出數據

  • 打印輸出數據 Serial.println 函數會在輸出完指定數據後,再輸出一組回車換行符。

2.4 read —— 讀取傳入的串口的數據

  • 讀取傳入的串口的數據,每次都會返回1字節的數據。
  • 在使用串口時,Arduino會在SRAM中開闢一段大小爲64B的空間,串口接收到的數據都會被暫時存放在該空間中,稱這個存儲空間爲緩衝區。
  • 當調用read()函數時,就會從緩衝區中取出1B的數據。

2.5 available —— 當前緩衝區中接收到的數據字節數

  • 當前緩衝區中接收到的數據字節數。一般咱們都要判斷緩存區中是否有數據,而後才調用read方法。

3.實驗

那麼,問題來了,串口到底有什麼用?根據我本身的經驗:工具

  • 對於習慣於但願能夠看到調試過程的我來講,我喜歡用串口打印調試信息,那麼可能就有人問,通常狀況下只有在須要調試的時候才顯示調試結果,那麼正式環境我又不想有調試信息,應該怎麼辦?其實,能夠像下面這樣:
#define BTSerial Serial1
#define MyDebugSerial Serial
 
//該條語句用於使能DEBUG輸出信息,屏蔽掉就不會輸出debug調試信息
#define DEBUG
 
#ifdef DEBUG
#define DBGLN(message)    MyDebugSerial.println(message)
#else
#define DBGLN(message)
#endif

當不須要調試信息時就註釋掉 #define DEBUG。oop

  • 串口固然能夠用來和符合串口通訊協議的模塊進行通訊,好比 藍牙模塊HC06 Wifi模塊ESP系列等等。這就意味着咱們能夠基於硬件串口功能區開發咱們所需功能。

3.1 與電腦串口通訊,讀取數據並原樣返回數據

/**
* @Desc  讀取數據並原樣返回數據
* @author 單片機菜鳥
* @Date  2016/12/10
*/
 
void setup() {
  // 初始化串口
  Serial.begin(9600);
  //等待串口準備好
  while(!Serial);
}
 
void loop() {
  //若是緩衝區中有數據,則讀取並輸出
  if(Serial.available()>0){
    char ch = Serial.read();
    Serial.print(ch);
  }
}

打開Arduino IDE自帶的串口監視器進行調試(要設置相同波特率),當進行串口通訊時,Arduino控制器上就會看到標有RX TX的2個LED燈閃爍提示,如沒有意外,應該顯示以下(我本身隨便寫的):ui

image

3.2 串口控制開關燈

/**
* @Desc  串口控制開關燈
* @author 單片機菜鳥
* @Date  2016/12/10
* 注意:LED的一端接到5V,另一端接到輸出引腳,低電平亮
*/
 
#define LED_START 2
#define LED_END  9
 
void setup() {
  // 初始化串口
  Serial.begin(9600);
  //等待串口準備好
  while(!Serial);
  led_Init();
}
 
void loop() {
  //若是緩衝區中有數據,則讀取並輸出
  if(Serial.available() > 0){
    char ch = Serial.read();
    Serial.print(ch);
 
    //開燈
    if(ch == 'a'){
      led_On();
    }else if(ch == 'b'){
      led_Off();
    }
  }
}
 
/**
* @Desc 初始化LED
*/
void led_Init(){
  // 將2-9號引腳設置爲輸出狀態
  for(int i=LED_START;i<=LED_END;i++){
    pinMode(i,OUTPUT);
    digitalWrite(i,HIGH);//滅掉LED
  }
}
 
/**
* @Desc 打開LED
*/
void led_On(){
  //從引腳2到9引腳,點亮LED
  for(int i=LED_START;i<=LED_END;i++){
    digitalWrite(i,LOW);//LED亮
  }
}
 
/**
* @Desc 關閉LED
*/
void led_Off(){
  //從引腳2到9引腳,關閉LED
  for(int i=LED_START;i<=LED_END;i++){
    digitalWrite(i,HIGH);//LED滅
  }
}

image

個人實驗結果就是燈根據個人指令亮滅.debug

4.總結

整體來講,這節課不難,在理解串口基礎上運用串口提供的一些函數就能進行基本的串口通訊開發。調試

相關文章
相關標籤/搜索