Skip to main content
 首页 » 编程设计

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

2025年05月04日9Free-Thinker

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

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

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

我希望在热交换上启动读取线程之前完全刷新串行缓冲区并丢弃任何内容(也就是说,我不关心在热交换之前收到了什么消息)。在收到热插拔成功消息后,我尝试使用 ser.flushInput()/flushOutput()/flush() 方法,但它什么也没做。数据仍然从缓冲区中读取。我可以通过在下一次迭代之前引入 time.sleep(5)(从缓冲区读取所有 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.flushOutput 和 py.flushInput 刷新值。 如果这不起作用,只需在关闭串行端口之前将要发送的值设置为任何垃圾值即可。