当前位置: 首页 > 面试题库 >

使用PySerial是否可以等待数据?

凌和悦
2023-03-14
问题内容

我有一个Python程序,该程序通过 PySerial
模块从串行端口读取数据。我需要牢记的两个条件是:我不知道会有多少数据到达,并且我也不知道何时需要数据。

基于此,我提出了以下代码段:

#Code from main loop, spawning thread and waiting for data
s = serial.Serial(5, timeout=5)  # Open COM5, 5 second timeout
s.baudrate = 19200

#Code from thread reading serial data
while 1:
  tdata = s.read(500)    # Read 500 characters or 5 seconds

  if(tdata.__len__() > 0):        #If we got data
    if(self.flag_got_data is 0):  #If it's the first data we recieved, store it
      self.data = tdata        
    else:                         #if it's not the first, append the data
      self.data += tdata
      self.flag_got_data = 1

因此,此代码将永远循环以从串行端口获取数据。我们最多可以存储500个字符,然后通过设置一个标志来警告主循环。如果没有数据,我们将回到睡眠状态并等待。

该代码正在运行,但是我不喜欢5s超时。我需要它是因为我不知道可以期待多少数据,但是我不喜欢它每5秒唤醒一次,即使没有数据也是如此。

有没有什么方法可以检查数据何时可用read?我在想类似selectLinux中的命令。

注意:
我找到了inWaiting()方法,但实际上似乎只是将我的“睡眠”更改为民意测验,所以这不是我想要的。我只想睡觉直到数据输入,然后再去获取它。


问题答案:

好的,我实际上得到了一些我喜欢的东西。使用read()无超时和inWaiting()方法的组合:

#Modified code from main loop: 
s = serial.Serial(5)

#Modified code from thread reading the serial port
while 1:
  tdata = s.read()           # Wait forever for anything
  time.sleep(1)              # Sleep (or inWaiting() doesn't give the correct value)
  data_left = s.inWaiting()  # Get the number of characters ready to be read
  tdata += s.read(data_left) # Do the read and combine it with the first character

  ... #Rest of the code

这似乎可以提供我想要的结果,我想这种功能在Python中不存在为单个方法



 类似资料:
  • 问题内容: Selenium隐式等待是否总是占据整个等待时间,还是可以更快地完成?如果我将隐式等待时间设置为10秒,则对.findElement的调用是否可以在几秒钟内完成,还是总是需要整整10秒钟? 该页面暗示它要等待整整10秒钟,这非常令人困惑,因为它不是javadoc所暗示的。 WebDriver.java的以下代码注释隐含了它的轮询操作可以比定义隐式超时更快的时间完成。但是, 评论中的最后

  • 问题内容: 我知道我可以这样做: 然后只需编写语句中所需的代码。 还有其他方法可以检查它们是否相等? 问题答案: 怎么了 if(!Arrays.equals(array1,array2)) 与相同,即是同一数组。这不是大多数人期望的。 比较数组的内容。

  • 问题内容: 我想使用Streams.intRange(int start,int end,int step)实现反向排序的流。但是,似乎java.util.Streams类不再可用(但是它仍在标准库的rt.jar中)。此方法是在其他类中还是被其他方法替代? 问题答案: 实际上,JDK中再也没有这种方法了。您能获得的下一个最接近的位置是,但是只会一步一步走。 一种解决方案是实施您自己的解决方案。例如

  • 问题内容: 我正在编写一个自动化测试程序,该程序将测试某些Web程序,这些程序有时加载某些AJAX调用的速度很慢。例如,用户将单击“查询”,这将在15到90秒的任何时间产生HTML“加载”叠加。搜索完成后,它将使用结果更新同一页面上的表。 所以很明显我可以像这样单独增加等待时间: 但是有没有办法修改(在我的情况下增加)时间,因此Watir-Webdriver 总是 等待90秒,如下所示: 请注意以

  • 我们有一个运行良好的C#FTP类,但是TCP端口快用完了,因为它们都处于等待时间状态,无法重用。我们可以减少注册表中的默认等待时间,但我们宁愿重用端口。 在服务器端套接字进入TIME-WAIT状态并且客户机在2MSL(默认TIME-WAIT时间)内重新连接到服务器的情况下,可能会发生以下两种情况: 1.服务器不会响应来自客户端的SYN数据包,因为套接字处于时间等待状态。 2.服务器可以接受来自客户

  • 创建驱动程序时,我已将隐式等待设置为10秒。当我希望使用显式等待时,是否必须将隐式等待设置为0? 以下是一个示例: 我必须做webDriver.manage()。超时()。秒);还是没有必要?