android 串口一直打开_实例 | 使用Python串口实时显示数据并绘图
今天為大家分享一篇使用Python串口實時顯示數據并繪圖的例子,具有很好的參考價值,希望對大家有所幫助。
一、安裝pyserial以及基本用法
使用pyserial進行串口傳輸,在cmd下輸入命令pip install pyserial
注:升級pip后會出現 "‘E:\Anaconda3\Scripts\pip-script.py' is not present."錯誤
使用 easy_install pip命令就能解決,換一條重新能執行安裝的命令。
常用方法:
ser = serial.Serial(0) 是打開第一個串口
print ser.portstr 能看到第一個串口的標識,windows下是COM1
ser.write(“hello") 就是往串口里面寫數據
ser.close() 就是關閉ser表示的串口
ser.open() 會打開這個串口
ser = serial.Serial(‘COM1', 115200) 來設置波特率,當然還有專門的函數
data = ser.read()可以讀一個字符
data = ser.read(20) 是讀20個字符
data = ser.readline() 是讀一行,以/n結束,要是沒有/n就一直讀,阻塞。
data = ser.readlines()和ser.xreadlines()都需要設置超時時間
ser.baudrate = 9600 設置波特率
ser 來查看當前串口的狀態
ser.isOpen() 看看這個串口是否已經被打開
串行口的屬性:
name:設備名字 portstr:已廢棄,用name代替 port:讀或者寫端口 baudrate:波特率
bytesize:字節大小 parity:校驗位 stopbits:停止位 timeout:讀超時設置
writeTimeout:寫超時 xonxoff:軟件流控 rtscts:硬件流控 dsrdtr:硬件流控
interCharTimeout:字符間隔超時
二、最基本的串口代碼
import serialportx="COM5"bps=9600timex=5#串口執行到這已經打開 再用open命令會報錯ser = serial.Serial(portx, int(bps), timeout=1, parity=serial.PARITY_NONE,stopbits=1)if (ser.isOpen()):print("open success")# 向端口些數據 字符串必須譯碼ser.write("hello".encode())while (True):line = ser.readline()if(line):print(line)line=0else:print("open failed")ser.close()#關閉端口)三、pyqtgraph的使用
pip install pyqtgraph#顯示波形的界面
pip install PyQt5#界面要Qt的支持
pyqtgraph是Python平臺上一種功能強大的2D/3D繪圖庫,相對于matplotlib庫,由于內部實現方式上,使用了高速計算的numpy信號處理庫以及Qt的GraphicsView框架。
因此,它在大數據量的數字處理和快速顯示方面有著巨大的優勢,它適合于需要快速繪圖更新、視頻或實時交互性的操作場合。
另外,它不僅為各種數據提供了快速可交互式的圖形顯示,同時也提供了用于快速開發應用程序的各種小工具,如屬性樹、流程圖等小部件,在數學、科學和工程領域都有著廣泛的應用。
import pyqtgraph as pgimport numpy as npimport array app = pg.mkQApp()#建立appwin = pg.GraphicsWindow()#建立窗口win.setWindowTitle(u'pyqtgraph逐點畫波形圖')win.resize(800, 500)#小窗口大小 data = array.array('d') #可動態改變數組的大小,double型數組historyLength = 100#橫坐標長度p = win.addPlot()#把圖p加入到窗口中p.showGrid(x=True, y=True)#把X和Y的表格打開p.setRange(xRange=[0,historyLength], yRange=[-1.2, 1.2], padding=0)p.setLabel(axis='left', text='y / V')#靠左p.setLabel(axis='bottom', text='x / point')p.setTitle('y = sin(x)')#表格的名字curve = p.plot()#繪制一個圖形idx = 0def plotData():global idx#內部作用域想改變外部域變量tmp = np.sin(np.pi / 50 * idx)if len(data)data.append(tmp)else:data[:-1] = data[1:]#前移data[-1] = tmpcurve.setData(data)idx += 1 timer = pg.QtCore.QTimer()timer.timeout.connect(plotData)#定時調用plotData函數timer.start(50)#多少ms調用一次 app.exec_()四、通過多線程實現串口數據的實時繪圖import pyqtgraph as pg
這里主要開了一個線程去處理串口,剩下的和上面內容一樣。
代碼:
import arrayimport serialimport threadingimport numpy as npimport time i = 0def Serial():while(True):n = mSerial.inWaiting()if(n):if data!=" ":dat = int.from_bytes(mSerial.readline(1),byteorder='little') # 格式轉換n=0global i;if i < historyLength:data[i] = dati = i+1else:data[:-1] = data[1:]data[i-1] = dat def plotData():curve.setData(data) if __name__ == "__main__":app = pg.mkQApp() # 建立appwin = pg.GraphicsWindow() # 建立窗口win.setWindowTitle(u'pyqtgraph逐點畫波形圖')win.resize(800, 500) # 小窗口大小data = array.array('i') # 可動態改變數組的大小,double型數組historyLength = 200 # 橫坐標長度a = 0data=np.zeros(historyLength).__array__('d')#把數組長度定下來p = win.addPlot() # 把圖p加入到窗口中p.showGrid(x=True, y=True) # 把X和Y的表格打開p.setRange(xRange=[0, historyLength], yRange=[0, 255], padding=0)p.setLabel(axis='left', text='y / V') # 靠左p.setLabel(axis='bottom', text='x / point')p.setTitle('semg') # 表格的名字curve = p.plot() # 繪制一個圖形curve.setData(data)portx = 'COM24'bps = 19200# 串口執行到這已經打開 再用open命令會報錯mSerial = serial.Serial(portx, int(bps))if (mSerial.isOpen()):print("open success")mSerial.write("hello".encode()) # 向端口些數據 字符串必須譯碼mSerial.flushInput() # 清空緩沖區else:print("open failed")serial.close() # 關閉端口th1 = threading.Thread(target=Serial)#目標函數一定不能帶()被這個BUG搞了好久th1.start()timer = pg.QtCore.QTimer()timer.timeout.connect(plotData) # 定時刷新數據顯示timer.start(50) # 多少ms調用一次app.exec_()效果如圖:
五、與下位機通訊實現波形實時監測
在這里與第四階段基本相同,需要注意的是,如果收數據直接畫圖的話,波形會出現問題。所以串口傳輸數據時使用循環隊列(先進先出),數據來之后先進隊列,之后再定時器調用函數,出隊列,更新圖。
理論上刷新數據的時間需要大于下位機發送數據的間隔時間,否則隊列會越來越大,而且圖的刷新不連貫。再就是有一個小問題,因為正弦波有負值,我又沒找到很好的把Byte轉為char的方法,所以只能手動代碼處理,先轉成int類型,再把第八位(符號位)清零,得到絕對值。然后再取負,得到我們需要的數據。
但發現Python無法進行移位操作,python是int類型是無精度類型,不會發生溢出而進行截取的情況,所以只能先轉為二進制在移位,太麻煩,這里直接通過減去一個數的方法來實現了。
代碼:
import pyqtgraph as pgimport arrayimport serialimport threadingimport numpy as npfrom queue import Queueimport time i = 0q = Queue(maxsize=0)def Serial():global i;global q;while(True):n = mSerial.inWaiting()if(n):dat = int.from_bytes(mSerial.readline(1),byteorder='little') # 格式轉換if(dat>>7):dat =256-datdat =0-datq.put(dat) def plotData():global i;if i < historyLength:data[i] = q.get()i = i+1else:data[:-1] = data[1:]data[i-1] = q.get()curve.setData(data) if __name__ == "__main__":app = pg.mkQApp() # 建立appwin = pg.GraphicsWindow() # 建立窗口win.setWindowTitle(u'pyqtgraph逐點畫波形圖')win.resize(800, 500) # 小窗口大小data = array.array('i') # 可動態改變數組的大小,double型數組historyLength = 100 # 橫坐標長度a = 0data=np.zeros(historyLength).__array__('d')#把數組長度定下來p = win.addPlot() # 把圖p加入到窗口中p.showGrid(x=True, y=True) # 把X和Y的表格打開p.setRange(xRange=[0, historyLength], yRange=[-50, 50], padding=0)p.setLabel(axis='left', text='y / V') # 靠左p.setLabel(axis='bottom', text='x / point')p.setTitle('semg') # 表格的名字curve = p.plot() # 繪制一個圖形curve.setData(data)portx = 'COM25'bps = 19200# 串口執行到這已經打開 再用open命令會報錯mSerial = serial.Serial(portx, int(bps))if (mSerial.isOpen()):dat = 0xff;dat >> 2;print("open success")# 向端口些數據 字符串必須譯碼mSerial.write("hello".encode())mSerial.flushInput() # 清空緩沖區else:print("open failed")serial.close() # 關閉端口th1 = threading.Thread(target=Serial)th1.start()timer = pg.QtCore.QTimer()timer.timeout.connect(plotData) # 定時刷新數據顯示timer.start(1) # 多少ms調用一次app.exec_()以上這篇使用Python串口實時顯示數據并繪圖的例子就是分享給大家的全部內容了,希望能給大家一個參考。
- END -
往期精彩◆ ?從重刑犯到硅谷碼農,是什么改變了他?
◆ ?27?個為什么,幫助你更好的理解Python
◆ ?出現這 10 種癥狀,說明你不適合干程序員
總結
以上是生活随笔為你收集整理的android 串口一直打开_实例 | 使用Python串口实时显示数据并绘图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小米米家无线洗地机 2 Lite 开启预
- 下一篇: 计算文本相似度_Python文本相似性计