如何用 python 從 UART 讀取訊息?

更新 發佈閱讀 9 分鐘

Let's learn how to read UART by python.

UART 也是一種 Serial 通訊

最近有個測試項目要從產品的 debug port 讀取訊息,產品 debug port 藏在機殼內是 UART 介面,如果想多了解 UART 的基礎知識可以參考 帶你認識物聯網基礎 Serial 通訊(二)-- UART 篇 ,這裏簡單說 UART 跟 RS232/RS485 一樣都是 serial 通訊介面,在 Windows 電腦上以 com port 形式存在,通訊參數設定方式也是一模一樣。

首先在電腦上設定好 com port 通訊參數,就可以用 putty 連線。沒想到連線後後馬上看到不斷噴出的各種 debug 訊息,一噴好幾頁很難一眼就看到想要的訊息,用人工處理效率實在相當糟糕啊。當時我就在想,如果有個小程式可以幫我稍微整理這些 debug 訊息,至少調整下顯示內容應該很不錯。估計用 python 寫個小程式不需要花不了多少時間。

程式功能需求

我希望這隻小程式的基本功能是:

  • 有提供 Serial 通訊參數設定與開啟連線功能
  • 通訊部分可以用正常人類容易使用的 ASCII String 方式來傳輸資料
  • 最好有個簡單濾網功能讓我不必要的訊息排除
  • 整理後要輸出訊息也要打上時間戳記方便追蹤

Python 的 Serial 通訊必要套件是 pyserial,最簡單的方式就是上網找一段 sample code 來改最快。拜豐富網路資源所賜,找到的這個 sample code 完成度相當高,我只需要把執行環境與 pyserial 套件先處理好,然後自己補上濾網功能跟打印時間戳記功能,前後幾分鐘就完成了這個小程式。

接下來,讓我們從程式碼來觀查值得學習或注意的地方,為了保持程式碼的完整性,就用註解來說明吧。

# 首先 pip install 安裝 pyserial 套件
# Python 的強大之處在於大量的軟體應用套件
# Serial 通訊套件沒意外都會選 pyserial
import serial
import time

# 建立 Serial 連線方式是用 pyserial 套件的 Serial 類別
# 生成實例的同時要把對應的通訊參數填上去​
# 不知道怎麼填就去控制台把電腦對應 com 找出來
ser = serial.Serial(
port='COM6',
baudrate=115200,
timeout=1
)

print(f"Opening serial port {ser.name}...")

# 程式運行過程中會宣告很多變數,有 int, float, string..
# 這些變數的目的就是暫存程式碼運行時期的各種資料或運算狀態​
# 這裏宣告變數 input_data 是用來存儲讀進來的內容
# 宣告變數最好加上 type hint 整數用 :int 浮點數用 :float..
# 字串用 :str,一目了然,IDE 也能正確識別物件變數提供操作函數
# 養成隨手用上 type hint 絕對是好習慣,當然也提高程式碼閱讀性
input_data : str = ""

# 變數也可以是複雜的陣列或是 key-value sets
# 這裏我用一個字串陣列來建立訊息濾網,負向表列不想顯示的訊息
# 當然濾網設計也可以用關鍵字或正向表列方式處理,端看需求來調整設計
filter_strings = ["No need to show"]

# 程式碼主體用 try-catch 可以讓程式發生意外發生時可以優雅的崩潰
# 程式碼的語法編寫錯誤編譯階段就可以被查找出來,執行階段就要靠例外處理
# 例如:能不能開啟一個通訊 port;能不能開啟一個要讀寫的檔案
# 這都是程式碼執行到當下才能知道的事​
# 由於 try-catch 會捕捉執行例外與錯誤
# 當例外發生時就會進入各種 exception 來進行處理
# finally 則是無論程式碼是否有例外或錯誤,最後一定都要跑這段 code
try:
# 用 handle ser 打開連線
if ser.isOpen():
# 這裏我利用產品 clear 指令把舊的訊息先清除
# 也順便展示下如何寫入訊息到 serial port
# 字串在前面放個 b 是告訴 python 用 binary 方式處理
# 所謂 binary 就是 010100101 這種二進位的形態
# 為了方便閱讀,基本上都會轉成 16 進位的寫法
# BTW, clear 用 16 進制表示是 63 6c 65 61 72​
ser.writelines(b'clear')
print("Serial port opened successfully.")

# Debug 最主要的目的從 debug console 持續讀取資料
# 要持續讀取資料需要一個無限迴圈
# 每次進入迴圈就讀取一筆資料來進行處理
while True:
# 先把讀回來的資料存放到 input_data 內
input_data = ser.readline().strip().decode('utf-8')
# 接下來跟濾網比對篩選掉不要的訊息,簡單粗暴
if input_data and not filter_strings.__contains__(input_data):
# 通過篩選的資料打上時間戳記輸出
# 字串前面加個 f 代表要格式化輸出
# 可以先用大括號加要輸出的變數組合來排版
print(f"{time.ctime()} > {input_data}")

