最近有需要接收uart并画图进行分析。因此参考了下文 做了些小修改。
用Python串口实时显示数据并绘图
import array
import serial
import threading
import numpy as np
import time
import pyqtgraph as pg
from queue import Queue
fp = 0
i = 0
q = Queue(maxsize=0)
def Serial():
global i;
global q;
while(True):
n = mSerial.inWaiting()
if(n):
data = mSerial.read(n)
print("Get port data:%s,%d,%d"%(data,n,len(data)))
for index in range(len(data)):
print("Queue data send 0X%x" % (data[index]))
q.put(data[index])
#ppg = (data[0] << 8) | data[1]
#print(type(ppg))
#print("PPG is %d" % (ppg))
#print("Get port data:%x"%(data))
'''
for index in range(len(data)):
print("His name is %d" % (data[index]))
print("data num:",n)
print(type(data))
'''
'''
f = open("data/model_Weight.txt",'a') #若文件不存在,系统自动创建。'a'表示可连续写入到文件,保留原内容,在原
#内容之后写入。可修改该模式('w+','w','wb'等)
f.write("hello,sha") #将字符串写入文件中
f.write("\n") #换行
if __name__=='__main__':
fw = open("/exercise1/data/query_deal.txt", 'w') #将要输出保存的文件地址
for line in open("/exercise1/data/query.txt"): #读取的文件
fw.write("\"poiName\":\"" + line.rstrip("\n") + "\"") # 将字符串写入文件中
# line.rstrip("\n")为去除行尾换行符
fw.write("\n") # 换行
a = line[0:-1]
print(a)
dat = int.from_bytes(a, byteorder='big', signed=False) # 格式转换
print("Get data ",dat)
q.put(dat)
'''
def plotData():
global i;
if i < historyLength:
if(q.empty()==False):
if(q.qsize()%2 == 0):
char_high = q.get()
char_low = q.get()
qqg_data = char_high << 8 | char_low
print("PPG data %d" %(qqg_data))
#show_data = int.from_bytes(qqg_data, byteorder='big', signed=False)
#print("show_data %d" % (show_data))
data[i] = qqg_data
i = i + 1
data1= open("ppg.txt", 'a')
print("PPG data: %d" %(qqg_data), file=data1)
data1.close()
else:
if (q.empty() == False):
if(q.qsize()%2 == 0):
char_high = q.get()
char_low = q.get()
qqg_data = char_high << 8 | char_low
print("PPG data %d" %(qqg_data))
data1= open("ppg.txt", 'a')
print("PPG data %d" %(qqg_data), file=data1)
data1.close()
data[:-1] = data[1:]
data[i - 1] = qqg_data
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') # 可动态改变数组的大小,uint16_t 型数组
historyLength = 300 # 横坐标长度
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, 10000], 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 = 'COM20'
bps = 115200
# 串口执行到这已经打开 再用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_()