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

时间:2015-11-18 03:41:43

标签: python tkinter raspberry-pi2

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

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()

1 个答案:

答案 0 :(得分:1)

您好,欢迎来到StackOverflow

您没有在代码中运行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语句用于stdout(print())或日志文件。

显示串行连接数据的另一件事是直接在root窗口或它下面的小部件中显示它(例如Tkinter.TextTkinter.ListBox将是我的小工具请注意。

总线脚本中使用的变量:   - 这里涉及的范围相同   - 您在bus=""中设置了def datos(int port):。你想在这里有一个局部变量,或者你想使用你在Tkinter.StringVar中声明的Main Routine吗? 如果您想使用StringVar,正确的初始化将是bus.set("")。将文字附加到bus.set("%s%s"%(bus.get(),d))。而不是使用" old" "%s"%var您还可以使用String.format()。   - 如果将StringVar用于总线,则需要将sensor_pH内的分配更改为pH.set(datos(port).get())