序列埠
讓板子跟電腦說話。 · ⏱ 約 25 分鐘
你會學到三件事
Serial 是板子和電腦之間的一條線
Serial.println 印出去,Serial.read 讀進來
- 為什麼一定要先
Serial.begin
開始之前
前兩課的板子只會閃燈,你沒辦法知道它腦袋裡在想什麼。
感測器讀到多少?迴圈跑到第幾圈?看不到。
這一課給你一個窗口,而它也是硬體世界最重要的除錯工具。
🟢 先把編輯器打開,跟著下面一起做:跟著做
一、先開這條線
在 setup 裡把序列埠打開:
1void setup() {2 Serial.begin(9600);3}
9600 是速度(每秒幾個位元)。板子和電腦兩邊要用同一個數字,
不然收到的會是亂碼。
⚠️ 忘了 Serial.begin 的話,後面的 println 全部沒有反應,
而且不會報錯。這是最常見的第一個坑。
積木盤上這一顆寫著「開啟序列埠 傳輸速率 …」。
二、印出去
要印東西到電腦上,用 Serial.println:
1Serial.println("ready");2Serial.println(42);
|
差別 |
Serial.print(x) |
印出去,不換行 |
Serial.println(x) |
印出去,換行(ln = line) |
和 cout 一樣,數字和文字都印得出來。
積木上它寫著「序列埠輸出 …」,而還有一格「小數位數」
——印小數的時候用得上。
「印一行看看現在的值是多少」——這是硬體除錯的第一招,
而且大部分時候它就夠了。
三、讀進來
這兩顆在積木上寫著「序列埠可讀的位元組數」
與「從序列埠讀一個位元組」——名字就是它們做的事。
要接電腦打過來的東西,先問「有沒有」再讀:
1void loop() {2 if (Serial.available() > 0) {3 int n = Serial.read();4 Serial.println(n);5 }6}
⚠️ Serial.read() 之前一定要先問 Serial.available()。
因為 loop 每秒跑幾萬次,而人打字很慢。
大部分時候根本沒有東西可讀,這時 read() 會拿到一個沒有意義的值。
|
意思 |
Serial.available() |
現在有幾個字元在等著被讀 |
Serial.read() |
讀走一個 |
「先問有沒有,再去拿」,這個形狀在所有輸入裝置上都會遇到。
完成的樣子
這一課的參考做法——程式碼每一行的號碼,就印在對應的那塊積木上。
1void setup() {2 Serial.begin(9600);3 Serial.println("ready");4}5 6void loop() {7 if (Serial.available() > 0) {8 int n = Serial.read();9 Serial.println(n);10 }11}
換你了
回頭把第 1 課的閃燈加上一行 Serial.println("亮"); 和
Serial.println("暗");,看著文字和燈一起變。
這就是你以後除錯的方式。
到編輯器做這一題:練習:把第 1 課的閃燈加上 Serial.println
做一個
在序列埠監控視窗打 1 就開燈、打 0 就關燈,而且每次都回報現在的狀態。
🔴 這是這一課第一次讓電腦送東西給板子,前面都是板子往外印。
⚠️ Serial.read() 讀到的是一個字元,而字元 1 不是數字 1。這裡會卡一下。
到編輯器做這一題:做一個:用鍵盤遙控那顆燈
這一課你做了什麼
- 你用
Serial.begin 開了板子和電腦之間的線
- 你用
println 把板子裡的值印出來看
- 你知道讀之前要先問
available()
如果卡住了
| 你看到 |
多半是因為 |
| 什麼都沒印出來 |
Serial.begin 漏了 |
| 印出來是亂碼 |
兩邊的速度不一樣(9600 vs 別的) |
讀到一堆 -1 |
沒先問 available()——沒東西可讀時就是 -1 |
打了 5 讀到 53 |
read() 拿到的是字元。'5' 這個字元的編號是 53 |
在編輯器打開這一課 →