使用Python玩轉(zhuǎn)串口(基于pySerial問題)
引言
對于嵌入式設備,串口可謂是最常用的接口。在裸機編程中,串口通常用于輸出程序的運行或調(diào)試信息;在嵌入式操作系統(tǒng)中,串口通常會作為系統(tǒng)的控制臺接口。
如果掌握了Python操作串口的方法,那我們就可以利用Python強大的數(shù)據(jù)處理能力,快速開發(fā)出許多好用的工具。
串口的基本操作
在使用 Python 之前,我們先回想一下平時我們是如何使用串口的。
總結(jié)來說,無非就是下面幾個步驟:
首先,我們需要確定要使用的串口號。
其次,配置波特率、數(shù)據(jù)位、奇偶校驗位、停止位、DTR/DSR、RTS/CTS 和 XON/XOFF。
第三,打開串口。
第四,收發(fā)數(shù)據(jù)。
第五,關閉串口。
接下來,我們就來研究下用 Python 怎么實現(xiàn)上面的這些步驟。
初識 pySerial
pySerial 是 Python 中用于操作串口的第三方模塊,它支持 Windows、Linux、OSX、BSD等多個平臺。
如果要使用 pySerial 模塊,首先必須保證 Python 版本高于 Python 2.7 或者 Python 3.4。
另外,如果你是用的是 Windows 系統(tǒng),那必須使用 Win7 及以上的版本。
pySerial 的安裝很簡單,只需要執(zhí)行一條命令:pip install pyserial安裝完成后,只需要在 Python 代碼中使用 import serial 語句導入該模塊即可。
確定串口號
import serial import serial.tools.list_ports # 獲取所有串口設備實例。 # 如果沒找到串口設備,則輸出:“無串口設備?!? # 如果找到串口設備,則依次輸出每個設備對應的串口號和描述信息。 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])
運行結(jié)果:
可用的串口設備如下:
COM4 藍牙鏈接上的標準串行 (COM4)
COM6 藍牙鏈接上的標準串行 (COM6)
COM5 藍牙鏈接上的標準串行 (COM5)
COM18 Prolific PL2303GT USB Serial COM Port (COM18)
COM17 Prolific USB-to-Serial Comm Port (COM17)
COM3 藍牙鏈接上的標準串行 (COM3)
配置串口 & 打開串口
pySerial 配置和打開串口有兩種方式:
- 第一種方式是在調(diào)用函數(shù)接口打開串口時傳入配置參數(shù)
- 第二種方式是先配置參數(shù),然后再打開串口
這兩種方式操作的效果一樣,此處我們只介紹第一種。
# 方式1:調(diào)用函數(shù)接口打開串口時傳入配置參數(shù) import serial ser = serial.Serial("COM17", 115200) # 打開COM17,將波特率配置為115200,其余參數(shù)使用默認值 if ser.isOpen(): # 判斷串口是否成功打開 print("打開串口成功。") print(ser.name) # 輸出串口號 else: print("打開串口失敗。")
在使用 serial.Serial() 創(chuàng)建串口實例時,可以傳入的參數(shù)很多,常用的參數(shù)如下(默認值用紅色標記):
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
- 數(shù)據(jù)位,可取值為: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 或者其他具體數(shù)值(支持小數(shù))。當設置為 None 時,表示阻塞式讀取,一直讀到期望的所有數(shù)據(jù)才返回;當設置為 0 時,表示非阻塞式讀取,無論讀取到多少數(shù)據(jù)都立即返回;當設置為其他數(shù)值時,表示設置具體的超時時間(以秒為單位),如果在該時間內(nèi)沒有讀取到所有數(shù)據(jù),則直接返回。write_timeout
: 寫超時時間,可取值為 None, 0 或者其他具體數(shù)值(支持小數(shù))。參數(shù)值起到的效果參考 timeout 參數(shù)。
import serial # 打開 COM17,將波特率配置為115200,數(shù)據(jù)位為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)
關閉串口
關閉串口很簡單,直接調(diào)用 close() 方法即可。
import serial ser = serial.Serial("COM17", 115200) # 打開 COM17,將波特率配置為115200,其余參數(shù)使用默認值 if ser.isOpen(): # 判斷串口是否成功打開 print("打開串口成功。") else: print("打開串口失敗。") ser.close() if ser.isOpen(): # 判斷串口是否關閉 print("串口未關閉。") else: print("串口已關閉。")
發(fā)送數(shù)據(jù) write()
關于write() 方法,需要了解如下幾點:
① write() 方法只能發(fā)送 bytes 類型的數(shù)據(jù),所以需要對字符串進行 encode 編碼。
② write() 方法執(zhí)行完成后,會將發(fā)送的字節(jié)數(shù)作為返回值。
③ 在打開串口時,可以為 write() 方法配置超時時間
import serial # 打開 COM17,將波特率配置為115200. ser = serial.Serial(port="COM17", baudrate=115200) # 串口發(fā)送 ABCDEFG,并輸出發(fā)送的字節(jié)數(shù)。 write_len = ser.write("ABCDEFG".encode('utf-8')) print("串口發(fā)出{}個字節(jié)。".format(write_len)) ser.close()
讀取數(shù)據(jù) read()
關于 read() 方法,需要了解如下幾點:
① read() 方法默認一次讀取一個字節(jié),可以通過傳入?yún)?shù)指定每次讀取的字節(jié)數(shù)。
② read() 方法會將讀取的內(nèi)容作為返回值,類型為 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: # 如果讀取結(jié)果非空,則輸出 print(com_input) ser.close()
總結(jié)
以上就是對 pySerial 模塊使用方法的簡單總結(jié),如果想要了解更多 pySerial 細節(jié),可以參考 pySerial官方文檔。
這些僅為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Python?pydash庫處理大規(guī)模數(shù)據(jù)集執(zhí)行復雜操作
在數(shù)據(jù)處理和分析領域,Python一直是一種強大的編程語言,然而,在處理大規(guī)模數(shù)據(jù)集和執(zhí)行復雜操作時,有時候需要更高效的工具,在本文中,我們將深入探討pydash庫,這是一個專注于提高Python代碼性能的工具2023-12-12Python實現(xiàn)定期檢查源目錄與備份目錄的差異并進行備份功能示例
這篇文章主要介紹了Python實現(xiàn)定期檢查源目錄與備份目錄的差異并進行備份功能,涉及Python基于filecmp模塊的文件比較及讀寫等相關操作技巧,需要的朋友可以參考下2019-02-02python實現(xiàn)的udp協(xié)議Server和Client代碼實例
這篇文章主要介紹了python實現(xiàn)的udp協(xié)議Server和Client代碼實例,需要的朋友可以參考下2014-06-06python二分法查找算法實現(xiàn)方法【遞歸與非遞歸】
這篇文章主要介紹了python二分法查找算法實現(xiàn)方法,結(jié)合實例形式分析了Python使用遞歸與非遞歸算法實現(xiàn)二分查找的相關操作技巧,需要的朋友可以參考下2019-12-12