python serial模塊使用方法
在Python中實(shí)現(xiàn)串口通信,最常用且功能強(qiáng)大的庫(kù)是 pySerial(通常通過 import serial 導(dǎo)入)
。它支持跨平臺(tái)操作(Windows、Linux、macOS),提供了完整的串口訪問功能。
一、核心步驟與基礎(chǔ)代碼
實(shí)現(xiàn)串口通信通常遵循以下步驟:
安裝 pySerial 使用 pip 安裝:
pip install pyserial
導(dǎo)入庫(kù)并打開串口 導(dǎo)入庫(kù)后,通過 serial.Serial() 創(chuàng)建并打開串口連接。關(guān)鍵參數(shù)包括端口號(hào)(port)和波特率(baudrate)。
import serial
# 基礎(chǔ)示例:打開 COM3,波特率 9600
ser = serial.Serial('COM3', 9600)更完整的參數(shù)配置示例如下:
ser = serial.Serial(
port='COM3', # Windows端口,Linux下如 '/dev/ttyUSB0'
baudrate=9600, # 波特率
bytesize=serial.EIGHTBITS, # 數(shù)據(jù)位,默認(rèn)為8
parity=serial.PARITY_NONE, # 校驗(yàn)位,默認(rèn)為無
stopbits=serial.STOPBITS_ONE, # 停止位,默認(rèn)為1
timeout=1 # 讀超時(shí)時(shí)間(秒),None為阻塞讀取,0為非阻塞
)讀寫數(shù)據(jù)
發(fā)送數(shù)據(jù):使用 write() 方法,參數(shù)必須是字節(jié)(bytes)類型。
ser.write(b'Hello, World!') # 發(fā)送字節(jié)數(shù)據(jù)
ser.write("Hello\r\n".encode('utf-8')) # 將字符串編碼為字節(jié)后發(fā)送讀取數(shù)據(jù):常用 read()、readline() 或檢查 in_waiting 屬性。
data = ser.read(10) # 讀取10個(gè)字節(jié) line = ser.readline() # 讀取一行,直到換行符 bytes_waiting = ser.in_waiting # 獲取接收緩沖區(qū)中的字節(jié)數(shù)
關(guān)閉串口 操作完成后,務(wù)必關(guān)閉串口以釋放系統(tǒng)資源。
ser.close()
二、實(shí)用技巧與進(jìn)階操作
自動(dòng)檢測(cè)可用串口 在不確定端口號(hào)時(shí),可以自動(dòng)列出所有可用串口。
import serial.tools.list_ports
ports = serial.tools.list_ports.comports()
for port in ports:
print(f"設(shè)備: {port.device}, 描述: {port.description}")使用 with 語(yǔ)句自動(dòng)管理資源 使用 with 語(yǔ)句可以確保串口在代碼塊結(jié)束后被正確關(guān)閉,即使發(fā)生異常也是如此。
with serial.Serial('COM3', 9600, timeout=1) as ser:
ser.write(b'AT\r\n')
response = ser.readline()
print(response.decode('utf-8'))多線程處理讀寫 對(duì)于需要同時(shí)進(jìn)行讀寫操作的應(yīng)用(如聊天工具、設(shè)備監(jiān)控),可以使用多線程。
import threading
import time
def read_from_port(ser):
while True:
if ser.in_waiting > 0:
data = ser.readline().decode('utf-8').strip()
print(f"收到: {data}")
def main():
ser = serial.Serial('COM3', 9600, timeout=1)
read_thread = threading.Thread(target=read_from_port, args=(ser,))
read_thread.daemon = True # 設(shè)置為守護(hù)線程,主程序退出時(shí)自動(dòng)結(jié)束
read_thread.start()
# 主線程可以處理發(fā)送或其他邏輯
while True:
message = input("輸入要發(fā)送的消息 (輸入quit退出): ")
if message.lower() == 'quit':
break
ser.write((message + '\r\n').encode('utf-8'))
ser.close()三、常見問題與解決方案
| 問題現(xiàn)象 | 可能原因 | 解決方案 |
|---|---|---|
| SerialException: could not open port | 端口號(hào)錯(cuò)誤、端口被其他程序占用、權(quán)限不足(Linux常見) | 使用 list_ports.comports() 確認(rèn)端口名;關(guān)閉占用程序(如串口調(diào)試助手);在Linux下使用 sudo chmod 666 /dev/ttyUSB0 或?qū)⒆约杭尤?dialout 用戶組。 |
| 讀取數(shù)據(jù)為空或超時(shí) | 波特率等參數(shù)與設(shè)備不匹配、設(shè)備未發(fā)送數(shù)據(jù)、timeout設(shè)置過短 | 確認(rèn)設(shè)備與代碼的波特率、數(shù)據(jù)位、停止位、校驗(yàn)位完全一致;使用串口調(diào)試工具驗(yàn)證設(shè)備是否正常發(fā)送數(shù)據(jù);適當(dāng)增加 timeout 參數(shù)值。 |
| 數(shù)據(jù)亂碼 | 編碼不一致、串口參數(shù)不匹配 | 使用 ser.read() 獲取原始字節(jié)后,用正確的編碼(如 'utf-8'、'gbk')解碼;再次核對(duì)并統(tǒng)一所有串口參數(shù)。 |
| 'bool' object is not callable | 錯(cuò)誤地將屬性 is_open 當(dāng)作方法調(diào)用,寫成了 ser.is_open() | 正確寫法應(yīng)為 ser.is_open,這是一個(gè)屬性而非方法。 |
| AttributeError: module 'serial' has no attribute 'Serial' | 庫(kù)安裝沖突或錯(cuò)誤 | 正確的庫(kù)名是 pyserial,但導(dǎo)入時(shí)使用 import serial。如果出錯(cuò),可以嘗試卸載后重新安裝:pip uninstall serial pyserial,然后 pip install pyserial。 |
四、完整示例代碼
以下是一個(gè)結(jié)合了錯(cuò)誤處理、參數(shù)配置和簡(jiǎn)單讀寫功能的完整示例:
import serial
import serial.tools.list_ports
def list_available_ports():
"""列出所有可用串口"""
ports = serial.tools.list_ports.comports()
if not ports:
print("未找到可用串口設(shè)備。")
return None
print("可用串口設(shè)備:")
for idx, port in enumerate(ports):
print(f" [{idx}] {port.device} - {port.description}")
return ports
def main():
# 1. 列出并選擇端口
available_ports = list_available_ports()
if not available_ports:
return
port_index = int(input("請(qǐng)選擇要打開的串口編號(hào): "))
selected_port = available_ports[port_index].device
# 2. 配置并打開串口
try:
with serial.Serial(
port=selected_port,
baudrate=9600,
bytesize=serial.EIGHTBITS,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
timeout=2 # 設(shè)置讀取超時(shí)為2秒
) as ser:
print(f"串口 {ser.name} 已成功打開。")
# 3. 發(fā)送數(shù)據(jù)
send_data = b'Hello from Python!\r\n'
ser.write(send_data)
print(f"已發(fā)送: {send_data.decode('utf-8', errors='ignore').strip()}")
# 4. 嘗試讀取數(shù)據(jù)
if ser.in_waiting:
received_data = ser.read(ser.in_waiting)
print(f"接收到原始數(shù)據(jù): {received_data}")
try:
print(f"解碼后: {received_data.decode('utf-8')}")
except UnicodeDecodeError:
print("數(shù)據(jù)無法用UTF-8解碼,可能為二進(jìn)制數(shù)據(jù)。")
else:
print("未接收到數(shù)據(jù)。")
except serial.SerialException as e:
print(f"串口操作出錯(cuò): {e}")
except KeyboardInterrupt:
print("\n程序被用戶中斷。")
except Exception as e:
print(f"發(fā)生未知錯(cuò)誤: {e}")
if __name__ == "__main__":
main()這個(gè)示例整合了自動(dòng)端口列表、使用 with 語(yǔ)句進(jìn)行資源管理、基本的讀寫操作以及異常處理,是一個(gè)可以直接運(yùn)行和修改的起點(diǎn)。
總結(jié)來說,使用Python進(jìn)行串口通信的核心是正確安裝和導(dǎo)入 pyserial 庫(kù),在創(chuàng)建 Serial 對(duì)象時(shí)確保參數(shù)與硬件設(shè)備完全匹配,并在讀寫數(shù)據(jù)時(shí)注意字節(jié)與字符串的轉(zhuǎn)換。對(duì)于復(fù)雜應(yīng)用,可以考慮使用多線程來分離讀寫邏輯。遇到問題時(shí),應(yīng)首先檢查端口占用、參數(shù)匹配和權(quán)限設(shè)置這些最常見的原因。
到此這篇關(guān)于python serial模塊使用方法的文章就介紹到這了,更多相關(guān)python serial模塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 使用python pyserial模塊串口通信方式
- Python使用pip安裝pySerial串口通訊模塊
- Python中串口通信庫(kù)pyserial基礎(chǔ)知識(shí)
- Python中serial庫(kù)的介紹及用法示例
- python serial串口通信示例詳解
- 使用Python玩轉(zhuǎn)串口(基于pySerial問題)
- 解決python中安裝serial及No module named ‘serial.tools‘等問題
- Python Serial串口基本操作(收發(fā)數(shù)據(jù))
- Python 實(shí)現(xiàn)Serial 與STM32J進(jìn)行串口通訊
- Python實(shí)現(xiàn)串口通信(pyserial)過程解析
相關(guān)文章
在linux系統(tǒng)中安裝python3.8.1?并卸載?python3.6.2?更新python3引導(dǎo)到3.8.1的
這篇文章主要介紹了如何在linux系統(tǒng)中安裝python3.8.1?并卸載?python3.6.2?更新python3引導(dǎo)到3.8.1,本文分步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-11-11
Django日志和調(diào)試工具欄實(shí)現(xiàn)高效的應(yīng)用程序調(diào)試和性能優(yōu)化
這篇文章主要介紹了Django日志和調(diào)試工具欄實(shí)現(xiàn)高效的應(yīng)用程序調(diào)試和性能優(yōu)化,Django日志和調(diào)試工具欄為開發(fā)者提供了快速定位應(yīng)用程序問題的工具,可提高調(diào)試和性能優(yōu)化效率,提高應(yīng)用程序的可靠性和可維護(hù)性2023-05-05
Python爬蟲實(shí)例——爬取美團(tuán)美食數(shù)據(jù)
這篇文章主要介紹了Python爬蟲如何爬取美團(tuán)美食數(shù)據(jù),文中講解非常詳細(xì),代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07
Django實(shí)現(xiàn)drf搜索過濾和排序過濾
當(dāng)我們需要對(duì)后臺(tái)的數(shù)據(jù)進(jìn)行過濾的時(shí)候,drf有兩種,搜索過濾和排序過濾。本文就詳細(xì)的介紹這兩種的實(shí)現(xiàn),感興趣的可以了解一下2021-06-06
Python+AutoIt實(shí)現(xiàn)界面工具開發(fā)過程詳解
這篇文章主要介紹了Python+AutoIt實(shí)現(xiàn)界面工具開發(fā)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
如何在pycharm中配置pyqt5設(shè)計(jì)GUI操作教程
這篇文章主要介紹了如何在pycharm中配置pyqt5設(shè)計(jì)GUI的操作教程,有需要的朋友可以借鑒參考下,希望大家可以多多交流,討論相關(guān)問題共同提升2021-08-08
Python如何生成指定區(qū)間中的隨機(jī)數(shù)
這篇文章主要介紹了Python如何生成指定區(qū)間中的隨機(jī)數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07

