python xbee无法读取线程中的帧

python xbee无法读取线程中的帧,python,multithreading,wxpython,xbee,Python,Multithreading,Wxpython,Xbee,我使用一个XBee S2作为协调器(API模式),3个XBee S2作为路由器(AT模式)。路由器连接到Naze32板(使用MSP)。 在计算机方面,我有一个GUI,它使用wxpython发送命令来请求数据。 GUI将向XBee(协调器)发出命令,每秒从路由器请求数据 我正在使用PythonXBee库在计算机端执行发送和接收帧的工作。一旦收到新数据,它将通知GUI使用新数据更新一些标签 目前,我可以在线程外发送和接收帧,但一旦我将发送和接收函数移动到线程,它将无法再读取帧。因为我不想让串口停止G

我使用一个XBee S2作为协调器(API模式),3个XBee S2作为路由器(AT模式)。路由器连接到Naze32板(使用MSP)。 在计算机方面,我有一个GUI,它使用wxpython发送命令来请求数据。 GUI将向XBee(协调器)发出命令,每秒从路由器请求数据

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

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

通信由GUI上的按钮控制;单击“打开”后,“self.\u serialOn”将设置为True,然后创建新线程;单击“关闭”后,“self.\u 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

这个问题最终通过多处理而不是python线程解决了

在PythonXBEE的手册中,它提到“…确保对外部状态的更新是线程安全的…”。源代码中也使用了线程

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


不管怎样,使用多处理,它最终会起作用。

这个问题最终通过多处理而不是python的线程化得到解决

在PythonXBEE的手册中,它提到“…确保对外部状态的更新是线程安全的…”。源代码中也使用了线程

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

无论如何,使用多处理技术,它最终会起作用