擴展歐幾裡得演算法(Exgcd) 裴蜀定理 對於任意一組整數 \(a,b\),存在一組整數 \(x,y\),滿足 \(ax+by=\gcd(a,b)\)。 Proof: 考慮數學歸納法。 當 \(b=0\) 時,由於 \(\gcd(a,0)=a\),則對於 \(ax+0y=a\) 這個不定方程,\(x ...
目錄
什麼是串口
串口是串列介面的簡稱,這是一個非常大的概念,在嵌入式中串口通常指 UART(Universal Asynchronous Receiver/Transmitter,通用非同步收發器)。使用串口進行的通信叫做串列通信,與之相對的一個概念是並行通信。串列通信是指數據一位一位的按順序傳輸,而並行通信則是多位數據同時傳輸。如下圖所示,DATA BUS
到 UART 1
之間是並行通信,UART 1
到 UART 2
之間是串列通信。
串口通信的數據幀格式如下圖所示,通常一幀共包括 10 位:1 個起始位,8 個數據位和 1 個停止位。有一些特殊的數據幀在停止位前麵包含 1 位的奇偶校驗位,還有的停止位有 2 個比特。其中起始位為低電平(0),標志著數據傳輸的開始;停止位為高電平(1),表示數據幀傳輸結束;數據位則為實際發送的數據,使用高低電平來表示二進位信息,如果發送的內容是文本,那麼這段數據為字元的二進位編碼(ASCII、UTF-8等)。數據傳輸的速率我們使用波特率(Baud Rate)來表示,即每秒鐘傳送的碼元符號的個數。比如數據傳輸速率為 9600 字元/s,那麼這時的波特率為 9600。
設備進行串口通信時,設備的連線如下圖所示,兩個設備的信號線,即發送端(TXD)與接收端(RXD)交叉相連,並且需要共地。在 Raspberry Pi Pico 的引腳上共引出了 2 組串口,即 UART0
與 UART1
。
使用方法
使用 MicroPython 控制 GPIO 要使用 machine
包中的 UART
類。
from machine import UART
通過構造函數實例化獲取串口對象。
UART(id: int, baudrate: int = 115200, ...)
id
指串口的編號。對於 Pico 而言只能是 0 或 1。baudrate
用於設置波特率。tx
、rx
參數指定要使用的 tx、rx 引腳。parity
設置校驗位。None
無,0
偶數,1
奇數。stop
設置停止位的長度。timeout
設置讀取超時時間,單位為毫秒。
使用 init()
方法可以修改串口的設置,方法參數與構造函數的參數一致。常見的用法參考下麵的例子:
uart0 = UART(0, 9600) # 實例化串口 0,波特率為 9600
uart0.init(115200, bits=8, parity=None, stop=1) # 修改串口 0 設置
uart1 = UART(1, baudrate=9600, tx=Pin(8), rx=Pin(9)) # 實例化串口 1 並指定引腳
實例化串口對象後,使用 write(buf: bytearray)
方法發送數據,發送成功會返回位元組數,失敗則返回 None
。
data = b'hello world'
uart0.write(data)
接收數據使用 read(nbytes: Optional[int] = None)
方法,nbytes
設置接收的位元組數,讀取成功會返回一個位元組對象,讀取超時則返回 None
。也可以使用 readline()
方法讀取一行。
data = bytes()
data = uart0.read(10)
print(data.decode('utf-8')) # 解碼成 utf-8 字元串
print(uart0.readline()) # 從串口讀取一行
有些時候需要判斷串口中有沒有數據,可以使用 any()
方法。
while uart0.any() > 0:
print(uart0.readline())