
串口通信避坑指南樹莓派與STM32 的數據交互實戰近些日子有個智能小車方面的項目, 這里需要將樹莓派跟那種STM32利用串口展開交流。原本以為這不過是輕松搞定的連線, 以及簡簡單單書寫好幾行代碼的事兒, 然而實際遭遇的麻煩遠比設想的多好多。先是樹莓派的串口怎么都沒辦法開啟, 接著又是STM32接收數據出現亂碼的狀況, 而后還有兩邊通信協議相互不匹配的問題, 差不多把所有可能碰到的陷阱問題整個體驗一番了。這篇章體內容就是專注去梳理整合這些遭遇麻煩的經歷以及對應的解決辦法, 期望能夠給予那些正忙于嘗試樹莓派跟嵌入式設備進行通信事宜的友人們提供一定程度的助力幫助。串口通信看上去好像很古老, 然而在嵌入式跟單板計算機共同協作工作的情景當中, 它依舊是最為直接、最為可靠的通信方式當中的一種。不存在繁雜的網絡協議棧, 不存在驅動兼容性方面的問題, 僅僅將幾根線連接在一起數據便能夠開始流動起來。可是, 這種所謂的“簡單”背后隱藏著相當多的細節, 像電平匹配、波特率校準、數據幀解析、流控制等, 只要任何一個環節出現問題, 通信就會遭遇失敗。尤其是在你將具備完整Linux系統運行環境的樹莓派與資源存在限制情形的STM32單片機放置到一起的時候, 這兩者之間的編程模型乃是不同的, 其系統時序情形亦不一樣, 再者調試手段方面的差異著實巨大, 如此一來便更加要求有一套清晰的實踐予以實施辦法來能夠規避風險了。本文會從實際項目著手, 不但會告知你怎樣使樹莓派與STM32成功實現通信, 甚至還會深入探究那些易被忽視的細節: 一、樹莓派的/dev/為何有時會“不見”? 二、STM32中斷接收數據為何會出現丟包情況? 三、怎樣設計一個既簡單又穩健的通信協議去處理粘包及錯誤? 我們會把作為樹莓派端的主要工具, 聯合具體的代碼示例以及調試技巧, 使你在動手進行實踐時避開那些令我熬夜調試的“大坑”。1. 環境準備與硬件連接從混亂到有序在著手寫代碼起始之時, 準確無誤的硬件連接以及軟件環境乃是成功得以實現的根基所在。要是在這一極為關鍵緊要的步驟當中有所疏忽大意, 那么后續開展的所有調試工作極有可能是在錯誤的導向路徑之上無謂地損耗時間, 白費精力, 徒勞無功。1.1 硬件連線不僅僅是TX接RX在樹莓派以4B作為示例的GPIO各個引腳當中 的 GPIO的 以4B為例 物理引腳8/TXD以及 還有物理這個引腳10/RXD便是 是默認的 屬于那種硬件串口比如說UART的引腳。到了STM32開發板以常見的逐飛科技核心板當作例子這里 其串口引腳就得 需要去查看原理圖 一般來說通常都是 某一個USART里面的TX和RX引腳 就像比如說和 這樣。注意, 最基礎的連接原則乃是交叉連接, 即樹莓派的TXD要去接STM32的RXD, 樹莓派的RXD則須接STM32的TXD。除此之外, 一定要連接兩者的GND, 也就是地線, 以此為信號提供共同的參考電平, 而這可是很多初學者容易忽略進而導致通信不穩定的關鍵所在。然而, 僅僅把這三根線連接起來, 也就是TXD, RXD, GND, 這或許還不行。要是你的通信距離在較長的范圍, 也就是超過1米, 或者所處環境干擾比較大這樣的情況下, 那就得考慮去添加電平轉換了。樹莓派的GPIO是3.3V電平, 而好多STM32開發板盡管同樣是3.3V, 可是有些模塊或者轉換芯片有可能是5V。直接將3.3V和5V設備連接起來, 就有可能會損壞樹莓派。穩妥的舉措是用到一個3.3V/5V雙向電平轉換模塊, 比如等等, 或者去確認你的STM32板載IO電平同樣是3.3V。一個清晰的連接對照表能幫你快速排查硬件問題設備端信號線連接目標引腳說明電壓樹莓派 4BTXD ()STM32 RXD物理引腳 83.3V樹莓派 4BRXD ()STM32 TXD物理引腳 103.3V樹莓派 4BGNDSTM32 GND物理引腳 6 (或其他GND)0VSTM32TXD (如 PA9)樹莓派 RXD3.3VSTM32RXD (如 PA10)樹莓派 TXD3.3V1.2 樹莓派串口配置解開系統“占用鎖”樹莓派原本默認的那個硬件串口, 也就是/dev/的那個, 被分配給了藍牙模塊, 與此同時, 另一個迷你串口, 即/dev/ttyS0, 被分配給了GPIO引腳。為了能夠獲得穩定的、高性能的通信, 我們需要進行交換。把它們交換一下, 并且將硬件串口釋放出來。起先, 借助SSH要么直接連接終端至樹莓派, 運用raspi-工具予以配置。sudo raspi-config在界面中依次選擇當被問到“Would you like a login shell to be over?”的時候, 要選擇No, 這一點是很重要的哦, 不然的話串口就會被登錄終端給占用啦。當被問到“Would you like the port to be?”的時候, 要選擇Yes。接下來需要編輯引導配置文件確保硬件UART被正確啟用sudo nano /boot/config.txt在文件末尾添加或修改以下兩行enable_uart1 dtoverlaydisable-bt讓第一行去強制性地啟用UART, 將第二行用于禁用藍牙從而去釋放硬件串口, 進行保存并且退出CtrlX, 接著是Y, 隨后回車, 重新啟動一下樹莓派來令更改產生效果。將其重新啟動之后, 對串口設備展開驗證。去執行 ls -l /dev/* 這個操作, 你理應能夠看到類似于以下這般的輸出結果:/dev/serial0 - ttyAMA0 /dev/serial1 - ttyS0這意味著, /dev/區域也即我們這些GPIO引腳所對應的串口, 此刻已然指向了硬件串口, 你能夠借助這個終端工具來開展快速測試。sudo apt-get install minicom -y sudo minicom -b 115200 -o -D /dev/ttyAMA0要是呈現出界面并且不存在錯誤, 那就表明串口設備已然就緒。按下CtrlA, 接著按下X從而退出。1.3 環境與庫安裝樹莓派通常預裝了。我們使用pip來安裝功能強大的庫sudo pip3 install pyserial在完成安裝之后, 能夠去撰寫一個最為簡單的測試腳本.py, 以此來檢驗庫是否工作處于正常狀態:import serial try: # 嘗試打開串口不進行實際通信 ser serial.Serial(/dev/ttyAMA0, 115200, timeout1) print(f串口 {ser.port} 打開成功配置為{ser}) ser.close() print(串口已關閉。) except serial.SerialException as e: print(f打開串口失敗{e})執行.py, 要是瞅見成功開啟的訊息, 那就表明串口環境已準備妥當。2. 樹莓派端串口編程核心技巧掌握了基礎環境我們來深入的庫。它雖然接口簡單但