SlideShare a Scribd company logo
Arduino序列通訊應用
Revised on December 16, 2019
 UART傳輸協定
 RS232標準
 Serial程式庫
 使用序列傳輸字元命令
 使用序列傳輸字串命令
 使用序列傳輸格式化命令字串
 非同步序列傳輸(UART, Universal Asynchronous Receiver &
Transmitter)是⼀種廣泛使用的資料傳輸⽅式,也⼀直是微控制器
的標準介⾯之⼀
 典型應用
 藍芽Dongle與Arduino控制板之間資料傳輸
 ESP8266 WiFi模組與Arduino控制板之間資料傳輸
 Arduino控制板以USB與PC連接,PC端與Arduino控制板之間資料傳輸
 GPS模組與Arduino控制板之間資料傳輸
非同步序列傳輸
 序列傳輸資料是1個bit接著1個bit傳送
 非同步表示送收雙⽅沒有共同的時序信號
 每個資料封包(package)由起始位元、資料位元、檢查位元及結束位
元組成
 在開始傳輸資料之前,Tx與Rx接腳都為⾼電位,要傳送資料時,先送出⼀
個代表「要開始傳送的通知」的起始位元(start bit,低電位)
 每組資料位元(data bits)⻑度可以是5~8位元
非同步序列傳輸協定 1/3
3
 資料位元之後可以送出⼀個檢查位元
 無(None)
不加檢查位元
 奇同位(Odd)
當資料位元有偶數個1時,則檢查位元為1,補成奇數;資料位元有奇數個1時,
則檢查位元為0,維持奇數
 偶同位(Even)
當資料位元有奇數個1時,則檢查位元為1,補成偶數;資料位元有偶數個1時,
則檢查位元為0,維持偶數
 標記(Mark)
檢查位元始終為1
 空格(Space)
檢查位元始終為0
 封包最後是代表「傳送完畢」的停止位元(stop bit),1~2位元
非同步序列傳輸協定 2/3
4
 傳輸協定(protocol)代表通訊裝置雙⽅遵循的規範和參數,通訊雙⽅
的設定必須⼀致,才能相互溝通
 送收雙⽅須議定傳輸速率及封包格式
 傳輸速率:每秒傳送的位元數(bit per second,bps),也稱為鮑率
(baud rate)
 取樣
 通常是以鮑率的16倍頻⼯作,並在中⼼點附近取樣三次,三次結果⼀致才
視為正確,以避免因頻率漂移造成的取樣錯誤
非同步序列傳輸協定 3/3
5
 RS232C是最早廣泛使用之序列埠標準,傳輸距離約15m
 在USB普及之前,許多周邊裝置(滑鼠、搖桿、條碼機、數據機…)都採
用RS-232C介⾯
 ⼀般使用DB-9端子,其中RXD、TXD及GND為最重要接腳
 傳送資料(Transmitter,Tx)
 接收資料(Receiver,Rx)
 接地(Ground,GND)
RS232標準 1/2
6
DB-9公端子
 RS232電氣訊號為負邏輯
 3V~15V表示0 (Space)
 -3V~-15V表示1 (Mark)
 TTL電氣訊號為正邏輯
 0.8V以下為0
 2.0V以上為1
 Arduino與RS232設備間需加裝訊號轉換元件(如MAX232)
RS232標準 2/2
7
RS232
TTL
15V
-15V
5V
0V
Idle
Idle
 序列埠監控視窗是⼀個透過序列埠和Arduino微控制器溝通的⼯具程式
 選單命令Tools> Serial Monitor
Serial Monitor
8
顯示接收到的訊息
傳輸速率
在此輸入要傳送之訊息 傳送
 Arduino IDE內建處理序列傳輸的Serial程式庫
 Serial.begin(speed)
 啟始序列傳輸,使用預設8n1傳輸格式
 傳輸速率(speed)
