当前位置: 首页 > 知识库问答 >
问题:

python实时绘制串口数据有很大的滞后性

居和顺
2023-03-14

我正在尝试从串行端口读取数据,并使用matplot在图形中绘制数据。下面是我的代码:我看到由于绘图,有巨大的延迟(队列中的数据高达10000字节),因此我看不到实时绘图。如果我做错了什么,你能帮我一下吗。

import serial # import Serial Library
   import numpy  # Import numpy
   import matplotlib.pyplot as plt 

   Accelerometer= []
   COM_read = serial.Serial('COM5', 9600, timeout=None,parity='N',stopbits=1,rtscts=0) #Creating our serial object name
plt.ion() #Tell matplotlib you want interactive mode to plot live data
cnt=0
COM_read.flushInput()
COM_read.flushOutput()
def makeFig(): #Create a function that makes our desired plot

    plt.title('My Live Streaming Sensor Data')      #Plot the title
    plt.grid(True)                                  #Turn the grid on
    plt.ylabel('Acc in g')                          #Set ylabels
    plt.plot(Accelerometer, 'ro-', label='Accelerometer g') #plot the temperature
    plt.legend(loc='upper left')                    #plot the legend
    plt.ylim(15000,30000)                           #Set limits of second y axis- adjust to readings you are getting


print "came through"
while True: # While loop that loops forever
    print COM_read.inWaiting()
    while (COM_read.inWaiting()==0): #Wait here until there is data
            pass #do nothing
    s  = COM_read.readline() #read the line of text from the serial port
    decx = int(s[0:4],16)
    decy = int(s[5:9],16)
    decz = int(s[10:14],16)
    if decx > 32768:
          decx = decx - 65536;
    if decy > 32768:
         decy = decy - 65536;
    if decz > 32768:
         decz = decz - 65536;
    #print decx,decy,decz
    res = ((decx*decx) + (decy*decy) + (decz*decz))**(1.0/2.0)




    Accelerometer.append(res)                     #Build our Accelerometer array by appending temp readings

    drawnow(makeFig)                       #Call drawnow to update our live graph
    plt.pause(.000001)                     #Pause Briefly. Important to keep drawnow from crashing

    cnt=cnt+1
    if(cnt>50):                            #If you have 50 or more points, delete the first one from the array
        Accelerometer.pop(0)               #This allows us to just see the last 50 data points
import serial
import matplotlib
import threading, time
import pylab
import matplotlib.pyplot as plt
import matplotlib.animation as anim

    class MAIN:
    #ser =0;
    def __init__(self):
        self.res = 0.0
        self.ser = serial.Serial('COM5', 9600, timeout=None,parity='N',stopbits=1,rtscts=0)
        self.ser.flushInput()
        elf.ser.flushOutput()
        c = self.ser.read(1);
        while(c != '\n'):
            =self.ser.read(1)
    return

    def acquire_data(self):
        s = self.ser.readline()
        decx = int(s[0:4],16)
        decy = int(s[5:9],16)
        decz = int(s[10:14],16)
        if decx > 32768:
            decx = decx - 65536;
        if decy > 32768:
            decy = decy - 65536;
        if decz > 32768:
            decz = decz - 65536;


    self.res = ((decx*decx) + (decy*decy) + (decz*decz))**(1.0/2.0)
    print self.res
    return

ex = MAIN()
threading.Timer(2,ex.acquire_data).start() #starts function acquire_data every 2 sec and resets self.res with 0.5Hz
fig, ax = plt.subplots()
ax.plot(time.time(), self.res, 'o-')
print "closed"

共有1个答案

朱丰
2023-03-14

在大多数情况下,一个while-true循环是个坏主意。

在大多数情况下,非面向对象编程是个坏主意。

在大多数情况下,将情节数据追加到列表中是个坏主意(滞后)。

在定义的时间使用启动数据采集

import threading, time
threading.Timer(2, acquire_data).start() #starts function acquire_data every 2 sec and resets self.res with 0.5Hz

然后,请为您自己的利益定义基于类的函数,而不是while循环:

class MAIN:
 def __init__(self):
    self.res = 0

 def acquire_data(self):
    ....
    return self.res

策划

fig, ax = plt.subplots()
ax.plot(time.time(), self.res, 'o-')

向眼镜蛇博士问好

 类似资料:
  • 为了绘制一个地区的障碍物,我计划使用与Arduino Mega连接的夏普红外测距仪,然后尝试使用python和matplotlib在极地直方图类型地图上实时绘制。我对如何继续通过串行连接的Arduino和python接口有点困惑。 任何帮助都会很好。 谢谢

  • 我正在尝试构建一个代码,以便在我的代码和我的Arduino Uno之间进行通信。我有一个温度传感器(tmp36)连接到COM3中的Arduino板,我想实时绘制温度值。我还有一个开始按钮,用来开始获取数据并将其绘制在图形中,还有一个停止按钮用来停止这样做。当我运行代码时,我收到一条消息:“无法将字符串转换为float:b'Anal'”,参考第19行:“data=np.append(data,flo

  • 本文向大家介绍使用Python串口实时显示数据并绘图的例子,包括了使用Python串口实时显示数据并绘图的例子的使用技巧和注意事项,需要的朋友参考一下 使用pyserial进行串口传输 一、安装pyserial以及基本用法 在cmd下输入命令pip install pyserial 注:升级pip后会出现 "‘E:\Anaconda3\Scripts\pip-script.py' is not p

  • 我在Scala中查看幻灯片函数中的Spark。

  • 我注意到,当我在DataFrame上使用窗口函数后,如果我用函数调用map()时,Spark会返回一个“Task not serializable”异常这是我的代码: 这是堆栈跟踪: 异常:任务不可序列化在org.apache.spark.util.ClosureCleaner$.EnsureClealizable(ClosureCleaner.scala:304)在org.apache.spar

  • 我正在用Apache Storm 1.1.2和Kafka0.11在Java9中构建一个Spring应用程序 我注意到,在高负载(每秒2500条消息)下,Kafka喷口有一个非常高的滞后。Kafka喷口有一个平行性提示3。滞后几乎等于喷口提交的偏移。 这个滞后设置了拓扑每秒可以摄取的最大消息量的上限,这并不是很大。有人知道解决这个问题的办法吗? 更新:我还注意到,即使有10个工作者和4个并行性提示,