コーディネータ(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