3

私はpythonとpyserialにまったく慣れていません。私のPCにはpyserialを使用してpython 2.7.4がインストールされており、PCの別のウィンドウにシリアルで受信したデータを印刷したいと考えています。最初にウィンドウを開き、次にシリアル データをそのウィンドウに印刷する必要があります。ここでは、ウィンドウを一度開く必要があり、デバイスがデータの送信を停止するまで、シリアル データをウィンドウに継続的に出力する必要があります。このコードで試してみましたが、価値がありません。誰かがコードを手伝ってください。

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

1 に答える 1

8

ここでの問題は、常に実行する必要がある 2 つのループがあることです。GUI のメインループとシリアル データを送信するループです。これを解決するためにできることは、新しいスレッドを開始してシリアル ポートのコンテンツを受信し、それを に入れ、Queue定期的に GUI スレッドでこのキューのコンテンツをチェックすることです。

import serial
import threading
import time
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('/dev/ttyS0',9600)
        s.write(str.encode('*00T%'))
        time.sleep(0.2)
        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):
        value=True
        while self.queue.qsize():
            try:
                new=self.queue.get()
                if value:
                 self.text.delete(1.0, 'end')
                value=False
                 self.text.insert('end',new)
            except Queue.Empty:
                pass
        self.after(100, self.process_serial)

app = App()
app.mainloop()

このコードは、Pi3 ttyS0 シリアル ポートと、シリアル接続された PC およびスレーブ デバイスでテストされています。シリアル接続された単一のデバイスで 100% 動作します。

于 2013-06-05T11:52:44.817 に答える