如何使用pyserial清除热插拔缓冲区中的先前数据

时间:2013-01-11 02:28:56

标签: python multithreading pyserial

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

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

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

我希望在hotswap上启动读取线程之前完全刷新串行缓冲区并丢弃任何内容(也就是说,我不关心在hotswap之前收到什么消息)。我在收到hotplug成功消息后尝试使用ser.flushInput()/ flushOutput()/ flush()方法,但它什么也没做。仍然从缓冲区读取数据。我可以通过在下一次迭代之前引入time.sleep(5)来做一个解决方法(从缓冲区读取所有init),但是想要一个更清晰的方法。

获取成功消息后,如何完全丢弃输入缓冲区中的先前init消息,以便下一次迭代在hotswap之前无需读取。我希望下面的序列图清楚地说明问题,因为代码太大而无法发布。

更新:我已经阅读过一个无法刷新输入的地方,它是像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->

1 个答案:

答案 0 :(得分:0)

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