【问题标题】:Plot Real Time Serial Data using Python - with Arduino使用 Python 绘制实时串行数据 - 使用 Arduino
【发布时间】:2021-02-24 17:34:04
【问题描述】:

我正在尝试构建一个代码来在我的代码和我的 Arduino Uno 之间进行通信。我在 COM3 中有一个连接到 Arduino 板的温度传感器(tmp36),我想实时绘制温度值。我还有一个开始按钮,开始获取数据并将其绘制在图表中,还有一个停止按钮来停止这样做。 当我运行我的代码时,我收到一条消息:“无法将字符串转换为浮点数:b'Anal'”,参考第 19 行:“data = np.append(data,float(a[0:4])) ”。你能告诉我有什么问题吗?你能阻止更多的错误吗? 感谢您的宝贵时间!

from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
from tkinter import *
import numpy as np
import serial as sr

root = Tk()
root.title("Communications")
root.geometry('1920x1080')
root.resizable(False, False)
root.configure(background='black')

data = np.array([])
cond = False

def plot_data():
    global cond, data
    if (cond == True):
        a = s.readline()
        a.decode()
        if(len(data) < 100):
            data = np.append(data,float(a[0:4]))
        else:
            data[0:99] = data[1:100]
            data[99] = float(a[0:4])
        lines.set_xdata(np.arange(0, len(data)))
        lines.set_ydata(data)
        graph_1.draw()
    root.after(1, plot_data)

def plot_start():
    global cond
    cond = True
    s.reset_input_buffer()

def plot_stop():
    global cond
    cond = False

#graph
fig1 = Figure(facecolor="#090b80", figsize=(16,9), dpi=75)
ax1 = fig1.add_subplot(111)

ax1.set_title('Temperature', color='white', fontsize=14, fontweight="bold")
ax1.set_xlabel('Time, s', color='white', fontsize=10, fontweight="bold")
ax1.set_ylabel('ºC', color='white', fontsize=10, fontweight="bold")
ax1.set_xlim(0, 100)
ax1.set_ylim(0, 50)
ax1.spines['bottom'].set_color('#ffffff')
ax1.spines['top'].set_color('#090b80')
ax1.spines['right'].set_color('#090b80')
ax1.spines['left'].set_color('#ffffff')
ax1.tick_params(axis='x', colors='#ffffff')
ax1.tick_params(axis='y', colors='#ffffff')
lines = ax1.plot([], [], color='white')[0]
ax1.set_facecolor("#090b80")

graph_1 = FigureCanvasTkAgg(fig1, master=root)
graph_1.get_tk_widget().place(x=10, y=10, width=540, height=344)
graph_1.draw()

control_frame = Frame(root, bg="#242729", width=893, height=501)
control_frame.place(x=663, y=467)

root.update()
button_1 = Button(control_frame, text="Start", bg="#1cba26", fg="white", font=('arial', 20,'bold'), padx=101, activebackground="#109419", activeforeground="white", borderwidth=0, relief=RAISED, cursor="hand2", command=lambda:plot_start())
button_1.place(x=10, y=107.5)

root.update()
button_2 = Button(control_frame, text="Stop", bg="#eb0c0c", fg="white", font=('arial', 20,'bold'), padx=101.4, activebackground="#990909", activeforeground="white", borderwidth=0, relief=RAISED, cursor="hand2", command=lambda:plot_stop())
button_2.place(x=304, y=107.5)

#start serial port
s = sr.Serial('COM3', 9600)
s.reset_input_buffer()

root.after(1, plot_data)

root.mainloop()

【问题讨论】:

标签: python matplotlib plot arduino serial-port


【解决方案1】:

我想这样设置一个超时:s = sr.Serial('COM3', 9600, timeout=1),但主要问题是:a=a.decode(),你不要使用a=。如果解码 ypu 数据,是这个字符串类型,但你使用列表。这个问题你能解决吗:

import ast

i = b'0,1,2,3,4,5,6,7,8,999' # i is a bytes type val
dec=i.decode() #decode this
print(type(dec))

ldat=ast.literal_eval(dec) #convert str to list

print (ldat[3])
print (ldat[9])#here can use more characters data

如果编写读取数据的示例行、arduino 示例和完整的错误消息,您可以帮助响应者。

祝你好运!

对不起,我的英语不太好。

【讨论】:

    猜你喜欢
    • 2012-12-09
    • 2014-09-10
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多