我正在编写脚本以测试使用pyserial模块热插拔串行设备。该脚本有一个用于处理写入的主线程和一个用于读取数据的读取线程。

主线程发送一个热插拔信号,然后该信号将停止读取线程,直到再次启动读取线程时再次检测到设备为止。主线程等待热插拔成功消息以确认热插拔成功(带有超时),然后再次从发送热插拔消息开始。当连接的第一个热插拔成功消息之后,串行设备发送初始化消息时,会发生此问题。

该脚本第一次运行良好。但是,这是第二次,输入串行缓冲区中仍有一些数据(初始化消息),需要在读取任何新的成功和初始化消息之前先读取它们。这样做会使脚本在超时后释放成功消息。

我希望完全刷新串行缓冲区并丢弃任何内容,然后再在热插拔上启动读取线程(也就是说,我不在乎在热插拔之前收到了什么消息)。收到热插拔成功消息后,我尝试使用ser.flushInput()/flushOutput()/flush()方法,但此操作无济于事。仍然从缓冲区读取数据。我可以通过在下一次迭代之前引入time.sleep(5)(以从buffer中读取所有init)来解决问题,但是想要一种更清洁的方法。

一旦获得成功消息,如何将先前的初始化消息完全丢弃在输入缓冲区中,以使下一次迭代在热交换之前没有内容可读取。我希望下面的序列图可以解决问题,因为代码太大而无法发布。

更新:我读过某处无法刷新输入的地方,它是诸如C中未定义的行为之一。要读到EOF/EOL ...

   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->

最佳答案

您可以使用py.flushOutputpy.flushInput刷新值。
如果这不起作用,则在关闭串行端口之前,只需将值设置为要发送的任何垃圾值即可。

10-04 13:03