2017-05-16 2 views
0

Ich habe eine einfache GUI mit Wxpython zum Lesen von Daten von einem seriellen Anschluss erstellt. Basierend auf mehreren Stellen war ich an die serielle Schnittstelle angeschlossen werden können, wenn ich drücken Sie die Connect-Taste und die Daten drucken, wenn i starten Taste drücken, aber ich drücken Sie die Stopp Taste Ich kann nicht Stoppen Sie den Druck der Daten.Start/Stop-Tasten zum Lesen von seriellen mit Wxpython

Hier ist mein Code (innen sind die Links zu den Pfosten refered vorher):

# -*- coding: utf-8 -*- 

import wx 
import wx.xrc 
import serial 
import time 
import threading 

class MyFrame (wx.Frame): 

    def __init__(self, parent): 
     wx.Frame.__init__ (self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size(500,300), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL) 

     self.SetSizeHintsSz(wx.DefaultSize, wx.DefaultSize) 

     bSizer1 = wx.BoxSizer(wx.HORIZONTAL) 

     bSizer2 = wx.BoxSizer(wx.VERTICAL) 

     self.connectBtn = wx.Button(self, wx.ID_ANY, u"Connect", wx.DefaultPosition, wx.DefaultSize, 0) 
     bSizer2.Add(self.connectBtn, 0, wx.ALL, 5) 

     self.startBtn = wx.Button(self, wx.ID_ANY, u"Start", wx.DefaultPosition, wx.DefaultSize, 0) 
     bSizer2.Add(self.startBtn, 0, wx.ALL, 5) 

     self.stopBtn = wx.Button(self, wx.ID_ANY, u"Stop", wx.DefaultPosition, wx.DefaultSize, 0) 
     bSizer2.Add(self.stopBtn, 0, wx.ALL, 5) 


     bSizer1.Add(bSizer2, 0, wx.EXPAND, 5) 

     bSizer3 = wx.BoxSizer(wx.VERTICAL) 

     self.m_textCtrl1 = wx.TextCtrl(self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0) 
     bSizer3.Add(self.m_textCtrl1, 1, wx.ALL|wx.EXPAND, 5) 

     self.ser = None 
     self.settings = {'PORT':'COM3' , 'BAUDRATE':9600} 
     self.connected = False 
     bSizer1.Add(bSizer3, 1, wx.EXPAND, 5) 

     self.SetSizer(bSizer1) 
     self.Layout() 

     self.Centre(wx.BOTH) 

     # Connect Events 
     self.connectBtn.Bind(wx.EVT_BUTTON, self.connectBtnOnButtonClick) 
     self.startBtn.Bind(wx.EVT_BUTTON, self.startBtnOnButtonClick) 
     self.stopBtn.Bind(wx.EVT_BUTTON, self.stopBtnOnButtonClick) 

    def __del__(self): 
     pass 

    # Virtual event handlers, overide them in your derived class 
    def connectBtnOnButtonClick(self, event): 
     # http://stackoverflow.com/questions/11092417/reconnecting-to-device-with-pyserial 
     try: 
      if self.ser == None: 
       self.ser = serial.Serial(self.settings['PORT'], 
             self.settings['BAUDRATE'],timeout=10) 
       # print "Successfully connected to port %r." % self.ser.port 
       self.connectBtn.SetLabel('Disconnect') 
       self.connected = True 
       return True 
      else: 
       if self.ser.isOpen(): 
        self.ser.close() 
        self.connected = False 
        self.connectBtn.SetLabel('Connect') 
        # print "Disconnected." 
        return False 
       else: 
        self.ser.open() 
        self.connected = True 
        self.connectBtn.SetLabel('Disconnect') 
        # print "Connected." 
        return True 
     except serial.SerialException, e: 
      return False 

    def startBtnOnButtonClick(self, event): 
     while self.connected: 
      self.connected = True 
      while True: 
       if (self.ser.inWaiting() > 0): 
        data_str = self.ser.read(self.ser.inWaiting()) 
        print(data_str.strip()) 
        time.sleep(0.1) 

    def stopBtnOnButtonClick(self, event): 
     self.connected = False 
     # self.connected = False 
     # http://stackoverflow.com/questions/17553543/pyserial-non-blocking-read-loop 

if __name__ == "__main__": 
    app = wx.App(redirect=False) 
    frame = MyFrame(None) 
    #app.SetTopWindow(frame) 
    frame.Show(True) 
    app.MainLoop() 

Danke. Ivo

Antwort

1

Im Grunde denke ich, dass Ihre startBtnOnButtonClick ist ein „langer laufender Prozess“ und Sie müssen wx.Yield() anrufen vor oder nach Ihrem sleep.
Damit wird Ihr Programm mit der main loop überprüft, ob noch etwas anderes aufgetreten ist, d. H. Sie haben die Stopp-Taste gedrückt.
See: https://wiki.wxpython.org/LongRunningTasks
ändern startBtnOnButtonClick die doppelte while Schleife

def startBtnOnButtonClick(self, event): 
    while self.connected: 
     if (self.ser.inWaiting() > 0): 
      data_str = self.ser.read(self.ser.inWaiting()) 
      print(data_str.strip()) 
      time.sleep(0.1) 
      wx.Yield() 
+0

Es ist großartig gearbeitet zu entfernen !!! Danke für all Ihre Hilfe, nämlich mit dem Code und den Links. Mit freundlichen Grüßen. Ivo – TMoover

Verwandte Themen