樹莓派串列埠通訊python 樹莓派串列埠通訊設定

2021-10-11 12:51:35 字數 3826 閱讀 9075

實驗環境樹莓派 3b 開發板

2018-06-27-raspbian-stretch 樹莓派作業系統

使用 windows 10 通過網線連線遠端登陸訪問方式控制樹莓派

實驗目的

為了將樹莓派構建成乙個智慧型家居的資料中心,我們需要在樹莓派上連線 zigbee 無線通訊模組,實現與感測器的一對多通訊。

由於 zigbee 使用的是串列埠通訊方式,所以我們需要開啟樹莓派的串列埠功能。由於 3 代的樹莓派板載整合了很多以串列埠作為通訊介面的模組,如藍芽模組、低速 wifi 模組、gps 模組、gprs 模組等。由於板載了藍芽模組,而這個藍芽模組占用了我們板子上的硬體串列埠,所以使得我們的 3 代樹莓派在串列埠的設定上較為麻煩。

3代樹莓派串列埠存在的主要問題

樹莓派從大的方向來說一共出了3代,每一代的cpu外設基本相同,但核心不同,外設裡面一共包含兩個串列埠,乙個稱之為硬體串列埠(/dev/ttyama0),乙個稱之為mini串列埠(/dev/ttys0)。硬體串列埠由硬體實現,有單獨的波特率時鐘源,效能高、可靠,mini串列埠效能低,功能也簡單,並且沒有波特率專用的時鐘源而是由cpu核心時鐘提供,因此mini串列埠有個致命的弱點是:波特率受到核心時鐘的影響。核心若在智慧型調整功耗降低主頻時,相應的這個mini串列埠的波特率便受到牽連了,雖然你可以固定核心的時鐘頻率,但這顯然不符合低碳、節能的口號。在所有的樹莓派板卡中都通過排針將乙個串列埠引出來了,目前除了樹莓派3代以外 ,引出的串列埠預設是cpu的那個硬體串列埠。而在樹莓派3代中,由於板載藍芽模組,因此這個硬體串列埠被預設分配給與藍芽模組通訊了,而把那個mini串列埠預設分配給了排針引出的gpio tx rx,下圖是樹莓派3的介面圖:

其中紅框中就是引出的串列埠io,如果我們需要通過uart外接模組,預設情況下必須得使用效能很低的mini串列埠了,而且隨著核心主頻的變化,還會造成波特率的變化導致通訊的失敗,幾乎很難使用。所以我們希望恢復硬體串列埠與gpio 14/15的對映關係,使得我們能夠通過gpio使用高效能的硬體串列埠來連線我們的串列埠裝置。

確保串列埠功能已經啟用

在進行串列埠模式的修改之前,我們想要確保串列埠的功能已經啟用,在 /boot/config.txt 檔案中進行檢視,是否存在如下語句:

沒有的話,就手動在最後一行新增:

enable_uart=1

重啟裝置,生效。

檢視串列埠別名和硬體串列埠與mini串**換的解決方案

樹莓派可以配置檔案來修改裝置樹,我的理解是可以通過配置檔案來修改管腳的對映關係,這在許多cortex-m3核心的微控制器中也很常見,可以將同乙個串列埠對映到不同的管腳上,以方便pcb的佈線。

為了在樹莓派3中通過gpio使用高效能的硬體串列埠,我們必須將分配給藍芽使用的硬體串列埠與分配給io排針的mini串列埠進行對換,這必然會使得藍芽模組的功能受到影響,但還好,藍芽並不是必須的。

在樹莓派系統的 /boot/overlays/ 目錄下,提供了乙個 pi3-miniuart-bt.dtbo檔案。其檔案作用可以在當前目錄下的 readme 檔案中進行檢視:

readme檔案中說明了這個檔案的功能是將樹莓派3的藍芽切換到mini串列埠(ttys0),並且恢復硬體串列埠(ttyama0)到gpio 14&15腳中。並且給出了載入的方法。

首先在樹莓派命令終端中通過命令檢視樹莓派3當前的串列埠對映關係:

