我正在编写一个脚本来测试使用pyserial模块热插拔串行设备。该脚本有一个处理写入的主线程和一个读取数据的线程。
主线程发送热插拔信号,该信号随后停止读线程,直到再次启动读线程时再次检测到该设备。主线程等待热插拔成功消息以确认热插拔成功(具有超时),并再次从发送热插拔message.The开始,当串行设备在连接上的第一个热插拔成功消息之后发送初始化消息时发生问题。
脚本第一次运行得很好。但是第二次,输入串行缓冲区仍然有一些数据( init消息),在读取任何新的成功和初始化消息之前,需要首先读取这些数据。这样做会使脚本在超时时丢失成功消息。
我希望在热交换上启动读线程之前完全刷新串行缓冲区并丢弃任何内容(也就是说,我不关心在热交换之前接收到了什么消息)。在收到热插拔成功消息后,我尝试使用ser.flushInput()/flushOutput()/flush()方法,但没有任何反应。仍然从缓冲区读取数据。我可以在下一次迭代之前引入一个time.sleep(5)来解决这个问题(从buffer中读取所有初始化),但是我想要一种更简洁的方法。
如何在获得成功消息后完全丢弃输入缓冲区中以前的初始化消息,以便下一次迭代在热插拔之前没有要读取的内容。我希望下面的序列图能清楚地说明这个问题,因为代码太大了,无法发布。
更新:我在某个地方读到一个人不能刷新输入,这是那些未定义的行为之一,就像在C中一样。
   Device           Main              Read         Device
                            -start->
                <-Hotplug-  -stop->
-DevcieAlive->
                <-open--    -start->
                                             <-( success + init )-
                            <-success-
                    ok
                <-Hotplug-  -stop->
-DeviceAlive->
                <-open-     -start->
                                             <-( old init + success + init )
                  timeout
                <-close-    -stop->发布于 2018-02-21 22:19:25
您可以使用py.flushOutput和py.flushInput刷新值。如果这不起作用,只需在关闭串行端口之前设置要作为任何垃圾值发送的值。
https://stackoverflow.com/questions/14270716
复制相似问题