python-xbee无法读取线程中的帧
python-xbee cannot read frame in thread
我正在使用一个 XBee S2 作为协调器(API 模式),3 个 XBee S2 作为路由器(AT 模式)。路由器连接到 Naze32 板(使用 MSP)。
在计算机端,我有一个 GUI 使用 wxpython 发送命令来请求数据。
GUI 将每秒向 XBee(协调器)发送命令以从路由器请求数据。
我正在使用 python-xbee 库在计算机端执行发送和接收帧作业。一旦收到新数据,它会通知 GUI 用新数据更新一些标签。
目前我可以在线程外发送和接收帧,但是一旦我将发送和接收函数移到线程中,它就再也无法读取帧了。因为我不想让串行停止 GUI 或让它不响应。另一件事是,如果我关闭线程,然后再次使用 xbee 启动新线程,它将不再工作。
通信由 GUI 上的按钮控制;单击 "Turn on" 后,"self._serialOn" 将设置为 True,然后创建新线程;单击 "Turn off" 后,"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
这个问题最终通过 python 的多处理而不是线程解决了。
在 python-xbee 的手册中提到“...确保对外部状态的更新是 thread-safe...”。同样在源代码中,使用了线程。
所以我猜在这种情况下线程会导致问题。
无论如何,使用多处理终于可以了。
我正在使用一个 XBee S2 作为协调器(API 模式),3 个 XBee S2 作为路由器(AT 模式)。路由器连接到 Naze32 板(使用 MSP)。 在计算机端,我有一个 GUI 使用 wxpython 发送命令来请求数据。 GUI 将每秒向 XBee(协调器)发送命令以从路由器请求数据。
我正在使用 python-xbee 库在计算机端执行发送和接收帧作业。一旦收到新数据,它会通知 GUI 用新数据更新一些标签。
目前我可以在线程外发送和接收帧,但是一旦我将发送和接收函数移到线程中,它就再也无法读取帧了。因为我不想让串行停止 GUI 或让它不响应。另一件事是,如果我关闭线程,然后再次使用 xbee 启动新线程,它将不再工作。
通信由 GUI 上的按钮控制;单击 "Turn on" 后,"self._serialOn" 将设置为 True,然后创建新线程;单击 "Turn off" 后,"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
这个问题最终通过 python 的多处理而不是线程解决了。
在 python-xbee 的手册中提到“...确保对外部状态的更新是 thread-safe...”。同样在源代码中,使用了线程。
所以我猜在这种情况下线程会导致问题。
无论如何,使用多处理终于可以了。