使用与 Raspberry Pi 和 pH 传感器的串行通信更新 window 上的数据

Updating data on a window using serial communication with Raspberry Pi and pH sensor

我在使用 Tkinter 更新 window 上的数据时遇到了一些问题。我正在使用我的 raspberry pi 和具有串行通信功能的 Atlas Scientific pH 传感器。 window 工作得很好,但没有像我预期的那样更新数据,所以,我做错了什么?。这是代码。非常感谢您的帮助。

from Tkinter import *
import time
import serial

def datos(port):
    bus = ""
    while True:
        d = port.read()
        bus += d
        if d == '\r':   
            return bus

def sensor_pH():
    pH.set(datos(port))
    root.after(1000, sensor_pH)

port = serial.Serial('/dev/ttyAMA0', baudrate = 9600, timeout = 2)

port.write('L,1\r')#Command to turn the sensor's led on
port.write('C,1\r')#Command to read data, (pH), continuously every second

root = Tk()
root.geometry('300x300')
pH = IntVar()
bus = StringVar()

etpH = Label (root, text = 'pH: ') 
etpH.grid(row=0, column=0)
et1= Label(root, textvariable = pH)
et1.grid(row=0, column=9)

sensor_pH
root.mainloop()

您好,欢迎来到 Whosebug

您的代码中没有 运行 sensor_pH - 首先是 sensor_pH()。 另一件事 - 您没有在 def sensor_pH().

中使用正确的范围

尝试使用

def sensor_pH():
    global root, pH, port
    pH.set(datos(port))
    root.after(1000, sensor_pH)

Main Routine(全局作用域)中的变量不能直接在函数(局部作用域)中使用。要在那里使用它们而不将它们作为参数传递,您需要将它们声明为全局。

如果您想知道数据是否被正确读取,请将打印语句用于标准输出 (print()) 或日志文件。

显示串行连接数据的另一件事是直接将其显示在您的 root Window 或其下方的小部件中(例如 Tkinter.TextTkinter.ListBox为此我想到的小部件。

bus 脚本中使用的变量: - 这里关于范围相同 - 您正在 def datos(int port): 中设置 bus=""。你想在这里有一个局部变量还是想使用你在 Main Routine 中声明的 Tkinter.StringVar如果你想使用StringVar,正确的初始化应该是bus.set("")。向其附加文本将是 bus.set("%s%s"%(bus.get(),d))。除了使用 "old" "%s"%var,您还可以使用 String.format()。 - 如果将 StringVar 用于总线,则需要将 sensor_pH 中的赋值更改为 pH.set(datos(port).get())