2017-02-10 60 views
1

我使用一个XBee S2作为协调器(API模式),3个XBee S2作为路由器(AT模式)。路由器连接到Naze32板(使用MSP)。 在计算机端,我有一个使用wxpython的GUI来发出命令来请求数据。 GUI将发出命令给XBee(协调器)每秒从路由器请求数据。python-xbee无法读取线程中的帧

我正在使用python-xbee库在计算机端执行发送和接收帧作业。一旦接收到新数据,它将通知GUI使用新数据更新一些标签。

目前我能够发送和接收一个线程外的帧,但是一旦我将发送和接收功能移动到一个线程,它将永远无法再读取一个帧。因为我不想让串口停止GUI或使其不响应。另一件事是如果我关闭线程,然后再次用xbee启动新线程,它将不再工作。

通信由GUI上的按钮控制;一旦“打开”点击,“self._serialOn”将设置为True,然后创建新的线程;一旦点击“关闭”,“self._serialOn”将被设置为False,并且线程被停止。

我该如何解决这个问题? 在此先感谢。

class DataExchange(object): 
    def __init__(self): 
     self._observers = [] 
     self._addressList = [['\x00\x13\xA2\x00\x40\xC1\x43\x0F', '\xFF\xFE'],[],[]] 
     self._serialPort = '' 
     self._serialOn = False 
     self.workerSerial = None 

    # serial switch 
    def get_serialOn(self): 
     return self._serialOn 

    def set_serialOn(self, value): 
     self._serialOn = value 
     print(self._serialOn) 
     if self.serialOn == True: 
      EVT_ID_VALUE = wx.NewId() 
      self.workerSerial = WorkerSerialThread(self, EVT_ID_VALUE, self.serialPort, self.addressList) 
      self.workerSerial.daemon = True 
      self.workerSerial.start() 
     elif self.serialOn == False: 
      self.workerSerial.stop() 
      del(self.workerSerial) 
      self.workerSerial = None 

    serialOn = property(get_serialOn, set_serialOn) 

class WorkerSerialThread(threading.Thread): 
    def __init__(self, notify_window, id, port, addresslist): 
     threading.Thread.__init__(self) 
     self.id = id 
     self.serialPort = port 
     self.addressList = addresslist 

     self.counter = 0 
     self._notify_window = notify_window 
     self.abort = False 
     self.sch = SerialCommunication(self.serialPort, self.addressList) 
     try: 
      self.sch.PreLoadInfo() 
     except: 
      print('failed') 

    def run(self): 
     while not self.abort: 
      self.counter += 1 
      print('Serial Working on '+str(self.id)) 
      self.sch.RegularLoadInfo() 
      #wx.PostEvent(self._notify_window, DataEvent(self.counter, self.id)) 
      time.sleep(1) 

    def stop(self): 
     self.sch.board.stop() 
     self.abort = True 

回答

0

这个问题终于用多处理而不是线程化的python解决了。

在python-xbee手册中,它提到“...确保对外部状态的更新是线程安全的......”。同样在源代码中,使用了线程。

所以我想在这种情况下,线程将导致问题。

无论如何,使用多处理它终于起作用。