300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800,
38400, 57600, 115200
Serial.begin(9600); //設定使用9600bps,8n1傳輸格式
使用Serial函式庫 1/9
9
 Serial.begin(speed, config)
 啟始序列傳輸
 傳輸速率(speed)
300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800,
38400, 57600, 115200
 傳輸格式(config)
SERIAL_5N1、SERIAL_6N1、SERIAL_7N1、SERIAL_8N1 (預設值)、SERIAL_5N2、
SERIAL_6N2、SERIAL_7N2、SERIAL_8N2、SERIAL_5E1、SERIAL_6E1、
SERIAL_7E1、SERIAL_8E1、SERIAL_5E2、SERIAL_6E2、SERIAL_7E2、
SERIAL_8E2、SERIAL_5O1、SERIAL_6O1、SERIAL_7O1、SERIAL_8O1、
SERIAL_5O2、SERIAL_6O2、SERIAL_7O2、SERIAL_8O2
使用Serial函式庫 2/9
10
 Serial.end()
關閉序列傳輸功能,允許RX和TX接腳做為通用輸入和輸出。調用
Serial.begin()可重新啟用序列傳輸
 Serial.available()
傳回序列接收緩衝區(64 bytes)中已收到的位元組數
 Serial.availableForWrite()
傳回還可寫入到序列緩衝區的位元組數
 Serial.find(target_string)
從序列緩衝區讀取資料,直到找到指定字串。 如果找到指定字串,則傳回
true,如果逾時則傳回false
Serial.find("ON");
使用Serial函式庫 3/9
11
 Serial.findUntil(target, terminal)
從序列緩衝區讀取資料,直到找到指定字串或終止字串
Serial.findUntil("ON","#");
 Serial.flush()
等待序列緩衝區資料傳送完畢
 Serial.parseFloat()
解析序列緩衝區資料並回傳第⼀個有效的浮點數值。非數字或減號的字元會
被略過,都找不到時回傳0.00
 Serial.parseInt()
解析序列緩衝區資料並回傳第⼀個有效的整數值。非數字或減號的字元會被
略過,都找不到時回傳0
使用Serial函式庫 4/9
12
 Serial.peek()
讀取序列緩衝區的第⼀個字元,但並不將其從緩衝區中移除。若序列緩衝區
無資料則回傳-1
 Serial.read()
取出序列緩衝區的第⼀個字元。若序列緩衝區無資料則回傳-1
 Serial.readBytes(buffer, length)
從序列埠讀取資料儲存到緩衝區 (字元陣列),若已達指定資料⻑度或超時,
該函數終止
 buffer用來儲存資料之緩衝區 (char[] or byte[])
char buffer[20];
int size = Serial.readBytes(buffer, 20);
buffer[size] ='0';
Serial.println(buffer);
使用Serial函式庫 5/9
13
 Serial.readBytesUntil(character, buffer, length)
從序列埠讀取資料,直到檢測到終止字元或指定位元組數資料已被讀取或逾
時。終止字元並不會儲存到緩衝區
char buffer[20];
if (int size = Serial.readBytesUntil('#', buffer, 20)) {
buffer[size] = '0';
Serial.println(buffer);
}
 Serial.readString()
將序列緩衝區中的資料讀入字串
if (Serial.available()){
String buffer = Serial.readString();
Serial.println(buffer);
}
使用Serial函式庫 6/9
14
 Serial.readStringUntil(terminator)
將序列緩衝區中的資料讀入字串,直到終止字元或逾時
if (Serial.available()){
String cmd = Serial.readStringUntil('#');
Serial.println(cmd);
}
 Serial.setTimeout(milliseconds)
設定讀取序列資料逾時時間,預設為1000毫秒
使用Serial函式庫 7/9
15
 Serial.print(val)
