樹莓派4B GPIO 串列埠通訊設定(3B+通用)

樹莓派最大的魅力就是介面豐富,藉助這些開放的介面,可以實現很多好玩又實用的功能,比如透過介面控制電機實現智慧小車的動力控制、透過介面控制LED燈珠亮滅給心上人制造IT男獨有的浪漫等等。

同時我們也將樹莓派用在了一系列智慧化改造的專案中,透過樹莓派的GPIO進行串列埠通訊,控制智慧電量表、水錶、電子閥門等工業裝置,將傳統工業裝置管理升級改造為智慧化工業物聯網裝置管理。這裡先給大家介紹一下開啟樹莓派串列埠的設定步驟。然後會另起一篇文章,以專案例項的形式透過控制電量表來了解樹莓派串列埠通訊在專案中的應用。

注:文章中的樹莓派串列埠設定,預設使用的是官方系統。第三方系統的串列埠設定請大家結合這篇文章按第三方系統引數說明自行測試。

基本介紹:

樹莓派3/4B有兩個串列埠,分別為“硬體串列埠”

/dev/ttyAMA0

和“mini串列埠”

/dev/ttyS0

。“硬體串列埠”有單獨的波特率時鐘源,效能高、可靠,“mini串列埠”效能低,功能也簡單,並且沒有波特率專用的時鐘源而是由CPU核心時鐘提供,因此“mini串列埠”有個致命的弱點是:波特率受到核心時鐘的影響,核心若在智慧調整功耗降低主頻時,相應的這個mini串列埠的波特率便受到牽連。

其實這裡說的時鐘的影響對我來說太高深了,對此真的是沒有太多的認知,只是查詢的相關資料中是這麼描述的。那麼個人的理解是“硬體串列埠”是全功能的,而“mini串列埠”則是閹割過的。

在實際專案中遇到的問題是,如果使用“mini串列埠”

/dev/ttyS0

,在通訊需要奇偶校驗時會報錯。所以專案中為了穩定還是推薦使用“硬體串列埠”

/dev/ttyAMA0

在樹莓派3/4B中,由於板載藍芽模組,因此這個“硬體串列埠”被預設分配給與藍芽模組通訊了,而把“mini串列埠”預設分配給了排針引出的GPIO Tx Rx。在開啟串列埠通訊不做任何設定的時候,預設的串列埠通訊使用的是“mini串列埠”。如果要在專案中使用,為了通訊穩定,需要進行“硬體串列埠”與“mini串列埠”預設對映對換,把“硬體串列埠”

/dev/ttyAMA0

對映分配給GPIO的Tx Rx。

樹莓派4B GPIO 串列埠通訊設定(3B+通用)

GPIO的對照表,Tx Rx的BCM編碼為14 15

設定步驟

1。啟動串列埠

先檢視一下串列埠啟動的情況:

ls -l /dev

如果沒配置過串列埠,那麼正常情況應該會得到下面的結果:

。。。crw-rw—— 1 root video 237, 0 1月 15 15:17 rpivid-vp9memlrwxrwxrwx 1 root root 7 1月 15 15:17 serial1 -> ttyAMA0drwxrwxrwt 2 root root 40 2月 14 2019 shm。。。

只有serial1 -> ttyAMA0,沒有看到ttyS0的相關對映。之所以在沒有開啟串列埠的時候能看到ttyAMA0的對映,就是上面講過的,樹莓派3/4B將ttyAMA0預設用於板載藍芽通訊。

啟動串列埠:

修改系統配置檔案/boot/config。txt

sudo vi /boot/config。txt

在配置檔案中新增:

#ENABLE UARTenable_uart=1

重啟樹莓派

sudo reboot

啟動起來以後,再檢視一下串列埠啟動情況

ls -l /dev

結果如下:

。。。crw-rw—— 1 root video 238, 0 1月 15 15:17 rpivid-vp9memlrwxrwxrwx 1 root root 7 1月 15 15:17 serial0 -> ttyS0lrwxrwxrwx 1 root root 5 1月 15 15:17 serial1 -> ttyAMA0drwxrwxrwt 2 root root 40 2月 14 2019 shm。。。

