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

使用Python和Arduino绘制实时串行数据

易元青
2023-03-14

我正在尝试构建一个代码,以便在我的代码和我的Arduino Uno之间进行通信。我有一个温度传感器(tmp36)连接到COM3中的Arduino板,我想实时绘制温度值。我还有一个开始按钮,用来开始获取数据并将其绘制在图形中,还有一个停止按钮用来停止这样做。当我运行代码时,我收到一条消息:“无法将字符串转换为float: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()

共有1个答案

寇靖
2023-03-14

我想可以设置一个超时: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示例和完整的错误消息

祝你好运!

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

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

  • 如标题所示,我使用的是一个Arduino,它沿串行端口输出数据。它的产出如下: 120 1.23 170 2.54 210 2.32 左栏是以毫秒为单位的时间,右栏是0到5V之间的电压值。它们被一个空格隔开。编辑:似乎stackoverflow不允许我以表格形式打印,所以为了清楚起见,我有120个空间1.23\换行符170个空间2.54等等。我正在使用的Arduino草图: 现在在python方面

  • 本文向大家介绍Python使用Pygame绘制时钟,包括了Python使用Pygame绘制时钟的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Python使用Pygame绘制时钟的具体代码,供大家参考,具体内容如下 前提条件: 需要安装pygame 功能: 1.初始化界面显示一个时钟界面 2.根据当前的时间实现时针、分针、秒针的移动 运行结果: 以上就是本文的全部内容,希望对大家的学

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

  • 我试图用python控制总共6个LED。我使用pyserial向arduino发送一些数据,但遇到了几个问题。 我遇到的第一个问题是: 根据我在arduino上编写的代码,LEDS应该在接收到的特定数据中闪烁1秒。(这稍后会在下面解释。)但是,LEDS停留在它们应该闪烁的秒数上。这意味着如果LEDS应该闪烁10次。LEDS保持10秒并关闭。 第二个问题是: 我在代码中输入的if条件不符合顺序。正如

  • 我在Windows 10 64位上使用Arduino Mega和python 3.7。我试图使用python和pySeries使灯泡闪烁。我希望灯泡保持亮x时间,并关闭y时间。我在python Tkinter程序中输入值:https://pastebin.com/zkRmcP60完整代码。在我输入值后,我通过此代码发送到Arduino: Tkinter程序执行上述功能访问Pastebin获取整个代