使用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_()
四、通过多线程实现串口数据的实时绘图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(dat7): 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() # 关闭端口 th1 = threading.Thread(target=Serial) th1.start() timer = pg.QtCore.QTimer() timer.timeout.connect(plotData) # 定时刷新数据显示 timer.start(1) # 多少ms调用一次 app.exec_()
以上这篇使用Python串口实时显示数据并绘图的例子就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 明达年度发烧碟MasterSuperiorAudiophile2021[DSF]
- 英文DJ 《致命的温柔》24K德国HD金碟DTS 2CD[WAV+分轨][1.7G]
- 张学友1997《不老的传说》宝丽金首版 [WAV+CUE][971M]
- 张韶涵2024 《不负韶华》开盘母带[低速原抓WAV+CUE][1.1G]
- lol全球总决赛lcs三号种子是谁 S14全球总决赛lcs三号种子队伍介绍
- lol全球总决赛lck三号种子是谁 S14全球总决赛lck三号种子队伍
- 群星.2005-三里屯音乐之男孩女孩的情人节【太合麦田】【WAV+CUE】
- 崔健.2005-给你一点颜色【东西音乐】【WAV+CUE】
- 南台湾小姑娘.1998-心爱,等一下【大旗】【WAV+CUE】
- 【新世纪】群星-美丽人生(CestLaVie)(6CD)[WAV+CUE]
- ProteanQuartet-Tempusomniavincit(2024)[24-WAV]
- SirEdwardElgarconductsElgar[FLAC+CUE]
- 田震《20世纪中华歌坛名人百集珍藏版》[WAV+CUE][1G]
- BEYOND《大地》24K金蝶限量编号[低速原抓WAV+CUE][986M]
- 陈奕迅《准备中 SACD》[日本限量版] [WAV+CUE][1.2G]