Serial.print(val, format)
將數據轉為字串輸出到序列埠。整數資料可以指定格式,BIN表示2進制,
OCT表示8進制,DEC表示10進制,HEX表示16進制; 浮號數資料可以指定小
數點位數,預設為小數點後兩位
Serial.print(78); //輸出"78"
Serial.print(1.23456); //輸出"1.23"
Serial.print('N'); //輸出"N"
Serial.print("Hello world."); //輸出"Hello world."
Serial.print(78, BIN); //輸出"1001110"
Serial.print(78, OCT); //輸出"116"
Serial.print(78, HEX); //輸出"4E"
Serial.print(1.23456, 0); //輸出"1"
使用Serial函式庫 8/9
16
 Serial.println(val)
Serial.println(val, format)
功能如Serial.print()函式,但會在資料後加上回車字元(ASCII 13, or
'r')及換行字元(ASCII 10, or 'n')
 Serial.write(val)
Serial.write(str)
Serial.write(buf, len)
將二進制數值寫入序列埠。 這些數據以位元組或⼀系列位元組形式發送
Serial.write(45); //輸出'-'
Serial.write("Hello"); //輸出'H','e','l','l','o'
使用Serial函式庫 9/9
17
 實驗目的
 使用Serial Monitor監控開關狀態
 當開關被壓放時,在序列埠監控視窗顯示訊息
Lab 6.1 Serial Monitor監看開關狀態 1/3
18
 參考程式
#define SW 2
boolean lastState = HIGH;
byte click = 0;
void setup() {
pinMode(SW, INPUT_PULLUP);
Serial.begin(9600);
Serial.println("start serial communication");
}
Lab 6.1 Serial Monitor監看開關狀態 2/3
19
void loop() {
boolean b1 = digitalRead(SW); //讀取開關目前狀態
if (b1 != lastState) { //開關狀態改變
delay(20);
boolean b2 = digitalRead(SW);
if (b1 == b2) {
lastState = b1;
click++;
}
}
if (click == 2){ //已壓放一次開關
click = 0;
Serial.println("SW was clicked");
}
}
Lab 6.1 Serial Monitor監看開關狀態 3/3
20
 實驗目的
 使用序列埠傳送字元命令控制LED
 從Serial Monitor送出1時,點亮LED;送出0時,熄滅LED
Lab 6.2使用序列字元命令控制LED 1/3
21
 參考程式
#define LED 3
void setup() {
pinMode(LED, OUTPUT);
Serial.begin(9600);
Serial.println("start serial communication");
}
Lab 6.2使用序列字元命令控制LED 2/3
22
void loop() {
if (Serial.available()){
byte cmd = Serial.read();
if (cmd == '1') { //從序列埠收到'1'
digitalWrite(LED, HIGH);
Serial.println("Turn LED on");
}
if (cmd == '0') { //從序列埠收到'0'
digitalWrite(LED, LOW);
Serial.println("Turn LED off");
}
}
}
Lab 6.2 使用序列字元命令控制LED 3/3
23
 實驗目的
 使用序列埠傳送字串命令控制LED
 從Serial Monitor送出"ON"時,點亮LED;送出"OFF"時,熄滅LED
註:Serial Monitor必須使用No line ending格式
Lab 6.3 使用序列字串命令控制LED 1/3
24
 參考程式
#define LED 3
void setup() {
pinMode(LED, OUTPUT);
Serial.begin(9600);
Serial.println("start serial communication");
}
Lab 6.3 使用序列字串命令控制LED 2/3
25
void loop() {
if (Serial.available()){
String cmd = Serial.readString();
if (cmd == "ON") { //從序列埠收到"ON"
digitalWrite(LED, HIGH);
Serial.println("Turn LED on");
}
if (cmd == "OFF") { //從序列埠收到"OFF"
digitalWrite(LED, LOW);
Serial.println("Turn LED off");
}
}
}
Lab 6.3 使用序列字串命令控制LED 3/3
26
 實驗目的
 自訂格式化命令控制LED,命令格式為"A|D:Pin:Value"
 A表示類比輸出,D表示數位輸出;Pin表示IO腳位編號;Value表示輸
