四、通过多线程实现串口数据的实时绘图import pyqtgraph as pg
这里主要开了一个线程去处理串口,剩下的和上面内容一样。
代码:
import arrayimport serialimport threadingimport numpy ...
四、通过多线程实现串口数据的实时绘图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() # 关闭端口
- 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 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
-
发表于 2020-01-03 09:35
- 阅读 ( 869 )
- 分类:Python开发