2017-02-10 3 views
1

コーディネータ(APIモード)として1つのXBee S2を、ルータ(ATモード)として3つのXBee S2を使用しています。ルータはNaze32ボードに接続されています(MSPを使用)。 コンピュータ側では、wxpythonを使用してデータを要求するコマンドを送信するGUIがあります。 GUIはXBee(コーディネータ)にコマンドを送り、ルータから毎秒データを要求します。Python-xbeeはスレッド内のフレームを読み取ることができません

私はpython-xbeeライブラリを使用して、コンピュータ側で送受信フレームジョブを実行しています。新しいデータが受信されると、新しいデータでいくつかのラベルを更新するようにGUIに通知します。

現在、スレッド外でフレームを送受信できますが、送信と受信の機能をスレッドに移動すると、それ以上フレームを読み取ることはできなくなります。私はシリアルでGUIを停止させたり、応答しないようにしたくないからです。もう1つは、スレッドを閉じてから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のマニュアルでは、「...外部状態への更新がスレッドセーフであることを確認してください...」と記載されています。また、ソースコードではスレッディングが使用されていました。

だから、この場合にはスレッディングが問題になると思います。

とにかく、マルチプロセッシングを使用して、最終的に動作します。

関連する問題