Как решить эту проблему заговора в последовательной связи? - PullRequest
0 голосов
/ 12 января 2019

Вот этот простой код:

#import serial
from tkinter import *
from matplotlib import pyplot as plt
import matplotlib.animation as animation
from matplotlib import style
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import serial

fig = plt.gcf()
fig.show()
fig.canvas.draw()



ser = serial.Serial('COM35', 115200, timeout=.1)
while True:
  data = ser.readline()
  print(data)
  plt.plot(data)
  fig.canvas.draw()

теперь, когда я запускаю это, я получаю что-то вроде этого ... на картинке enter image description here
и значения данных таковы enter image description here

но мне нужно вывести что-то вроде этого (это непрерывный график) .. enter image description here

но после добавления ключевого слова списка к list(ser.readline()) я получаю эту ошибку .. enter image description here

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Вы также можете перейти на использование animation модуля matplotlib - этот ответ во многом вдохновлен tacaswell ответом до Как обновить значения из последовательный порт в анимациях matplotlib?

Тот же генератор данных:

from itertools import cycle 
data = [0,0,0,0,0,0,0,0,0,2,25,64,92,119,132,139,124,123,103,71,38,3]
cyc = cycle(data)

def serial():
    from random import randint
    def create_data():
        for k in range(randint(2,3)): 
            yield next(cyc) 
    return list(create_data())

from matplotlib import pyplot as plt
from matplotlib import animation
import numpy as np

fig = plt.figure()
ax = plt.axes(xlim=(0, 150), ylim=(-200, 200)) 
max_points = 150
# fill initial artist with nans (so nothing draws)
line, = ax.plot(np.arange(max_points), 
                np.ones(max_points, dtype=np.float)*np.nan, 
                lw=2)
def init():
    return line,

def animate(i):
    y = serial() # arduino.readline()
    old_y = line.get_ydata()               # adjusted here for this question data, coming
    new_y = np.r_[old_y[len(y):], y]       # in as chunks rather then single values
    line.set_ydata(new_y)
    return line,


anim = animation.FuncAnimation(fig, animate, init_func=init, frames=200, interval=20, blit=False) 
plt.show()

Адаптация к коду @ tacaswell обусловлена ​​тем фактом, что для данных вопросов требовались другие ограничения для выходного графа и что данные, поступающие для , в этом вопросе предоставляют несколько порций данных, а не отдельные значения , «Обновление данных» в def animate(i) должно быть адаптировано для этого.

0 голосов
/ 12 января 2019

Этот ответ не так элегантен, как использование animation-api - но он работает.

Вы должны адаптироваться довольно много - ради примера Минимальный, Полный и Проверяемый Мне пришлось реализовать свой собственный "серийный" поставщик данных:

from itertools import cycle 
data = [0,0,0,0,0,0,0,0,0,2,25,64,92,119,132,139,124,123,103,71,38,3]
cyc = cycle(data)

def serial():
    from random import randint
    def create_data():
        for k in range(randint(2,3)): 
            yield next(cyc) 
    return list(create_data())

Один из способов ее решения:

Вам также необходимо получить оси вашего графика, чтобы отрегулировать отображаемую «область», затем вам нужно указать правильные значения x в качестве «времени» и значения y в виде чтения из серийного номера (вы можете увеличивать переменную «сколько данных получено» при каждом извлечении в течение времени ):

from tkinter import *
from matplotlib import pyplot as plt 


fig, ax = plt.subplots() 
ax.set_ylim(-200, 200)
ax.set_xlim(0,110)
fig.show()
fig.canvas.draw() 

time = 0
last = 0
while True:
    # "animate" x-axis
    if time > 100:
        ax.set_xlim(time-100,time+10)
    data = serial()
    print(data)
    # add the last datapoint again so you get a continuous curve
    plt.plot([time-1]+[time+x for x in range(len(data))], [last]+data)
    # increment time
    time += len(data)
    # remember last data-value
    last = data[-1]
    fig.canvas.draw()

Чтобы получить (текстовый вывод опущен - он просто повторяет данные сверху по-разному в разбивке):

animation

По цветным отрезкам линий видно, какие данные были добавлены вместе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...