最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python serial模塊使用方法

 更新時間:2025年12月16日 11:55:15   作者:xingzhemengyou1  
本文詳細介紹了如何在Python中使用pySerial庫進行串口通信,包括核心步驟、實用技巧、常見問題及解決方案,通過示例代碼,展示了如何正確配置串口參數(shù)、進行數(shù)據(jù)讀寫,并處理異常情況,感興趣的朋友跟隨小編一起看看吧

在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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

孝感市| 招远市| 永和县| 临泽县| 宣化县| 南昌县| 泉州市| 安徽省| 武鸣县| 沐川县| 广南县| 怀来县| 贺州市| 宁化县| 宣化县| 武威市| 广灵县| 开远市| 辽中县| 江北区| 昌乐县| 永定县| 镇赉县| 鹤峰县| 西丰县| 四会市| 玉屏| 宿松县| 玉山县| 石景山区| 贞丰县| 竹北市| 黄大仙区| 徐水县| 晋城| 龙游县| 惠水县| 乌鲁木齐市| 锦屏县| 枝江市| 安龙县|