More Related Content
Similar to Arduino序列通訊 (15)
More from 吳錫修 (ShyiShiou Wu) (20)
Arduino序列通訊
- 2. Makeeachdaycount
資料是1個bit接著1個bit傳送
每個資料封包 (package) 由起始位元、資料位元、檢查位元及結束位
元組成
在開始傳輸資料之前,Tx與Rx接腳都為⾼電位,要傳送資料時,先送出⼀
個代表「要開始傳送的通知」的起始位元 (start bit,低電位)
每組資料位元 (data bits) ⻑度可以是5~8位元
資料位元之後可以送出⼀個檢查位元
無 (None)
不加檢查位元
非同步序列傳輸協定 1/3
2
- 4. Makeeachdaycount
傳輸協定 (protocol) 代表通訊裝置雙方所遵循的規範和參數,通訊雙
方的設定必須⼀致,才能相互溝通
送收雙方須議定傳輸速率及封包格式
傳輸速率:每秒傳送的位元數 (bit per second,bps),也稱為鮑率 (baud
rate)
取樣
通常是以鮑率的 16 倍頻⼯作,並在中⼼點附近取樣三次,三次結果⼀致
才視為正確
非同步序列傳輸協定 3/3
4
- 8. Makeeachdaycount
Arduino IDE內建處理序列傳輸的Serial程式庫
Serial.begin(speed)
Serial.begin(speed, config)
設定序列傳輸速率,使用預設8n1傳輸格式
傳輸格式常數:
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.begin(9600); //設定使用9600bps,8n1傳輸格式
使用Serial程式庫 1/8
8
- 10. Makeeachdaycount
Serial.findUntil(target, terminal)
從序列緩衝區讀取資料,直到找到指定字串或終止字串
Serial.findUntil("ON","#");
Serial.flush()
等待序列緩衝區資料傳送完畢
Serial.parseFloat()
解析序列緩衝區資料並回傳第⼀個有效的浮點數值。非數字或減號的字元
會被略過,都找不到時回傳0.00
Serial.parseFloat()
解析序列緩衝區資料並回傳第⼀個有效的整數值。非數字或減號的字元會
被略過,都找不到時回傳0
使用Serial程式庫 3/8
10
- 12. Makeeachdaycount
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程式庫 5/8
12
- 14. Makeeachdaycount
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程式庫 7/8
14
- 17. Makeeachdaycount
參考程式
#define SW = 2
boolean lastState = HIGH;
byte click = 0;
void setup() {
pinMode(SW, INPUT_PULLUP);
Serial.begin(9600);
Serial.println("start serial communication");
}
Lab 序列埠監控視窗顯示開關狀態 2/3
17
- 18. Makeeachdaycount
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 序列埠監控視窗顯示開關狀態 3/3
18
- 21. Makeeachdaycount
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 使用序列字元命令控制LED 3/3
21
- 24. Makeeachdaycount
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 使用序列字串命令控制LED 3/3
24