# 有哪些 exception 或是 error 需要去查閱 user manual
# 就算一時間不知道也沒差,只要補上 exception 就「所有」例外狀況
# 懶人做法是等例外或錯誤發生的時候,有需要再來補就可以了
except serial.SerialException as e:
print(f"Serial port error: {e}")
except KeyboardInterrupt:
print("Exiting program.")
except Exception as e:
print(f"Unknow Excption: {e}")

# 前面提到 finally 是「一定會執行」的程式碼
# 所以當程式正常結束或例外處理完後,就是把連線關閉釋放記憶體
finally:
if ser.isOpen():
ser.close()
print("Serial port closed.")

結論

在測試領域相當重有基本程式設計能力非常重要,畢竟產品需要在測試過程中反覆執行重複動作,例如,用瀏覽器連上機器登入頁面輸入帳密登入系統;每個測試結束後對產品重置恢復原廠設定等等。這些手動測試很花時間更是考驗人性,同樣的動作只要連續做個三次就就令人開始心浮氣燥。所以只要能會一點簡單程式基本功,就可以把這些 routine 測試工作全部自動化,雙手解放後工作效率自然會大幅提升,在測試專業發展上也會比其他人很有優勢。

留言
avatar-img
留言分享你的想法!
avatar-img
Warren Lo的沙龍
24會員
72內容數
WarrenLo's 軟體設計武功祕笈
Warren Lo的沙龍的其他內容
2025/10/04
測試領域大家愛用的程式語言是 python,幾乎都會搭配一個測試框架 ,例如 pytest, IDE 用 Microsoft vscode,考慮團隊共同開發,工作站的作業系統會選 Linux。 如何配置上述條件的 debug 環境來提高開發效率可以分兩個部分來討論
Thumbnail
2025/10/04
測試領域大家愛用的程式語言是 python,幾乎都會搭配一個測試框架 ,例如 pytest, IDE 用 Microsoft vscode,考慮團隊共同開發,工作站的作業系統會選 Linux。 如何配置上述條件的 debug 環境來提高開發效率可以分兩個部分來討論
Thumbnail
2025/05/25
我最近處理很多 Code Review 的活動,來說說自己對 Code Review 的看法。 可以直接去 google 打關鍵字,可以找到這樣的一段話...
Thumbnail
2025/05/25
我最近處理很多 Code Review 的活動,來說說自己對 Code Review 的看法。 可以直接去 google 打關鍵字,可以找到這樣的一段話...
Thumbnail
2025/05/10
前幾天突然想起好多年前到泰國出差的時候,同事看到我在找垃圾桶要做垃圾分類,他突然冒出一句 「Everything’s general」。意思是你不知道怎麼分類就放進一般垃圾就對了,貌似玩笑的一句話其實隱含著軟體抽象設計的道理...
Thumbnail
2025/05/10
前幾天突然想起好多年前到泰國出差的時候,同事看到我在找垃圾桶要做垃圾分類,他突然冒出一句 「Everything’s general」。意思是你不知道怎麼分類就放進一般垃圾就對了,貌似玩笑的一句話其實隱含著軟體抽象設計的道理...
Thumbnail
看更多
你可能也想看
Thumbnail
雙11於許多人而言,不只是單純的折扣狂歡,更是行事曆裡預定的,對美好生活的憧憬。 錢錢沒有不見,它變成了快樂,跟讓臥房、辦公桌、每天早晨的咖啡香升級的樣子! 這次格編突擊辦公室,也邀請 vocus「野格團」創作者分享掀開蝦皮購物車的簾幕,「加入購物車」的瞬間,藏著哪些靈感,或是對美好生活的想像?
Thumbnail
雙11於許多人而言,不只是單純的折扣狂歡,更是行事曆裡預定的,對美好生活的憧憬。 錢錢沒有不見,它變成了快樂,跟讓臥房、辦公桌、每天早晨的咖啡香升級的樣子! 這次格編突擊辦公室,也邀請 vocus「野格團」創作者分享掀開蝦皮購物車的簾幕,「加入購物車」的瞬間,藏著哪些靈感,或是對美好生活的想像?
Thumbnail
雙11購物節準備開跑,蝦皮推出超多優惠,與你分享實際入手的收納好物,包括貨櫃收納箱、真空收納袋、可站立筆袋等,並分享如何利用蝦皮分潤計畫,一邊購物一邊賺取額外收入,讓你買得開心、賺得也開心!
Thumbnail
雙11購物節準備開跑,蝦皮推出超多優惠,與你分享實際入手的收納好物,包括貨櫃收納箱、真空收納袋、可站立筆袋等,並分享如何利用蝦皮分潤計畫,一邊購物一邊賺取額外收入,讓你買得開心、賺得也開心!
Thumbnail
分享個人在新家裝潢後,精選 5 款蝦皮上的實用家居好物,包含客製化層架、MIT 地毯、沙發邊桌、分類垃圾桶及寵物碗架,從尺寸、功能到價格都符合需求,並提供詳細開箱心得與購買建議。
Thumbnail
分享個人在新家裝潢後,精選 5 款蝦皮上的實用家居好物,包含客製化層架、MIT 地毯、沙發邊桌、分類垃圾桶及寵物碗架,從尺寸、功能到價格都符合需求,並提供詳細開箱心得與購買建議。
Thumbnail
本文利用pyqt5,使用pyttsx3將QLineEdit(單行輸入框)的字串,轉成語音呈現出來。
Thumbnail
本文利用pyqt5,使用pyttsx3將QLineEdit(單行輸入框)的字串,轉成語音呈現出來。
Thumbnail
更快、更短、更即時是串流傳輸必要的元素, 而我們常常在使用Python請求API時都是等待式回應, 也就是一個請求過去之後, 待對方處理完畢後再行回應, 但假設需要下載的檔案、內容非常大時, 是不是使用者只能傻傻的等待整個傳輸結束後才能顯示? 這樣的使用者體驗也實在太糟糕了, 對於使用者來說除了完全
Thumbnail
更快、更短、更即時是串流傳輸必要的元素, 而我們常常在使用Python請求API時都是等待式回應, 也就是一個請求過去之後, 待對方處理完畢後再行回應, 但假設需要下載的檔案、內容非常大時, 是不是使用者只能傻傻的等待整個傳輸結束後才能顯示? 這樣的使用者體驗也實在太糟糕了, 對於使用者來說除了完全
Thumbnail
前段時間我們有介紹「【Python 軍火庫🧨 - websockets】雙向溝通的渠道」, 這種方式可以達到基本的連線沒問題,但隨著資安意識的抬頭, 我們的websocket連線也會需要在通道之上進行加密, 那麼我們將根據使用情境來教您如何選用適當的連線。 Server端 我們的Serve
Thumbnail
前段時間我們有介紹「【Python 軍火庫🧨 - websockets】雙向溝通的渠道」, 這種方式可以達到基本的連線沒問題,但隨著資安意識的抬頭, 我們的websocket連線也會需要在通道之上進行加密, 那麼我們將根據使用情境來教您如何選用適當的連線。 Server端 我們的Serve
Thumbnail
本文在介紹如何用Python繪製各點大小不同的散布圖及用箭頭標註特殊點
Thumbnail
本文在介紹如何用Python繪製各點大小不同的散布圖及用箭頭標註特殊點
Thumbnail
本文介紹如何用Python繪製散布圖與迴歸線
Thumbnail
本文介紹如何用Python繪製散布圖與迴歸線
Thumbnail
設計程式來讀取欲傳送訊息之參數txt檔案,再利用程式自動傳出訊息至LINE群組。能簡易使用於任何場合。
Thumbnail
設計程式來讀取欲傳送訊息之參數txt檔案,再利用程式自動傳出訊息至LINE群組。能簡易使用於任何場合。
Thumbnail
我們在 【Python 軍火庫🧨 - websockets】傳送/接收音檔並轉換成numpy(基礎篇) 有聊到要如何透過Websocket來傳送音檔,但上一篇的作法是在Client端就進行音訊的解碼動作,這樣會有一個缺點,假設Client的機器運算效能較差,那麼運算的結果勢必會較慢出現,對於使用者
Thumbnail
我們在 【Python 軍火庫🧨 - websockets】傳送/接收音檔並轉換成numpy(基礎篇) 有聊到要如何透過Websocket來傳送音檔,但上一篇的作法是在Client端就進行音訊的解碼動作,這樣會有一個缺點,假設Client的機器運算效能較差,那麼運算的結果勢必會較慢出現,對於使用者
Thumbnail
關於Websockets的篇章, 有興趣的朋友歡迎參考: 【Python 軍火庫 - websockets】雙向溝通的渠道 【Python 軍火庫 - websockets】用json來溝通吧! 而這一篇章的主題主要是來分享如何透過websockets傳遞音檔並進行解碼, 我們都知道聲
Thumbnail
關於Websockets的篇章, 有興趣的朋友歡迎參考: 【Python 軍火庫 - websockets】雙向溝通的渠道 【Python 軍火庫 - websockets】用json來溝通吧! 而這一篇章的主題主要是來分享如何透過websockets傳遞音檔並進行解碼, 我們都知道聲
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News