在很多時候,Arduino需要和其他設備相互通訊,而最常見最簡單的方式就是串口通訊。本篇介紹Arduino硬件串口通訊,了解相關函數的使用。
1. 硬件串口
在PC機上最常見的串行通訊協議是RS-232串行協議,而各種微控制器(單片機)上采用的是TTL串行協議,兩者電平不同,需要經過相應電平轉換才能進行相互通訊。
Arduino Uno R3開發板上,硬件串口位于Rx(0)和Tx(1)引腳上,Arduino的USB口通過轉換芯片與這兩個引腳連接。該轉換芯片會通過USB接口在PC機上虛擬出一個用于Arduino通訊的串口,我們下載程序也是通過串口進行的。
硬件串口接口
2. 相關函數介紹
Arduino提供的串口通訊函數非常豐富,詳細介紹參考Arduino官網串口使用指南。
Serial.begin()
- 描述:開啟串口,通常置于setup()函數中。
- 原型:
- Serial.begin(speed)
- Serial.begin(speed, config)
- 參數:
- speed:波特率,一般取值9600,115200等。
- config:設置數據位、校驗位和停止位。默認SERIAL_8N1表示8個數據位,無校驗位,1個停止位。
- 返回值:無。
Serial.end()
- 描述:禁止串口傳輸。此時串口Rx和Tx可以作為數字IO引腳使用。
- 原型:Serial.end()
- 參數:無。
- 返回值:無。
Serial.print()
- 描述:串口輸出數據,寫入字符數據到串口。
- 原型:
- Serial.print(val)
- Serial.print(val, format)
- 參數:
- val:打印的值,任意數據類型。
- config:輸出的數據格式。BIN(二進制)、OCT(八進制)、DEC(十進制)、HEX(十六進制)。對于浮點數,此參數指定要使用的小數位數。
- 示例:
- Serial.print(78, BIN) 得到 "1001110"
- Serial.print(78, OCT) 得到 "116"
- Serial.print(78, DEC) 得到 "78"
- Serial.print(78, HEX) 得到 "4E"
- Serial.print(1.23456, 0) 得到 "1"
- Serial.print(1.23456, 2) 得到 "1.23"
- Serial.print(1.23456, 4) 得到 "1.2346"
- Serial.print('N') 得到 "N"
- Serial.print("Hello world.") 得到 "Hello world."
- 返回值:返回寫入的字節數。
Serial.println()
- 描述:串口輸出數據并換行。
- 原型:
- Serial.println(val)
- Serial.println(val, format)
- 參數:
- val:打印的值,任意數據類型。
- config:輸出的數據格式。
- 返回值:返回寫入的字節數。
Serial.available()
- 描述:判斷串口緩沖區的狀態,返回從串口緩沖區讀取的字節數。
- 原型:Serial.available()
- 參數:無。
- 返回值:可讀取的字節數。
Serial.read()
- 描述:讀取串口數據,一次讀一個字符,讀完后刪除已讀數據。
- 原型:Serial.read()
- 參數:無。
- 返回值:返回串口緩存中第一個可讀字節,當沒有可讀數據時返回-1,整數類型。
Serial.readBytes()
- 描述:從串口讀取指定長度的字符到緩存數組。
- 原型:Serial.readBytes(buffer, length)
- 參數:
- buffer:緩存變量。
- length:設定的讀取長度。
- 返回值:返回存入緩存的字符數。
3. 實驗步驟
1. 通過數據線連接開發板到PC機。
2. 新建sketch,拷貝如下代碼替換自動生成的代碼并進行保存。
/*
Serial
串口通訊實驗
*/
int incomedate = 0;
void setup() {
Serial.begin(9600); //設置串口波特率9600
Serial.println(78, BIN);// "1001110"
Serial.println(78, OCT);// "116"
Serial.println(78, DEC);// "78"
Serial.println(78, HEX);// "4E"
Serial.println(1.23456, 0);// "1"
Serial.println(1.23456, 2);// "1.23"
Serial.println(1.23456, 4);// "1.2346"
Serial.println('N');// "N"
Serial.println("Hello world.");// "Hello world."
}
void loop() {
if (Serial.available() > 0)//串口接收到數據
{
incomedate = Serial.read();//獲取串口接收到的數據
if (incomedate == 'H')
{
Serial.println("Good Job!");
}
}
delay(1000);
}
3. 設置好對應端口號和開發板類型進行程序下載。
程序下載
4. 打開串口監視器,設置波特率9600,觀察串口打印信息。輸入"H",串口返回"Good Job!"。
實驗現象