ls -l /dev

紅色框中體現的應該是一種對映關係,此處暫時沒有做深究,簡單理解 serial0 就是gpio對映的串列埠,此時gpio對映的串列埠是預設的 /dev/ttys0這個mini串列埠。

禁用串列埠的控制台功能

前面的步驟已經交換了硬體串列埠與mini串列埠的對映關係,但現在想使用樹莓派外接串列埠模組進行通訊還不行,因為樹莓派io引出的串列埠預設是用來做控制台使用的,它的初衷是為了在沒有網路介面時,通過串列埠對樹莓派進行相關的配置。因此需要禁用這個預設功能,使得串列埠為我們自由使用。

在樹莓派命令視窗中分別通過如下兩個命令停止和禁用串列埠的控制台功能:

sudo systemctl stop [email protected]

sudo systemctl disable [email protected]

sudo vim /boot/cmdline.txt

然後看到裡面類似如下的內容:

然後,我們把紅色方框框起來的那部分刪除即可,得到如下結果:

重啟裝置,生效。

將樹莓派的硬體串列埠與mini串列埠預設對映對換

使用下面這條指令編輯 /boot/config.txt 檔案

sudo vim /boot/config.txt

根據之前在 readme 檔案中得到指示內容在該檔案中增加一行**:

dtoverlay=pi3-miniuart-bt

然後儲存檔案,重啟樹莓派使之生效。

再通過 ls -l /dev 命令檢視修改後的對映關係:

此時,ttyama0串列埠可以正常用於串列埠通訊,ttys0則無法被用於串列埠通訊,藍芽功能失效。

編寫乙個簡單的串列埠程式

wiringpi 實際上不只提供了基本的io口的讀寫函式,還提供了串列埠操作庫函式,引用 "wiringserial.h" 即可使用,仍然使用前面的工程,參考 wiringpi的串列埠例程 ,寫了如下**:

#include #include #include #include #include #include

char uartbuff[100];

int main(void)

int fd;

if ((fd = serialopen("/dev/ttyama0", 115200)) < 0)

fprintf(stderr, "unable to open serial device: %s\n", strerror(errno));

return 1 ;

serialputs(fd, "uart send test, just by launcher\n");

while(1)

uartbuff[0] = serialgetchar(fd);

if (uartbuff[0] > 0)

putchar(uartbuff[0]);

serialputchar(fd,uartbuff[0]);

return 0;

使用 usb 轉 ttl 串列埠模組,usb 端接電腦,ttl 端接樹莓派的 io 口,實物連線圖如下:

執行在樹莓派上編寫完成的串列埠接收和傳送程式,我們在 windows 電腦端的串列埠除錯助手接收到如下資料:

接著,從串列埠助手傳送「hello world!」給樹莓派,樹莓派接收到如下資料,並列印出來:

串列埠助手也同時接收到如下資訊:

至此,證明我們的樹莓派串列埠設定成功。

import serial

import time

ser = serial.serial("/dev/ttyama0", 115200)

def main():

while true:

recv = get_recv()

if recv != none:

print recv

ser.write(recv[0] + "\n")

time.sleep(0.1)

def get_recv():

cout = ser.inwaiting()

if cout != 0:

line = ser.read(cout)

recv = str.split(line)

ser.reset_input_buffer()

return recv

if __name__ == "__main__":

try:

main()

except keyboardinterrupt:

if ser != none:

ser.close()

樹莓派串列埠通訊編碼 樹莓派UDP通訊及串列埠通訊

bin env python import serial import string import time import threading import socket host port 10001 s socket.socket socket.af inet,socket.sock dgram...

樹莓派串列埠通訊 python篇

修改 boot 目錄下的cmdline.txt 修改內容為 dwc otg.lpm enable 0 console tty1 root dev mmcblk0p2 rootfstype ext4 elevator deadline fsck.repair yes rootwait安裝python ...

樹莓派串列埠

串列埠使用例程及說明 pyserial api sudo apt get install python serial python m serial.tools.list ports 此命令可以檢視裝置的檔案節點。class serial.serial init port none,baudrate...