使用pyserial进行串口传输

一、安装pyserial以及基本用法

在cmd下输入命令pip install pyserial

注:升级pip后会出现 "‘E:Anaconda3Scriptspip-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)

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(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() # 关闭端口

th1 = threading.Thread(target=Serial)

th1.start()

timer = pg.QtCore.QTimer()

timer.timeout.connect(plotData) # 定时刷新数据显示

timer.start(1) # 多少ms调用一次

app.exec_()

以上这篇使用Python串口实时显示数据并绘图的例子就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持云海天教程。

python读取串口数据 绘图_使用Python串口实时显示数据并绘图的例子相关推荐

  1. python读取oracle数据库性能_用python对oracle进行简单性能测试

    一.概述 dba在工作中避不开的两个问题,sql使用绑定变量到底会有多少的性能提升?数据库的审计功能如果打开对数据库的性能会产生多大的影响?最近恰好都碰到了,索性做个实验. sql使用绑定变量对性能的 ...

  2. python 读取数据库内存爆_解决python读取几千万行的大表内存问题

    Python导数据的时候,需要在一个大表上读取很大的结果集. 如果用传统的方法,Python的内存会爆掉,传统的读取方式默认在内存里缓存下所有行然后再处理,内存容易溢出 解决的方法: 1)使用SSCu ...

  3. python读取文件编码错误_关于python 读取txt文件出现编码问题:

    python 读取txt文件出现编码问题:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xba in position 5: invalid ...

  4. python读取csv求平均数_利用Python读取CSV文件并计算某一列的均值和方差

    近日需要对excel的csv文件进行处理,求取某银行历年股价的均值方差等一系列数据 文件的构成很简单,部分如下所示 总共有接近七千行数据,主要的工作就是将其中的股价数据提取出来,放入一个数组之中,然后 ...

  5. python读取csv某些行_【Python】Python 读取csv的某行或某列数据

    站长用Python写了一个可以提取csv任一列的代码,欢迎使用. Github链接 csv是Comma-Separated Values的缩写,是用文本文件形式储存的表格数据,比如如下的表格: 就可以 ...

  6. python读取raw图片文件_在python下读取并展示raw格式的图片实例

    raw文件可能有些人没有,因此,先用一张图片创建一个raw格式的文件(其实可以是其他类型的格式文件) import numpy as np import cv2 img = cv2.imread('c ...

  7. python读取hdf文件 高效_利用python读取MODIS hdf文件

    1. 安装pyhdf package 2. 打开cmd 输入pip install pyhdf,显示找不到package 3. 登录http://www.lfd.uci.edu/~gohlke/pyt ...

  8. python读取文件特定内容_利用python代码获取文件特定的内容,并保存为文档

    import os.path import re # 1 遍历指定目录,显示目录下的所有文件名 def each_file(file_path): path_dir = os.listdir(file ...

  9. python读取pdf的标题_【python】使用python pdfminer3k读取pdf

    前言: 前几天学姐拿来一堆文件名乱码的pdf让帮忙整理一下,按论文标题命名 一看竟然一共250多个文件,还在不同的文件夹中,哇,想想就头疼,这时候就要发挥程序媛的智慧了,正好最近在用python写毕设 ...

  10. python读取日志错误信息_使用Python将Exception异常错误堆栈信息写入日志文件

    假设需要把发生异常错误的信息写入到log.txt日志文件中去: import traceback import logging logging.basicConfig(filename='log.tx ...

最新文章

  1. 怎样训练YOLOv3
  2. 39_上下采样、MaxPool2d、AvgPool2d、ReLU案例、二维最大池化层和平均池化层、填充和步幅、多通道
  3. saltstack自动化运维系列②之saltstack的数据系统
  4. sql的join语法解析
  5. 【MyBatis笔记】11-分步查询懒加载
  6. Android应用资源---其他资源类型(More Types)(二)
  7. 如何实现实时文本过滤
  8. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_06 Properties集合_3_Properties集合中的方法load...
  9. win10易升_WIN10更新升级至1803失败的解决办法
  10. N阶行列式计算(JAVA)
  11. cscope.exe程序的base64文本
  12. 我国期货市场发展潜力和方向
  13. 怎样用c语言制作文件保险箱,开题(电子保险箱)技巧.doc
  14. 硅芯思见:SystemVerilog中的类型转换有哪些
  15. 量子点对垒OLED,到底哪家强?
  16. https://api-hmugo-web.itheima.net 不在以下 request 合法域名列表中,请参考文档:https://developers.weixin.qq.com/minip
  17. 微软拼音配置小鹤双拼
  18. PAT乙级--1033 旧键盘打字(测试点2,测试点4解决)
  19. H5网页链接APP浏览器跳转小程序-邪少外链
  20. labview信号时序分析--谐波失真分析

热门文章

  1. 利用集群技术实现Web服务器负载均衡
  2. 烤仔星选·NFT实验室 | 非同质化代币在游戏领域的应用
  3. MNI坐标,world坐标和矩阵坐标互相转换
  4. 搭建社群积分系统,使用这个工具足以
  5. 十大管理之项目成本管理知识点
  6. linux系统文件空间清理摸9z,Linux下的文件加密
  7. 浅谈单片机低功耗处理
  8. AquaCrop_原理学习笔记01:AquaCrop模型简介
  9. 微信支付android白屏,android 解决微信登陆白屏样式问题
  10. 这届年轻人,是最孤独的一代吗?