我正在写一些代码通过串行口与单片机通信。
MCU端基本上是一个请求/响应服务器。
一个或多个MCU发送我的请求。
然而,响应可以异步到达并且具有随机延迟,但是响应的顺序将保持不变。
另外,我的应用程序可以一次发送多个请求。在
我为每个请求创建一个线程。
只有一个公共线程用于从串行端口进行接收。在
目前的结构是这样的:
请求线程写入串行端口,将其标识添加到等待列表,然后等待事件。
接收线程接收响应,在等待列表中查找,如果匹配的请求线程正在等待,则删除等待列表条目,并设置事件。
请求线程将收到有关事件的通知并继续处理。
如果每个请求只收到一个响应,那么这种方法很有效。在
现在假设有两个响应。
在处理第一个响应之后,请求线程再次将自己添加到等待列表中,并等待另一个事件。在
通常,接收线程在接收到第二个响应时执行相同的操作来设置事件。在
但是,有时,第二个响应到达得太快,在请求线程等待第二个事件之前。在
示例代码如下。在
请求线程:send_a_request(req)
add_waitlist(req, self)
self.event = threading.Event()
if not self.event.wait(1):
remove_waitlist(req, self)
#time out processing
else:
# process 1st response
add_waitlist(req, self)
self.event = threading.Event()
if not self.event.wait(1):
remove_waitlist(req, self)
# timeout processing
else:
# process 2nd response
接收线程:
^{pr2}$