在設定中啟用串列埠後,會發現 /dev目錄下變成了兩個: serial0 -> ttyS0 和 serial1 ->ttyAMA0,這就是開啟成功了。

2。禁用藍芽(硬體串列埠與mini串列埠對映對換)

因為藍芽也使用硬體串列埠,所以我們在 /boot/config。txt裡面加上 dtoverlay=pi3-disable-bt ,ttyAMA0 得以釋放,這時候樹莓派也自動交換了ttyAMA0和ttyS0,把serial0 分配給了 ttyAMA0 。

對映對換的目的是將硬體串列埠作用在GPIO介面的Tx Rx上。我的專案上沒有用到藍芽通訊,所以禁用藍芽後也沒有再次開啟,也沒有測試再次開啟藍芽通訊是否正常,如果專案中有用到藍芽通訊,那麼進行這一步的時候要謹慎。

修改系統配置檔案/boot/config。txt

sudo vi /boot/config。txt

在檔案中新增:

dtoverlay=pi3-disable-bt

這裡有個坑要注意一下:樹莓派4B的引數值也是pi3-disable-bt。別問為什麼,我也不知道。。。一開始查資料都是關於樹莓派3的設定,於是想當然地在樹莓派4B上就用pi4-disable-bt,結果不行。折騰了好幾個小時,抱著試試看的心態,把pi4改成pi3後成功了。

重啟樹莓派

sudo reboot

檢視一下串列埠狀態,看看ttyAMA0和ttyS0的對映是否對調

ls -l /dev

可以看到結果中,ttyAMA0和ttyS0的對映對調了

。。。crw-rw—— 1 root video 238, 0 1月 15 15:17 rpivid-vp9memlrwxrwxrwx 1 root root 7 1月 15 15:17 serial0 -> ttyAMA0lrwxrwxrwx 1 root root 5 1月 15 15:17 serial1 -> ttyS0drwxrwxrwt 2 root root 40 2月 14 2019 shm。。。

3。禁用串列埠控制檯功能

樹莓派預設將IO引出的串列埠用作於控制檯使用,在沒有網路的時候,可以透過串列埠對樹莓派進行控制管理

所以經過前面的步驟做好串列埠對映交換後,還是不能正常地使用串列埠模組進行通訊。需要禁用串列埠控制檯功能,使串列埠為我們自由使用。

分別透過如下兩個命令停止和禁用串列埠的控制檯功能。(由於我們前面已經交換了串列埠的對映關係,因此這裡注意是ttyAMA0。)

sudo systemctl stop serial-getty@ttyAMA0。servicesudo systemctl disable serial-getty@ttyAMA0。service

最後還需要刪除一個東西:

sudo vi /boot/cmdline。txt

在開啟的檔案中刪去或註釋掉

console=serial0,115200

這樣樹莓派的串列埠就設定好了,可以透過串列埠進行通訊收發訊息了。

測試通訊示例程式碼

這裡給出一個小的測試示例,來測試串列埠通訊。下一篇文章會詳細寫一下通訊示例和詳細的測試過程。 示例是Python寫的,如果沒有serial庫,要安裝一下

sudo apt-get install python-serial

程式碼:

# -*- coding:utf-8 -*-import RPi。GPIO as GPIOimport serialser = serial。Serial(“/dev/ttyAMA0”,9600,timeout=1)ser。parity = serial。PARITY_EVEN # 奇偶校驗設定,在沒有交換埠的時候,這裡就是錯誤產生的地方print(ser。portstr)command = “hello world”print(“send:” + command)len = ser。write(command。encode()) print(“len = ” + str(len))print(“You can always send data, press Ctrl + C to exit”)while 1: # strInput = raw_input(‘enter some words:’) # python2。7的互動方式 strInput = input(‘enter some words:’) ser。write(strInput。encode())ser。flush()

以上就是樹莓派3/4B串列埠的全部設定過程,在專案中實際遇到了不少坑後總結出來的。我會盡快更新一篇串列埠使用實戰,把用到的裝置,開發程式碼,踩過的坑都會詳細講一下,希望大家喜歡。

最後,大家覺得有用就點個關注唄:)