Я хочу инициировать событие всякий раз, когда есть данные, которые нужно прочитать из последовательного порта во время работы графического интерфейса. Модуль pySerial, очевидно, имеет для этого экспериментальную функциональность, но она не очень хорошо документирована (я не смог найти полезных примеров в API).
Появляется такой вопрос. для решения той же или, по крайней мере, очень похожей задачи, но не содержит инструкций по ее повторению или примеров рабочего кода.
Я придумал этот код:
import tkinter as tk
import serial
import threading
# Create GUI window
window = tk.Tk()
# Initialize the port
myPort = serial.Serial('/dev/ttyUSB0')
# Function to call whenever there is data to be read
def readFunc(port):
port.readline()
print('Line read')
# Configure threading
t1 = threading.Thread(target = readFunc, args=[myPort])
t1.start()
# Main loop of the window
window.mainloop()
Запуск действительно вызывает событие, но только один раз. Почему это? Есть ли «рекомендуемый» способ сделать это, используя функциональность самого pySerial?
В качестве альтернативы я бы также запустил функцию для чтения и обработки данных о событии. как и с элементами графического интерфейса. Если это лучшее решение, как это можно сделать?
Связанный вопрос (без ответа), вероятно, делает этот вопрос дубликатом.
Изменить: здесь — это минимальный пример, полученный из ответа ниже, который меняет текст метки всякий раз, когда данные считываются во входящие данные:
import tkinter as tk
from serial import Serial
from serial.threaded import ReaderThread, Protocol
app = tk.Tk()
label = tk.Label(text="A Label")
label.pack()
class SerialReaderProtocolRaw(Protocol):
port = None
def connection_made(self, transport):
"""Called when reader thread is started"""
print("Connected, ready to receive data...")
def data_received(self, data):
"""Called with snippets received from the serial port"""
updateLabelData(data)
def updateLabelData(data):
data = data.decode("utf-8")
label['text']=data
app.update_idletasks()
# Initiate serial port
serial_port = Serial("/dev/ttyACM0")
# Initiate ReaderThread
reader = ReaderThread(serial_port, SerialReaderProtocolRaw)
# Start reader
reader.start()
app.mainloop()
Подробнее здесь: https://stackoverflow.com/questions/706 ... with-a-gui
Потоковое чтение последовательного порта в Python (с графическим интерфейсом) ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение