python serial模塊使用方法
在Python中實現(xiàn)串口通信,最常用且功能強大的庫是 pySerial(通常通過 import serial 導入)
。它支持跨平臺操作(Windows、Linux、macOS),提供了完整的串口訪問功能。
一、核心步驟與基礎(chǔ)代碼
實現(xiàn)串口通信通常遵循以下步驟:
安裝 pySerial 使用 pip 安裝:
pip install pyserial
導入庫并打開串口 導入庫后,通過 serial.Serial() 創(chuàng)建并打開串口連接。關(guān)鍵參數(shù)包括端口號(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ù)位,默認為8
parity=serial.PARITY_NONE, # 校驗位,默認為無
stopbits=serial.STOPBITS_ONE, # 停止位,默認為1
timeout=1 # 讀超時時間(秒),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個字節(jié) line = ser.readline() # 讀取一行,直到換行符 bytes_waiting = ser.in_waiting # 獲取接收緩沖區(qū)中的字節(jié)數(shù)
關(guān)閉串口 操作完成后,務(wù)必關(guān)閉串口以釋放系統(tǒng)資源。
ser.close()
二、實用技巧與進階操作
自動檢測可用串口 在不確定端口號時,可以自動列出所有可用串口。
import serial.tools.list_ports
ports = serial.tools.list_ports.comports()
for port in ports:
print(f"設(shè)備: {port.device}, 描述: {port.description}")使用 with 語句自動管理資源 使用 with 語句可以確保串口在代碼塊結(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'))多線程處理讀寫 對于需要同時進行讀寫操作的應(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è)置為守護線程,主程序退出時自動結(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 | 端口號錯誤、端口被其他程序占用、權(quán)限不足(Linux常見) | 使用 list_ports.comports() 確認端口名;關(guān)閉占用程序(如串口調(diào)試助手);在Linux下使用 sudo chmod 666 /dev/ttyUSB0 或?qū)⒆约杭尤?dialout 用戶組。 |
| 讀取數(shù)據(jù)為空或超時 | 波特率等參數(shù)與設(shè)備不匹配、設(shè)備未發(fā)送數(shù)據(jù)、timeout設(shè)置過短 | 確認設(shè)備與代碼的波特率、數(shù)據(jù)位、停止位、校驗位完全一致;使用串口調(diào)試工具驗證設(shè)備是否正常發(fā)送數(shù)據(jù);適當增加 timeout 參數(shù)值。 |
| 數(shù)據(jù)亂碼 | 編碼不一致、串口參數(shù)不匹配 | 使用 ser.read() 獲取原始字節(jié)后,用正確的編碼(如 'utf-8'、'gbk')解碼;再次核對并統(tǒng)一所有串口參數(shù)。 |
| 'bool' object is not callable | 錯誤地將屬性 is_open 當作方法調(diào)用,寫成了 ser.is_open() | 正確寫法應(yīng)為 ser.is_open,這是一個屬性而非方法。 |
| AttributeError: module 'serial' has no attribute 'Serial' | 庫安裝沖突或錯誤 | 正確的庫名是 pyserial,但導入時使用 import serial。如果出錯,可以嘗試卸載后重新安裝:pip uninstall serial pyserial,然后 pip install pyserial。 |
四、完整示例代碼
以下是一個結(jié)合了錯誤處理、參數(shù)配置和簡單讀寫功能的完整示例:
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("請選擇要打開的串口編號: "))
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è)置讀取超時為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解碼,可能為二進制數(shù)據(jù)。")
else:
print("未接收到數(shù)據(jù)。")
except serial.SerialException as e:
print(f"串口操作出錯: {e}")
except KeyboardInterrupt:
print("\n程序被用戶中斷。")
except Exception as e:
print(f"發(fā)生未知錯誤: {e}")
if __name__ == "__main__":
main()這個示例整合了自動端口列表、使用 with 語句進行資源管理、基本的讀寫操作以及異常處理,是一個可以直接運行和修改的起點。
總結(jié)來說,使用Python進行串口通信的核心是正確安裝和導入 pyserial 庫,在創(chuàng)建 Serial 對象時確保參數(shù)與硬件設(shè)備完全匹配,并在讀寫數(shù)據(jù)時注意字節(jié)與字符串的轉(zhuǎn)換。對于復雜應(yīng)用,可以考慮使用多線程來分離讀寫邏輯。遇到問題時,應(yīng)首先檢查端口占用、參數(shù)匹配和權(quán)限設(shè)置這些最常見的原因。
到此這篇關(guān)于python serial模塊使用方法的文章就介紹到這了,更多相關(guān)python serial模塊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 使用python pyserial模塊串口通信方式
- Python使用pip安裝pySerial串口通訊模塊
- Python中串口通信庫pyserial基礎(chǔ)知識
- Python中serial庫的介紹及用法示例
- python serial串口通信示例詳解
- 使用Python玩轉(zhuǎn)串口(基于pySerial問題)
- 解決python中安裝serial及No module named ‘serial.tools‘等問題
- Python Serial串口基本操作(收發(fā)數(shù)據(jù))
- Python 實現(xiàn)Serial 與STM32J進行串口通訊
- Python實現(xiàn)串口通信(pyserial)過程解析
相關(guān)文章
在linux系統(tǒng)中安裝python3.8.1?并卸載?python3.6.2?更新python3引導到3.8.1的
這篇文章主要介紹了如何在linux系統(tǒng)中安裝python3.8.1?并卸載?python3.6.2?更新python3引導到3.8.1,本文分步驟給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-11-11
Django日志和調(diào)試工具欄實現(xiàn)高效的應(yīng)用程序調(diào)試和性能優(yōu)化
這篇文章主要介紹了Django日志和調(diào)試工具欄實現(xiàn)高效的應(yīng)用程序調(diào)試和性能優(yōu)化,Django日志和調(diào)試工具欄為開發(fā)者提供了快速定位應(yīng)用程序問題的工具,可提高調(diào)試和性能優(yōu)化效率,提高應(yīng)用程序的可靠性和可維護性2023-05-05
Python+AutoIt實現(xiàn)界面工具開發(fā)過程詳解
這篇文章主要介紹了Python+AutoIt實現(xiàn)界面工具開發(fā)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-08-08
如何在pycharm中配置pyqt5設(shè)計GUI操作教程
這篇文章主要介紹了如何在pycharm中配置pyqt5設(shè)計GUI的操作教程,有需要的朋友可以借鑒參考下,希望大家可以多多交流,討論相關(guān)問題共同提升2021-08-08