出值
 例如D:4:1表示D4送出⾼電位,A:3:16表示D3送出PWM值16
Lab 6.4 解析格式化命令控制輸出 1/4
27
 參考程式
void setup() {
Serial.begin(9600);
Serial.println("start serial communication");
}
void loop() {
int i1, i2, pin , value;
String msg;
if (Serial.available()){
String cmd = Serial.readString();
i1 = cmd.indexOf(':');
String type = cmd.substring(0, i1);
i2 = cmd.indexOf(':', i1+1);
pin = cmd.substring(i1+1, i2).toInt();
value = cmd.substring(i2+1).toInt();
Lab 6.4 解析格式化命令控制輸出 2/4
28
if (type == "A"){
pinMode(pin, OUTPUT);
analogWrite(pin, value);
msg = "analogWrite(" + String(pin) + ", " + String(value) + ")";
Serial.println(msg);
}
if (type == "D"){
pinMode(pin, OUTPUT);
digitalWrite(pin, value);
msg = "digitalWrite(" + String(pin) + ", " + String(value) + ")";
Serial.println(msg);
}
}
}
Lab 6.4 解析格式化命令控制輸出 3/4
29
Lab 6.4 解析格式化命令控制輸出 4/4

More Related Content

What's hot (20)

PDF
HC 05藍芽模組連線
Chen-Hung Hu
 
PDF
Introducing the Arduino
Charles A B Jr
 
PPTX
PART-2 : Mastering RTOS FreeRTOS and STM32Fx with Debugging
FastBit Embedded Brain Academy
 
PDF
Esd
tausif786
 
PDF
Python程式設計 - 分支作業
吳錫修 (ShyiShiou Wu)
 
PPTX
Lesson sample introduction to arduino
Betsy Eng
 
PPT
Embedded c program and programming structure for beginners
Kamesh Mtec
 
PDF
期末專題報告書
HsuChi Chen
 
PPTX
Pic microcontroller architecture
DominicHendry
 
PDF
FPGA Verilog Processor Design
Archana Udaranga
 
PPT
Introduction to embedded systems
Amr Ali (ISTQB CTAL Full, CSM, ITIL Foundation)
 
PDF
Arduino感測應用
吳錫修 (ShyiShiou Wu)
 
PDF
Arduino簡介
吳錫修 (ShyiShiou Wu)
 
PDF
Modulador de Ancho de Pulso en Fuentes ATX Sdc7500
Juan Carlos Ruiz
 
PPT
Basics of Verilog.ppt
CoEBMSITM
 
PPTX
Allegro PCB教學
Michael Lee
 
PPT
I2C
rchovatiya
 
PDF
Optimized Local I/O ESD Protection for SerDes In Advanced SOI, BiCMOS and Fin...
Sofics
 
PPTX
Introduction to Arduino
Yong Heui Cho
 
PPTX
An Optimized Implementation Of 64-Bit MAC Unit For DSP Applications Using SPST
Patnam Shruthi
 
HC 05藍芽模組連線
Chen-Hung Hu
 
Introducing the Arduino
Charles A B Jr
 
PART-2 : Mastering RTOS FreeRTOS and STM32Fx with Debugging
FastBit Embedded Brain Academy
 
Python程式設計 - 分支作業
吳錫修 (ShyiShiou Wu)
 
Lesson sample introduction to arduino
Betsy Eng
 
Embedded c program and programming structure for beginners
Kamesh Mtec
 
期末專題報告書
HsuChi Chen
 
Pic microcontroller architecture
DominicHendry
 
FPGA Verilog Processor Design
Archana Udaranga
 
Introduction to embedded systems
Amr Ali (ISTQB CTAL Full, CSM, ITIL Foundation)
 
Arduino感測應用
吳錫修 (ShyiShiou Wu)
 
