中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么使用Python串口實時顯示數據并繪圖

發布時間:2021-04-25 14:21:49 來源:億速云 閱讀:384 作者:小新 欄目:開發技術

這篇文章給大家分享的是有關怎么使用Python串口實時顯示數據并繪圖的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

Python主要用來做什么

Python主要應用于:1、Web開發;2、數據科學研究;3、網絡爬蟲;4、嵌入式應用開發;5、游戲開發;6、桌面應用開發。

使用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 serial
portx="COM5"
bps=9600
timex=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=0
else:
 print("open failed")
ser.close()#關閉端口
)

三、pyqtgraph的使用

pip install pyqtgraph#顯示波形的界面

pip install PyQt5#界面要Qt的支持

pyqtgraph是Python平臺上一種功能強大的2D/3D繪圖庫,相對于matplotlib庫,由于內部實現方式上,使用了高速計算的numpy信號處理庫以及Qt的GraphicsView框架,因此,它在大數據量的數字處理和快速顯示方面有著巨大的優勢,它適合于需要快速繪圖更新、視頻或實時交互性的操作場合。另外,它不僅為各種數據提供了快速可交互式的圖形顯示,同時也提供了用于快速開發應用程序的各種小工具,如屬性樹、流程圖等小部件,在數學、科學和工程領域都有著廣泛的應用。

import pyqtgraph as pg
import numpy as np
import array

app = pg.mkQApp()#建立app
win = 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 = 0
def plotData():
 global idx#內部作用域想改變外部域變量
 tmp = np.sin(np.pi / 50 * idx)
 if len(data)<historyLength:
 data.append(tmp)
 else:
 data[:-1] = data[1:]#前移
 data[-1] = tmp
 curve.setData(data)
 idx += 1

timer = pg.QtCore.QTimer()
timer.timeout.connect(plotData)#定時調用plotData函數
timer.start(50)#多少ms調用一次

app.exec_()

怎么使用Python串口實時顯示數據并繪圖

四、通過多線程實現串口數據的實時繪圖import pyqtgraph as pg

主要是開了一個線程去處理串口 剩下的和上面內容一樣 就不過多解釋了 直接上代碼

import array
import serial
import threading
import numpy as np
import time


i = 0
def Serial():
 while(True):
 n = mSerial.inWaiting()
 if(n):
  if data!=" ":
  dat = int.from_bytes(mSerial.readline(1),byteorder='little') # 格式轉換
  n=0
  global i;
  if i < historyLength:
   data[i] = dat
   i = i+1
  else:
   data[:-1] = data[1:]
   data[i-1] = dat

def plotData():
 curve.setData(data)


if __name__ == "__main__":
 app = pg.mkQApp() # 建立app
 win = pg.GraphicsWindow() # 建立窗口
 win.setWindowTitle(u'pyqtgraph逐點畫波形圖')
 win.resize(800, 500) # 小窗口大小
 data = array.array('i') # 可動態改變數組的大小,double型數組
 historyLength = 200 # 橫坐標長度
 a = 0
 data=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() # 關閉端口
 th2 = threading.Thread(target=Serial)#目標函數一定不能帶()被這個BUG搞了好久
 th2.start()
 timer = pg.QtCore.QTimer()
 timer.timeout.connect(plotData) # 定時刷新數據顯示
 timer.start(50) # 多少ms調用一次
 app.exec_()

效果如圖

怎么使用Python串口實時顯示數據并繪圖

五、與下位機通訊實現波形實時監測

在這里與第四階段基本相同,需要注意的是,如果收數據直接畫圖的話,波形會出現問題。所以串口傳輸數據時使用循環隊列(先進先出),數據來之后先進隊列,之后再定時器調用函數,出隊列,更新圖。理論上刷新數據的時間需要大于下位機發送數據的間隔時間,否則隊列會越來越大,而且圖的刷新不連貫。再就是有一個小問題,因為正弦波有負值,我又沒找到很好的把Byte轉為char的方法,所以只能手動代碼處理,先轉成int類型,再把第八位(符號位)清零,得到絕對值。然后再取負,得到我們需要的數據。但發現Python無法進行移位操作,python是int類型是無精度類型,不會發生溢出而進行截取的情況,所以只能先轉為二進制在移位,太麻煩,直接通過減去一個數的方法來實現了。然后直接上代碼吧

import pyqtgraph as pg
import array
import serial
import threading
import numpy as np
from queue import Queue
import time


i = 0
q = 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-dat
  dat =0-dat
  q.put(dat)

def plotData():
 global i;
 if i < historyLength:
 data[i] = q.get()
 i = i+1
 else:
 data[:-1] = data[1:]
 data[i-1] = q.get()
 curve.setData(data)


if __name__ == "__main__":
 app = pg.mkQApp() # 建立app
 win = pg.GraphicsWindow() # 建立窗口
 win.setWindowTitle(u'pyqtgraph逐點畫波形圖')
 win.resize(800, 500) # 小窗口大小
 data = array.array('i') # 可動態改變數組的大小,double型數組
 historyLength = 100 # 橫坐標長度
 a = 0
 data=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() # 關閉端口
 th2 = threading.Thread(target=Serial)
 th2.start()
 timer = pg.QtCore.QTimer()
 timer.timeout.connect(plotData) # 定時刷新數據顯示
 timer.start(1) # 多少ms調用一次
 app.exec_()

感謝各位的閱讀!關于“怎么使用Python串口實時顯示數據并繪圖”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

海阳市| 文化| 凤凰县| 丰台区| 蕲春县| 依兰县| 舒兰市| 建水县| 启东市| 吉隆县| 汾西县| 宣恩县| 通江县| 永清县| 乐平市| 江门市| 体育| 确山县| 蓝田县| 鹿泉市| 桐庐县| 濉溪县| 日照市| 陆河县| 蓬安县| 通许县| 名山县| 柘城县| 天长市| 宣武区| 志丹县| 中江县| 江都市| 专栏| 西平县| 康保县| 岳池县| 青岛市| 临泽县| 白山市| 黔江区|