有 朋 友 問 ,在 上 傳 Arduino 程 式 時 遇 到 com port 的 問 題 ,問 我 怎 麼 解 決 ?
通 常 在 mBlock / Arduino IDE 見 到 的 錯 誤 訊 息 有 以 下 幾 種 :
1 2 3 |
avrdude: ser_open(): can't open device "COM1" : No such file or directory.
avrdude: ser_open(): can't open device "\\.\COM3": Access is denied.
avrdude: ser_open(): can't open device "\\.\COM3": The semaphore timeout period has expired
|
其 實 mBlock / Arduino IDE 在 上 傳 程 式 時 都 有 幾 個 步 驟 ,依 次 序 是 :
1. 在 電 腦 上 compile program,變 成 一 個 bin 檔 。
2. 將 bin 檔 上 傳 到 Arduino 的 flash memory ( 經 USB 線 )。
3. Arduino 會 reboot,新 程 式 開 始 執 行 。
上 面 那 些 com port 的 問 題 ,都 是 在 第 2 步 時 出 現 的 。好 多 時 朋 友 都 在 問 ,係 唔 係 我 個 乜 乜 sensor 唔 得 ?係 唔 係 sensor 壞 左 ?其 實 程 式 都 未 上 傳 到 去 你 個 Arduino 度 ,所 以 實 在 談 不 上 究 竟 你 的 sensor 有 壞 定 無 壞 。
遇 到 com port 的 error,可 以 嘗 試 以 下 方 法 去 解 決 ( 接 常 見 度 來 排 序 ):
1. 安 裝 Arduino 的 USB driver:
Arduino 主 板 上 面 ,都 會 有 一 粒 USB to Serial port 的 晶 片 ,去 模 擬 一 個 com port 出 來 。如 果 未 安 裝 好 driver,電 腦 上 就 會 見 不 到 正 確 的 com port,於 是 上 傳 時 就 會 發 生 問 題 。
2. 選 擇 正 確 的 com port:
不 管 是 mBlock 還 是 Arduino IDE,你 都 要 自 己 去 選 擇 Arduino 所 連 接 的 com port 的 。如 果 你 的 Arduino 明 明 插 了 在 COM4,你 自 己 卻 選 錯 了 COM1,那 上 傳 時 就 自 然 出 錯 。
3. 選 擇 正 確 的 Arduino 主 板 型 號 :
不 同 的 Arduino 主 板 ,所 使 用 的 通 訊 方 式 並 不 一 樣 ( bootloader 不 一 樣 )。所 以 如 果 你 在 mBlock 或 者 Arduino IDE 選 錯 了 Arduino 主 板 型 號 ,在 上 傳 時 便 會 出 錯 。個 別 型 號 的 主 板 ,例 如 Arduino NANO,更 有 新 舊 不 同 的 bootloader,選 錯 了 亦 會 不 能 上 傳 。
4. com port 被 其 他 程 式 佔 用 :
一 個 com port 同 一 時 間 只 能 被 一 個 程 式 獨 佔 ,所 以 如 果 你 的 com port 被 其 他 程 式 佔 用 時 ,mBlock / Arduino IDE 想 使 用 時 就 會 發 生 錯 誤 。這 很 常 見 於 我 們 打 開 了 Arduino IDE 的 serial monitor 去 除 錯 時 卻 又 忘 記 關 上 ,在 再 次 上 傳 程 式 時 就 會 發 生 錯 誤 。另 外 ,一 些 3D Printer 的 控 制 程 式 或 者 切 片 軟 件 ,也 會 佔 用 com port ( 例 如 CURA )。遇 到 這 種 情 況 一 般 只 要 關 上 佔 用 com port 的 程 式 即 可 。
5. com port 被 其 他 硬 件 佔 用 / 共 用 :
這 常 見 於 使 用 外 置 USB hub 來 連 接 Arduino 的 情 況 。一 般 我 們 都 不 建 設 使 用 外 置 USB hub 來 接 駁 Arduino。如 果 你 的 Arduino 已 經 直 接 插 在 電 腦 上 ,也 可 以 嘗 試 換 另 一 個 USB port 來 試 試 。可 以 的 話 ,最 好 將 Arduino 直 接 插 到 電 腦 主 板 上 的 USB port。
6. 重 啟 電 腦 :
有 時 USB port 會 被 不 明 的 程 式 佔 用 ,也 許 是 某 個 當 掉 了 的 程 式 也 說 不 定 。這 時 重 啟 電 腦 就 可 以 把 被 佔 用 的 USB port 釋 放 出 來 。
7. 沒 有 bootloader 程 式 :
Arduino 的 flash memory 上 有 一 段 小 程 式 ,叫 bootloader,就 是 專 門 用 來 做 USB 上 傳 的 。但 有 極 少 數 的 應 用 ,會 把 bootloader 刪 除 掉 以 增 加 儲 存 空 間 ( 例 如 某 些 3D printer 的 firmware )。缺 失 bootloader 的 Arduino 主 板 ,上 傳 程 式 時 就 會 發 生 錯 誤 。bootloader 可 以 通 過 一 些 特 殊 的 方 法 ( 不 經 USB ) 燒 錄 到 Arduino 主 板 。
8. Digital Pin 0 和 1:
Arduino 的 serial communication 用 的 就 是 Pin 0 和 Pin 1,所 以 它 們 又 叫 RX, TX。所 以 如 果 我 們 把 感 應 器 接 駁 在 Pin 0 和 Pin 1,就 有 機 會 影 響 到 com port 通 訊 ,造 成 不 能 上 傳 的 結 果 。所 以 在 全 世 界 的 Arduino 教 學 ,都 甚 少 有 人 教 你 把 sensor 接 駁 到 Pin 0 和 Pin 1 的 。