код Python для последовательных данных для печати в окне.

Я довольно новичок в Python и Pyserial. Мой компьютер был установлен с python 2.7.4 с pyserial, и я хочу напечатать последовательно полученные данные в отдельном окне на моем компьютере. Сначала должно быть открыто окно, затем после этого на нем должны быть напечатаны серийные данные. Здесь окно должно быть открыто один раз, и последовательные данные должны непрерывно печататься в окне, пока устройство не прекратит передачу данных. Я пытался с этим кодом, но это бесполезно. пожалуйста, кто-нибудь, помогите мне с кодом.

import serial
import Tkinter
from Tkinter import *
s = serial.Serial('COM10',9600)    # open serial port
master = Tk()
master.geometry("1360x750")        # a window pop up with width (1360) and height(750)     which exatly fits my monitor screen..

while 1:
if s.inWaiting():
text = s.readline(s.inWaiting())
frameLabel = Frame( master, padx=40, pady =40)
frameLabel.pack()
w = Text( frameLabel, wrap='word', font="TimesNewRoman 37")
w.insert(12.0,text )
w.pack()
w.configure( bg=master.cget('bg'), relief='flat', state='Normal' )

mainloop()
 Steve05 июн. 2013 г., 14:36
Большое спасибо за ваш быстрый ответ. Я попробую с функциями в цикле tkinter.
 FabienAndre05 июн. 2013 г., 13:37
Вы могли бы взглянуть на первую часть этого ответаstackoverflow.com/a/14040516 , Он показывает, как многократно вызывать функцию в цикле tkinter. Это в основном то, что вы хотите сделать вместоwhile True петля.

Ответы на вопрос(1)

Решение Вопроса

что у вас есть два цикла, которые должны постоянно работать: основной цикл для графического интерфейса пользователя и цикл для передачи последовательных данных. Чтобы решить эту проблему, нужно запустить новый поток для получения содержимого последовательного порта и поместить его вQueueи периодически проверяйте в потоке GUI содержимое этой очереди:

import serial
import threading
import Queue
import Tkinter as tk


class SerialThread(threading.Thread):
    def __init__(self, queue):
        threading.Thread.__init__(self)
        self.queue = queue
    def run(self):
        s = serial.Serial('COM10',9600)
        while True:
            if s.inWaiting():
                text = s.readline(s.inWaiting())
                self.queue.put(text)

class App(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.geometry("1360x750")
        frameLabel = tk.Frame(self, padx=40, pady =40)
        self.text = tk.Text(frameLabel, wrap='word', font='TimesNewRoman 37',
                            bg=self.cget('bg'), relief='flat')
        frameLabel.pack()
        self.text.pack()
        self.queue = Queue.Queue()
        thread = SerialThread(self.queue)
        thread.start()
        self.process_serial()

    def process_serial(self):
        while self.queue.qsize():
            try:
                self.text.delete(1.0, 'end')
                self.text.insert('end', self.queue.get())
            except Queue.Empty:
                pass
        self.after(100, self.process_serial)

app = App()
app.mainloop()

У меня нетЯ пробовал эту программу, но я думаю, что вы можете получить общее представление о том, как ее использовать.

 Steve05 июн. 2013 г., 15:42
Теперь я получаю серийные данные, которые печатаются на экране моего компьютера.
 FabienAndre05 июн. 2013 г., 14:10
Isn»t последовательный объект, предоставляющий API-интерфейс, подобный очереди, и, следовательно, достаточный для использования в качестве очереди? Другими словами, будет проверкаinWaiting() и чтение прямо изprocess_serial петли хватит?
 Steve05 июн. 2013 г., 15:48
@ А.Родас. все отлично. если устройство передает две строки данных ASCII через последовательный порт, то мой компьютер получит данные и распечатает их в окне. В следующий раз, когда я получу последовательные данные от устройства, я хочу, чтобы только эти данные были напечатаны в моем окне, я не хочу, чтобы предыдущие полученные данные были в моем окне.
 Steve06 июн. 2013 г., 13:22
@ A.Rodas, пожалуйста, попробуйте дать решение для моего комментария. жду твоего ответа.
 A. Rodas05 июн. 2013 г., 14:32
@FabienAndre Проблема не в чтении с последовательного порта, а в том, что вы запускаете два цикла одновременно. Очередь (в сочетании сafterМетод) - это безопасный способ связи двух потоков без зависания графического интерфейса.
 A. Rodas05 июн. 2013 г., 15:11
@FabienAndre Вы также можете сделать это, но затем информация извлекается периодически каждые 100 миллисекунд (так что вы неУ него не должно быть циклов, кроме основного цикла Tkinter), в то время как при другом подходе содержимое читается в тот же момент, что и отправленный.
 A. Rodas05 июн. 2013 г., 15:52
@Steve Рад, что это помогло;) Не стесняйтесь принять ответ, если это решило вашу проблему.
 A. Rodas08 июн. 2013 г., 14:44
@ Steve Я отредактировал свой вопрос, в том числе о том, как удалить предыдущий контент, который также был заданВот (Полагаю, единственная причина этого совпадения в том, что это своего рода домашняя работа).
 FabienAndre05 июн. 2013 г., 14:50
Я полностью согласен с тем, что очередь является правильным способом обработки двух потоков. Мой вопрос был, если в этом случае необходимо (и почему) использовать второй поток вместо чтения серийных из Tkinterafter loop, Как попытка быть более явным, почему бы просто не заменитьqueue.qsize проверить поserial.inWaiting а такжеqueue.get от ?serial.read
 Steve05 июн. 2013 г., 16:05
Я объясню вкратце: мой компьютер получил серийные данные и напечатал их в окне, эти данные должны быть в окне, пока я снова не получу серийные данные. но когда я получаю вторые последовательные данные, первые полученные данные должны исчезнуть из окна, а вторые полученные данные должны быть напечатаны в моем окне. Нет периодов времени для устройства, которое передает данные. Я должен напечатать первый отправленный серийный номер данные в окне моего компьютера должны отображаться до тех пор, пока не появятся вторые последовательные данные. Но первые полученные данные в окне должны просто исчезнуть, прежде чем вторые полученные данные будут напечатаны в окне.

Ваш ответ на вопрос