Modulador de Ancho de Pulso en Fuentes ATX Sdc7500
Juan Carlos Ruiz
 
Basics of Verilog.ppt
CoEBMSITM
 
Allegro PCB教學
Michael Lee
 
Optimized Local I/O ESD Protection for SerDes In Advanced SOI, BiCMOS and Fin...
Sofics
 
Introduction to Arduino
Yong Heui Cho
 
An Optimized Implementation Of 64-Bit MAC Unit For DSP Applications Using SPST
Patnam Shruthi
 

Similar to Arduino序列通訊應用 (20)

PDF
Arduino overview
吳錫修 (ShyiShiou Wu)
 
PDF
Arduino overview
吳錫修 (ShyiShiou Wu)
 
PPT
第6章 输入输出技术
jugn
 
PDF
Arduino藍牙傳輸應用
吳錫修 (ShyiShiou Wu)
 
PDF
Arduino Basic
mmiwwcom
 
DOC
嵌入式inux應用專題文件-智慧家庭系統
艾鍗科技
 
PDF
物聯網概論 - Arduino
XianDe Liao
 
PDF
nodeMCU IOT教學03 - NodeMCU導論
吳錫修 (ShyiShiou Wu)
 
PDF
nodeMCU IOT教學03 - NodeMCU導論
吳錫修 (ShyiShiou Wu)
 
PPT
Arduino 與 s4 a
Wayne Huang
 
PPT
第三章Ti msp430平台介紹 v3
冠宇 陳
 
PDF
Arduino應用系統設計 - 導論
吳錫修 (ShyiShiou Wu)
 
PDF
Arduino應用系統設計 - Arduino程式快速入門
吳錫修 (ShyiShiou Wu)
 
PDF
使用 Arduino 控制 ESP8266 的各種方式
Kenson Chiang
 
PDF
Deployment instruction tg4100 f-ig_cn
ahnlabchina
 
PPTX
物聯網技術分享 使用ESP8266
Power Wu
 
PPT
認識 RoBoard 硬體
roboard
 
PDF
Stm32 technical slide_pdf
Anshab Bharakath Ali
 
PDF
项目4-设备指示灯控制.pdf
yangmeng22
 
PDF
项目4-设备指示灯控制.pdf
yangmeng22
 
Arduino overview
吳錫修 (ShyiShiou Wu)
 
Arduino overview
吳錫修 (ShyiShiou Wu)
 
第6章 输入输出技术
jugn
 
Arduino藍牙傳輸應用
吳錫修 (ShyiShiou Wu)
 
Arduino Basic
mmiwwcom
 
嵌入式inux應用專題文件-智慧家庭系統
艾鍗科技
 
物聯網概論 - Arduino
XianDe Liao
 
nodeMCU IOT教學03 - NodeMCU導論
吳錫修 (ShyiShiou Wu)
 
nodeMCU IOT教學03 - NodeMCU導論
吳錫修 (ShyiShiou Wu)
 
Arduino 與 s4 a
Wayne Huang
 
第三章Ti msp430平台介紹 v3
冠宇 陳
 
Arduino應用系統設計 - 導論
吳錫修 (ShyiShiou Wu)
 
Arduino應用系統設計 - Arduino程式快速入門
吳錫修 (ShyiShiou Wu)
 
使用 Arduino 控制 ESP8266 的各種方式
Kenson Chiang
 
Deployment instruction tg4100 f-ig_cn
ahnlabchina
 
物聯網技術分享 使用ESP8266
Power Wu
 
認識 RoBoard 硬體
roboard
 
Stm32 technical slide_pdf
Anshab Bharakath Ali
 
项目4-设备指示灯控制.pdf
yangmeng22
 
项目4-设备指示灯控制.pdf
yangmeng22
 
Ad

More from 吳錫修 (ShyiShiou Wu) (20)

PDF
mbot2.0教學-陀螺儀與三軸加速計應用.pdf
吳錫修 (ShyiShiou Wu)
 
PDF
mbot2.0教學-使用makeblock雲服務.pdf
吳錫修 (ShyiShiou Wu)
 
PDF
mbot2.0教學-局域網路傳輸應用.pdf
吳錫修 (ShyiShiou Wu)
 
PDF
mbot2.0教學-四路顏色感測器應用.pdf
吳錫修 (ShyiShiou Wu)
 
PDF
mbot2.0教學-聲光控制應用.pdf
吳錫修 (ShyiShiou Wu)
 
PDF
mbot2.0教學-光感測器與LED應用.pdf
吳錫修 (ShyiShiou Wu)
 
PDF
mbot2.0教學-超音波感測應用.pdf
吳錫修 (ShyiShiou Wu)
 
PDF
mbot2.0教學-移動控制.pdf
吳錫修 (ShyiShiou Wu)
 
PDF
mbot2.0教學-mblock5開發mBot 2.0應用程式.pdf
吳錫修 (ShyiShiou Wu)
 
PDF
mbot2.0教學-組裝與測試.pdf
吳錫修 (ShyiShiou Wu)
 
PDF
Python元組,字典,集合
吳錫修 (ShyiShiou Wu)
 
PDF
Python函式
吳錫修 (ShyiShiou Wu)
 
PDF
Python串列資料應用
吳錫修 (ShyiShiou Wu)
 
PDF
Python 迴圈作業
吳錫修 (ShyiShiou Wu)
 
PDF
Python分支作業
吳錫修 (ShyiShiou Wu)
 
PDF
Python基本資料運算
吳錫修 (ShyiShiou Wu)
 
PDF
建置Python開發環境
吳錫修 (ShyiShiou Wu)
 
PDF
micro:bit加速度感測應用
吳錫修 (ShyiShiou Wu)
 
PDF
C語言檔案處理
吳錫修 (ShyiShiou Wu)
 
PDF
C語言列舉與聯合
吳錫修 (ShyiShiou Wu)
 
mbot2.0教學-陀螺儀與三軸加速計應用.pdf
吳錫修 (ShyiShiou Wu)
 
mbot2.0教學-使用makeblock雲服務.pdf
吳錫修 (ShyiShiou Wu)
 
mbot2.0教學-局域網路傳輸應用.pdf
吳錫修 (ShyiShiou Wu)
 
mbot2.0教學-四路顏色感測器應用.pdf
吳錫修 (ShyiShiou Wu)
 
mbot2.0教學-聲光控制應用.pdf
吳錫修 (ShyiShiou Wu)
 
mbot2.0教學-光感測器與LED應用.pdf
吳錫修 (ShyiShiou Wu)
 
mbot2.0教學-超音波感測應用.pdf
吳錫修 (ShyiShiou Wu)
 
mbot2.0教學-移動控制.pdf
吳錫修 (ShyiShiou Wu)
 
mbot2.0教學-mblock5開發mBot 2.0應用程式.pdf
吳錫修 (ShyiShiou Wu)
 
mbot2.0教學-組裝與測試.pdf
吳錫修 (ShyiShiou Wu)
 
Python元組,字典,集合
吳錫修 (ShyiShiou Wu)
 
Python串列資料應用
吳錫修 (ShyiShiou Wu)
 
Python 迴圈作業
吳錫修 (ShyiShiou Wu)
 
Python分支作業
吳錫修 (ShyiShiou Wu)
 
Python基本資料運算
吳錫修 (ShyiShiou Wu)
 
建置Python開發環境
吳錫修 (ShyiShiou Wu)
 
micro:bit加速度感測應用
吳錫修 (ShyiShiou Wu)
 
C語言檔案處理
吳錫修 (ShyiShiou Wu)
 
C語言列舉與聯合
吳錫修 (ShyiShiou Wu)
 
Ad

Arduino序列通訊應用