編程學習網 > 編程語言 > Python > Python基于pySerial玩轉串口教程
2023
07-28

Python基于pySerial玩轉串口教程

對于嵌入式設備,串口可謂是最常用的接口。在裸機編程中,串口通常用于輸出程序的運行或調試信息;在嵌入式操作系統中,串口通常會作為系統的控制臺接口。如果掌握了Python操作串口的方法,那我們就可以利用Python強大的數據處理能力,快速開發出許多好用的工具。


1、串口的基本操作

在使用 Python 之前,我們先回想一下平時我們是如何使用串口的??偨Y來說,無非就是下面幾個步驟:

① 確定要使用的串口號。

② 配置波特率、數據位、奇偶校驗位、停止位、DTR/DSR、RTS/CTS 和 XON/XOFF。

③ 打開串口。

④ 收發數據。

⑤ 關閉串口。

接下來,我們就來研究下用 Python 怎么實現上面的這些步驟。

2、初識 pySerial

pySerial 是 Python 中用于操作串口的第三方模塊,它支持 Windows、Linux、OSX、BSD等多個平臺。如果要使用 pySerial 模塊,首先必須保證 Python 版本高于 Python 2.7 或者 Python 3.4。另外,如果你是用的是 Windows 系統,那必須使用 Win7 及以上的版本。

pySerial 的安裝很簡單,只需要執行一條命令:pip install pyserial

安裝完成后,只需要在 Python 代碼中使用 import serial 語句導入該模塊即可。

3、列出所有串口設備

import serial
import serial.tools.list_ports

# 獲取所有串口設備實例。
# 如果沒找到串口設備,則輸出:“無串口設備?!?/span>
# 如果找到串口設備,則依次輸出每個設備對應的串口號和描述信息。
ports_list = list(serial.tools.list_ports.comports())
if len(ports_list) <= 0:
    print("無串口設備。")
else:
    print("可用的串口設備如下:")
    for comport in ports_list:
        print(list(comport)[0], list(comport)[1])

運行結果:

可用的串口設備如下:
COM4 藍牙鏈接上的標準串行 (COM4)
COM6 藍牙鏈接上的標準串行 (COM6)
COM5 藍牙鏈接上的標準串行 (COM5)
COM18 Prolific PL2303GT USB Serial COM Port (COM18)
COM17 Prolific USB-to-Serial Comm Port (COM17)
COM3 藍牙鏈接上的標準串行 (COM3)

4、配置串口 & 打開串口

pySerial 配置和打開串口有兩種方式,第一種方式是在調用函數接口打開串口時傳入配置參數,第二種方式是先配置參數,然后再打開串口。這兩種方式操作的效果一樣,此處我們只介紹第一種。

# 方式1:調用函數接口打開串口時傳入配置參數
import serial

ser = serial.Serial("COM17", 115200)    # 打開COM17,將波特率配置為115200,其余參數使用默認值
if ser.isOpen():                        # 判斷串口是否成功打開
    print("打開串口成功。")
else:
    print("打開串口失敗。")# 打開 COM17,將波特率配置為115200,其余參數使用默認值
#ser = serial.Serial("COM17", 115200)

# 輸出串口號
print(ser.name)

在使用 serial.Serial() 創建串口實例時,可以傳入的參數很多,常用的參數如下(默認值用紅色標記):

port - 串口設備名或 None。

baudrate - 波特率,可以是50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 500000, 576000, 921600, 1000000, 1152000, 1500000, 2000000, 2500000, 3000000, 3500000, 4000000。

bytesize - 數據位,可取值為:FIVEBITS, SIXBITS, SEVENBITS, EIGHTBITS。

parity - 校驗位,可取值為:PARITY_NONE, PARITY_EVEN, PARITY_ODD, PARITY_MARK, PARITY_SPACE。

stopbits - 停止位,可取值為:STOPBITS_ONE, STOPBITS_ONE_POINT_FIVE, STOPBITS_TOW。

xonxoff - 軟件流控,可取值為 True, False。

rtscts - 硬件(RTS/CTS)流控,可取值為 True, False。

dsr/dtr - 硬件(DSR/DTR)流控,可取值為 True, False。

timeout - 讀超時時間,可取值為 None, 0 或者其他具體數值(支持小數)。當設置為 None 時,表示阻塞式讀取,一直讀到期望的所有數據才返回;當設置為 0 時,表示非阻塞式讀取,無論讀取到多少數據都立即返回;當設置為其他數值時,表示設置具體的超時時間(以秒為單位),如果在該時間內沒有讀取到所有數據,則直接返回。

write_timeout: 寫超時時間,可取值為 None, 0 或者其他具體數值(支持小數)。參數值起到的效果參考 timeout 參數。

import serial

# 打開 COM17,將波特率配置為115200,
# 數據位為7,停止位為2,無校驗位,
# 讀超時時間為0.5秒。
ser = serial.Serial(port="COM17",
                    baudrate=115200,
                    bytesize=serial.SEVENBITS,
                    parity=serial.PARITY_NONE,
                    stopbits=serial.STOPBITS_TWO,
                    timeout=0.5)

5、關閉串口

關閉串口很簡單,直接調用 close() 方法即可。

import serial

# 打開 COM17,將波特率配置為115200,其余參數使用默認值
ser = serial.Serial("COM17", 115200)   

# 判斷串口是否成功打開
if ser.isOpen():                       
    print("打開串口成功。")
else:
    print("打開串口失敗。")

# 關閉串口
ser.close()

# 判斷串口是否關閉
if ser.isOpen():                        
    print("串口未關閉。")
else:
    print("串口已關閉。")

6、發送數據 write()

關于write() 方法,需要了解如下幾點:

① write() 方法只能發送 bytes 類型的數據,所以需要對字符串進行 encode 編碼。

② write() 方法執行完成后,會將發送的字節數作為返回值。

③ 在打開串口時,可以為 write() 方法配置超時時間。


import serial

# 打開 COM17,將波特率配置為115200.
ser = serial.Serial(port="COM17", baudrate=115200)

# 串口發送 ABCDEFG,并輸出發送的字節數。
write_len = ser.write("ABCDEFG".encode('utf-8'))
print("串口發出{}個字節。".format(write_len))

ser.close()

7、讀取數據 read()

關于 read() 方法,需要了解如下幾點:

① read() 方法默認一次讀取一個字節,可以通過傳入參數指定每次讀取的字節數。

② read() 方法會將讀取的內容作為返回值,類型為 bytes。

③ 在打開串口時,可以為 read() 方法配置超時時間。


import serial

# 打開 COM17,將波特率配置為115200, 讀超時時間為1秒
ser = serial.Serial(port="COM17",
                    baudrate=115200,
                    timeout=1)

# 持續讀取串口輸入,如果讀取到非空字符,則輸出
while True:
    com_input = ser.read(10)
    if com_input:
        print(com_input)

以上就是對 pySerial 模塊使用方法的簡單總結,如果想要了解更多 pySerial 細節,可以參考 pySerial官方文檔。

以上就是Python基于pySerial玩轉串口教程的詳細內容,想要了解更多Python教程歡迎持續關注編程學習網。

掃碼二維碼 獲取免費視頻學習資料

Python編程學習

查 看2022高級編程視頻教程免費獲取