【问题标题】:open, display and close serial port in Python在 Python 中打开、显示和关闭串口
【发布时间】:2015-01-14 05:18:03
【问题描述】:

我想制作一个可以打开串口、在文本小部件中显示接收到的值并关闭它的 gui。打开串行端口已完成,但我找不到在文本小部件中显示接收到的值的方法。此外,当我单击打开按钮时,gui 没有响应。这是因为 while 循环用于显示串口数据。我认为必须有串口数据接收事件,但我对此一无所知。如何在文本框中显示串口数据并在端口打开后使其他按钮响应。

from tkinter import *
import serial

root = None

class serial_window(Frame):
    ser = serial.Serial()
    #open = 0

    def serial_open(self):
        if (serial_window.ser.isOpen() == 0):
            serial_window.ser.baudrate = 9600
            serial_window.ser.port = 4-1
            serial_window.ser.open()

                self.after_idle(self.writeline)  #while True:
                print(serial_window.ser.readline())

    def serial_close(self):
        if (serial_window.ser.isOpen() == 1):
            serial_window.ser.close()

    def open(self):
        self.OPEN = Button(self, text = "OPEN", fg = "blue", command = self.serial_open)
        #self.OPEN["command"] = self.open_port
        self.OPEN.grid(row = 0, column = 0)

    def close(self):
        self.CLOSE = Button(self, text = "CLOSE", fg = "blue", command = self.serial_close)
        #self.OPEN["command"] = self.open_port
        self.CLOSE.grid(row = 0, column = 1)

    def exit_main(self):
        self.exit_main = Button(self, text = "EXIT", fg = "red", command = self.quit)
        self.exit_main.grid(row = 0, column = 2)

    def console(self):
        self.console = Text(self, fg = "red")
        self.console.grid(row = 1, column = 0, columnspan = 3)

    def writeline(self, event):
            self.console.insert('insert', serial_window.ser.readline())
            if serial_window.ser.isOpen():
                self.after_idle(self.writeline)

    def createWidgets(self):
        self.open()
        self.close()
        self.exit_main()
        self.console()

    def __init__(self, master = None):
        Frame.__init__(self, master)
        self.pack()
        self.createWidgets()


root = Tk()
app = serial_window(master = root)
app.mainloop()
root.destroy()

从串口连续接收到的数据是-'Monitoring \r\n'

【问题讨论】:

  • 很难复制您的问题,因为它取决于从实际串行端口读取。您能否修改它使其不依赖于它,而是读取数据,例如一个文件或一个预定义的列表。

标签: python-3.x text tkinter pyserial


【解决方案1】:

我建议将ser 设为实例而不是类变量。它将使代码更紧凑,甚至更快。但按代码回答...

您可以使用重复的回调方法写入您的 Text 小部件,例如

def writeline(self, event):
    self.console.insert('insert', serial_window.ser.readline())
    if serial_window.ser.isOpen():
        self.after_idle(self.writeline)  # or self.after(1, self.writeline)

将 serial_open 中的当前while True: 替换为回调中最后一行的副本,以启动回调循环。 readline 调用仍然会阻塞等待完整行,但其他事件将在回调返回后处理。

我不知道串行模块使用了多大的字符缓冲区,也不知道它如何与字符源握手。如果其他事件延迟下一次调用 writeline 的时间过长,字符可能会丢失。

【讨论】:

  • 我如上图编辑了程序。但问题似乎仍然存在。按下“打开”按钮后程序没有响应并且不显示串行数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-08
相关资源
最近更新 更多