Python 串口收發(fā)使用與示例教程
今天咱們來聊聊怎么用Python搞定串口通信,讓你的電腦和各種設(shè)備愉快地“對(duì)話”。別擔(dān)心,跟著我,保證輕松上手!
一、準(zhǔn)備工作
首先,確保你的電腦有串口(通常是USB轉(zhuǎn)串口),然后安裝pyserial庫。打開終端或命令行,敲入這行命令:
pip install pyserial
安裝好了?那咱們就開始吧!
二、串口基礎(chǔ)知識(shí)
串口通信,簡(jiǎn)單說就是設(shè)備之間通過一根線,一個(gè)字節(jié)一個(gè)字節(jié)地傳遞信息。在Python里,我們用Serial類來控制這個(gè)過程。
三、實(shí)戰(zhàn)代碼
(1) 打開串口
import serial
# 創(chuàng)建串口對(duì)象
ser = serial.Serial('COM3', 9600, timeout=1)
# 檢查是否成功打開
if ser.isOpen():
print("串口已打開!")
else:
print("串口打開失敗,請(qǐng)檢查設(shè)置!")
這里,COM3是串口號(hào),不同的電腦可能不同,9600是波特率,要和設(shè)備一致哦!
(2) 發(fā)送數(shù)據(jù)
發(fā)送數(shù)據(jù)很簡(jiǎn)單,用write()方法就行:
# 準(zhǔn)備發(fā)送的數(shù)據(jù)
data_to_send = "Hello, Arduino!".encode()
# 發(fā)送數(shù)據(jù)
ser.write(data_to_send)
print("數(shù)據(jù)已發(fā)送!")
記得把字符串編碼成字節(jié)哦,因?yàn)榇谕ㄐ盘幚淼氖亲止?jié)流。
(3) 接收數(shù)據(jù)
接收數(shù)據(jù)要用readline()或read()方法。這里我們用readline()來讀取一行:
while True:
# 讀取一行數(shù)據(jù)
data_received = ser.readline().decode().strip()
if data_received:
print(f"收到數(shù)據(jù):{data_received}")
else:
break
decode()是把接收到的字節(jié)解碼回字符串,strip()去掉末尾的換行符。
四、完整示例
把上面的代碼整合一下,就得到一個(gè)完整的串口收發(fā)程序:
import serial
def main():
# 創(chuàng)建串口對(duì)象
ser = serial.Serial('COM3', 9600, timeout=1)
if not ser.isOpen():
print("串口打開失敗,請(qǐng)檢查設(shè)置!")
return
print("串口已打開!")
# 準(zhǔn)備發(fā)送的數(shù)據(jù)
data_to_send = "Hello, Arduino!".encode()
# 發(fā)送數(shù)據(jù)
ser.write(data_to_send)
print("數(shù)據(jù)已發(fā)送!")
while True:
# 讀取一行數(shù)據(jù)
data_received = ser.readline().decode().strip()
if data_received:
print(f"收到數(shù)據(jù):{data_received}")
else:
break
# 關(guān)閉串口
ser.close()
print("串口已關(guān)閉!")
if __name__ == "__main__":
main()
五、小貼士
- 記得檢查你的串口號(hào)和波特率。
- 發(fā)送前最好等待設(shè)備準(zhǔn)備好,比如Arduino重啟后需要等待幾秒。
- 玩串口通信時(shí),記得及時(shí)關(guān)閉串口,避免資源占用。
六、錯(cuò)誤處理與調(diào)試
在實(shí)際應(yīng)用中,串口通信可能會(huì)遇到各種各樣的問題,如設(shè)備未連接、波特率不匹配等。為了確保程序的健壯性,我們需要添加錯(cuò)誤處理機(jī)制:
try:
# 嘗試打開串口
ser = serial.Serial('COM3', 9600, timeout=1)
except serial.SerialException as e:
print(f"串口打開失敗: {e}")
此外,使用logging模塊可以幫助我們記錄程序運(yùn)行過程中的關(guān)鍵信息,便于調(diào)試和維護(hù):
import logging
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
# 記錄日志
logger.debug("嘗試打開串口...")
七、多設(shè)備通信
如果需要同時(shí)與多個(gè)設(shè)備通信,可以創(chuàng)建多個(gè)Serial實(shí)例,每個(gè)實(shí)例對(duì)應(yīng)一個(gè)設(shè)備:
device1 = serial.Serial('COM3', 9600)
device2 = serial.Serial('COM4', 9600)
# 向兩個(gè)設(shè)備發(fā)送相同數(shù)據(jù)
data_to_send = "Hello, Devices!".encode()
device1.write(data_to_send)
device2.write(data_to_send)
八、高級(jí)數(shù)據(jù)處理
在某些場(chǎng)景下,你可能需要解析從設(shè)備接收到的復(fù)雜數(shù)據(jù)。Python的強(qiáng)大在于,你可以利用各種庫來處理這些數(shù)據(jù),比如使用正則表達(dá)式提取特定模式的信息:
import re
# 假設(shè)設(shè)備返回的數(shù)據(jù)格式為:Temperature: 23.5°C
pattern = r'Temperature: (\d+\.\d+)°C'
data_received = ser.readline().decode().strip()
match = re.search(pattern, data_received)
if match:
temperature = float(match.group(1))
print(f"當(dāng)前溫度為:{temperature}°C")
九、小項(xiàng)目實(shí)踐
為了加深理解,嘗試設(shè)計(jì)一個(gè)小項(xiàng)目,比如一個(gè)溫度監(jiān)測(cè)系統(tǒng),使用Arduino作為溫度傳感器,Python作為數(shù)據(jù)處理中心。這樣不僅可以練習(xí)串口通信,還能學(xué)習(xí)數(shù)據(jù)處理和可視化。
十、結(jié)語
串口通信是連接物理世界和數(shù)字世界的橋梁,掌握它將開啟無限可能。無論是DIY愛好者還是專業(yè)開發(fā)者,Python都能提供強(qiáng)大的工具箱,幫助你實(shí)現(xiàn)創(chuàng)意。