Semorphe

序列埠

讓板子跟電腦說話。 · ⏱ 約 25 分鐘

你會學到三件事

  1. Serial 是板子和電腦之間的一條線
  2. Serial.println 印出去,Serial.read 讀進來
  3. 為什麼一定要先 Serial.begin

開始之前

前兩課的板子只會閃燈,你沒辦法知道它腦袋裡在想什麼。

感測器讀到多少?迴圈跑到第幾圈?看不到。 這一課給你一個窗口,而它也是硬體世界最重要的除錯工具。

🟢 先把編輯器打開,跟著下面一起做:跟著做

一、先開這條線

在 setup 裡把序列埠打開:

1void setup() {2    Serial.begin(9600);3}
9600開啟序列埠 傳輸速率定義函式 回傳型別void(無回傳)setup12

9600 是速度(每秒幾個位元)。板子和電腦兩邊要用同一個數字, 不然收到的會是亂碼。

⚠️ 忘了 Serial.begin 的話,後面的 println 全部沒有反應, 而且不會報錯。這是最常見的第一個坑。

積木盤上這一顆寫著「開啟序列埠 傳輸速率 …」。

二、印出去

要印東西到電腦上,用 Serial.println:

1Serial.println("ready");2Serial.println(42);
"ready"42序列埠輸出小數位數並換行序列埠輸出小數位數並換行12
差別
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}
序列埠可讀的位元組數0>從序列埠讀一個位元組變數n序列埠輸出小數位數並換行宣告int(整數)變數n=如果則定義函式 回傳型別void(無回傳)loop1234

⚠️ 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}
9600"ready"序列埠輸出小數位數並換行開啟序列埠 傳輸速率序列埠可讀的位元組數0>從序列埠讀一個位元組變數n序列埠輸出小數位數並換行宣告int(整數)變數n=如果則定義函式 回傳型別void(無回傳)loop定義函式 回傳型別void(無回傳)setup1263789

換你了

回頭把第 1 課的閃燈加上一行 Serial.println("亮"); 和 Serial.println("暗");,看著文字和燈一起變。

這就是你以後除錯的方式。

到編輯器做這一題:練習:把第 1 課的閃燈加上 Serial.println

做一個

在序列埠監控視窗打 1 就開燈、打 0 就關燈,而且每次都回報現在的狀態。

🔴 這是這一課第一次讓電腦送東西給板子,前面都是板子往外印。 ⚠️ Serial.read() 讀到的是一個字元,而字元 1 不是數字 1。這裡會卡一下。

到編輯器做這一題:做一個:用鍵盤遙控那顆燈

這一課你做了什麼

如果卡住了

你看到 多半是因為
什麼都沒印出來 Serial.begin 漏了
印出來是亂碼 兩邊的速度不一樣(9600 vs 別的)
讀到一堆 -1 沒先問 available()——沒東西可讀時就是 -1
打了 5 讀到 53 read() 拿到的是字元。'5' 這個字元的編號是 53
在編輯器打開這一課 →