2

我正在编写一个脚本来测试使用 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->
4

1 回答 1

0

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

于 2018-02-21T14:19:25.203 回答