在Python中,当连接到端口时,如何在GtkTextview中附加来自Arduino的文本?

2024-03-29 12:39:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用以下代码:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import serial
import serial.tools.list_ports

import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk

class SerialComm(Gtk.Window):

glade = "serial_comm.glade"

builder = Gtk.Builder.new_from_file(glade)
builder.add_from_file(glade)

comboPorts = builder.get_object("comboPorts")
comboBauds = builder.get_object("comboBauds")
btn_conectar = builder.get_object("btnConectar")

textbuffer = builder.get_object("textbuffer")
textview = builder.get_object("textview")

def get_ports(self):
    ports = list(serial.tools.list_ports.comports())

    for p in ports:
        self.comboPorts.append_text(p[0])
        self.comboPorts.set_active(1)
        print(p[0])

尝试打开端口并获取arduino数据

def open_port(self, widget):
    port = self.comboPorts.get_active_text()
    baud = self.comboBauds.get_active_text()
    arduino = serial.Serial(port, baud)
    temp = arduino.readline()

    self.textbuffer.set_text(temp)
    self.textview.set_buffer(self.textbuffer)
    arduino.close()

def __init__(self):
    window = self.builder.get_object("window")
    window.connect("destroy", Gtk.main_quit)

    self.btn_conectar.connect("clicked", self.open_port)

    self.get_ports()

    window.show_all()

if __name__ == '__main__':
application = SerialComm()
Gtk.main()

但我必须点击一个按钮来获取数据(传感器的温度,每秒读取一次)。你知道吗

self.btn_open.connect("clicked", self.openport)

如何在单击按钮后自动更新textview内容?你知道吗


Tags: textimportselfgtkgetobjectportbuilder
2条回答

来自@theGtknerd的解决方案并不是很理想。使用g_timeout_add_seconds不是很好,您在数据接收上增加了1秒的延迟。使用g_timeout_add只会隐藏真正的问题:您正在进行轮询。你知道吗

相反,应该使用^{}在数据真正到达时调用回调。然而,这需要有一个GIOChannel可以被pyserial使用。GIOChannel可以从文件描述符上创建,我只是不知道如何从pyserial对象获取文件描述符,但这应该是可行的。。。你知道吗

更好的方法是打开端口并在信息进入时从中读取。示例:

from gi.repository import GLib #include this import with the rest of your imports

def open_port(self, widget):
    port = self.comboPorts.get_active_text()
    baud = self.comboBauds.get_active_text()
    self.textview.set_buffer(self.textbuffer)
    arduino = serial.Serial(port, baud)
    GLib.timeout_add_seconds(1, self.read_info, arduino)

def read_info (self, arduino)
    temp = arduino.readline()    
    self.textbuffer.set_text(temp)
    return True

相关问题 更多 >