前言
本文我們來學習Python軟體包pyserial的使用,硬體採用wemos D1開發板,直接燒錄串口章節代碼即可,本文主要編寫PC端Python腳本,完成腳本和外接串口設備通訊的功能。
一、基礎知識
1.pyserial簡介:
pyserial模塊是python和串口設備通訊的package,串口是計算機上比較通用的通訊協議,串口設備通過USB插入電腦,python通過pyserial模塊就可以完成和串口設備的通訊,其主要函數說明如下:
2 安裝pyserial
pip3 install pyserial
二、示例
1.程序
# encoding=utf-8
import serial
import threading
import datetime
import queue
from time import sleep
class Uart(object):
def __init__(self, port):
self.err = 0
self.run_status = 0
try:
self.uart = serial.Serial(port, 9600)
self.run_status = 1
print("start uart success")
except:
print("start uart error")
self.err = -1
def uart_recv_thread(self):
print("start uart_recv_thread")
while True:
try:
data = self.uart.readline()
data = "[uart==>pc] " + data.decode()
print(data)
sleep(0.05)
except Exception as e:
print("Error")
print(e)
def run(self):
threading.Thread(target=self.uart_recv_thread, daemon=True).start()
def close(self):
print("close uart")
self.uart.close()
def uart_send_data(self, data):
print("pc==>uart: ", data)
self.uart.write(data.encode())
if __name__ == "__main__":
uart = Uart("COM13")
if(-1 != uart.err):
uart.run()
while(True):
input_data = input("Please input:\r\n")
if ("quit" == input_data):
uart.close()
break
else:
uart.uart_send_data(input_data)
sleep(0.1)
print("exit uart")
程序中定義了一個Uart類,構造函數中實現打開串口設備功能,如果打開失敗,Uart.err = -1,初始化對象後,調用Uart.run()即可開啟接收線程,注意創建線程函數中daemon=True,表示設置接收線程為守護線程,當主線程退出後,該守護線程也退出,否則將成為殭屍線程一直存在。主線程中處理邏輯比較簡單,當用戶輸入數據不是「quit」時候,直接發送給串口設備,否則關閉串口,退出主線程。
三、運行
1. 硬體連接
注意wemos D1中需要編譯燒錄「wemos D1 arduino物聯網開發板應用筆記2-串口通信」章節中代碼,大家也可自行編寫,其實現功能是當串口收到數據後,原路返回。
2. 運行python腳本
進入run.py根目錄,終端(本文用VS Code下終端,也可在CMD命令窗口執行)輸入python3 run.py即可運行程序,界面如下:
手動輸入hello world,wemos收到數據後會立刻返回。
手動輸入「quit」,退出主線程,此時守護線程也會退出。
四、結語
本節完,實際操作過程中需要注意的地方有如下幾點:
(1) python相關
本文使用到了python線程、對象等內容,如果沒有接觸過這方面的朋友,最好看下網上相關教程,實際項目開發過程中不僅要使用串口接收線程,也要及時有效地對數據進行處理,本文是直接列印接收數據,比較好的方式是串口接收線程接收到數據後放置接收隊列中,然後再做其他處理,感興趣的朋友可自行嘗試。
作者:小驛
寄語:事在人為,不去做你怎麼知道行還是不行。