什么是 pyserial 中的 inter_byte_timeout (interCharTimeout)?

Posted

技术标签:

【中文标题】什么是 pyserial 中的 inter_byte_timeout (interCharTimeout)?【英文标题】:What is inter_byte_timeout (interCharTimeout) in pyserial? 【发布时间】:2016-03-08 15:47:24 【问题描述】:

以前为 interCharTimeout,自 3.0 版起为 inter_byte_timeout

API:http://pyserial.readthedocs.org/en/latest/pyserial_api.html#serial.Serial.inter_byte_timeout

我怀疑下面是正规的timeoutinter_byte_timeout的区别如下:

超时:调用读取函数时开始倒计时。即使字节不断到来,它也会在调用读取函数后经过指定的时间后停止读取/抛出异常。 inter_byte_timeout:每次收到一个字节时,开始倒计时。如果字符以 fx 1ms 字节之间的连续流形式出现,则如果 inter_byte_timeout 刚好大于 1ms,它可以永远持续下去。

我说得对吗?

我怀疑不是,因为我无法使函数超时。我试过下面的例子。我期待 inter_byte_timeout 一次读取并打印一个“字符串”,因为它们是由 arduino 写入的,每秒一个。相反,它每三秒超时一次,然后打印该时间段内输入的内容。

写入串口的 Arduino 草图:

void setup() 
  Serial.begin(9600);
  while(!Serial); //wait for connection
  for (int i=0;true;i++)
    Serial.printf("=== iteration %d ===\n", i);
    delay(1000); //ms
  


void loop() 

Python 脚本:

import serial
ser=serial.Serial(port='/dev/ttyACM0', timeout=3,inter_byte_timeout=0.01)
for i in range(100):
    a = ser.read(10000)
    print i, len(a), repr(a)

命令行输出:

~$ python test.py
0 60 '=== iteration 0 ===\n=== iteration 1 ===\n=== iteration 2 ===\n'
1 60 '=== iteration 3 ===\n=== iteration 4 ===\n=== iteration 5 ===\n'
2 60 '=== iteration 6 ===\n=== iteration 7 ===\n=== iteration 8 ===\n'

我在 Ubuntu 上使用串行 3.0.1。另一端的串行设备是 Teensy(Arduino 模拟)。

【问题讨论】:

【参考方案1】:

您的理解似乎是正确的(请参阅本页关于UNIX termios VMIN and VTIME)。我仔细查看了code of serialposix.py,发现在 POSIX 系统(如 Linux 和 android)上,inter_byte_timeout 设置为十分之一秒。因此,当您要求 0.01 的值时,pyserial 中的这行代码...

vtime = int(self._inter_byte_timeout * 10)

...将其转换为 vtime 为零,这就是您的代码失败的原因。将其设置为 0.1 或更高,它应该可以工作。

您可能还希望查看the url_handlers documentation,特别是alt:// 处理程序,看看您是否可以成功使用PosixPollSerial 替代处理程序read()


P.S.:我没有检查非 POSIX 系统的代码。

【讨论】:

哇,恩德穆!不错的发现,对我来说,这是 pyserial 补丁的候选者。我认为指定的任何非零值都应设置为可能的最小非零值(如果太低),而不是零!喜欢:vtime = max(int(self._inter_byte_timeout*10),1) if self._inter_byte_timeout else 0

以上是关于什么是 pyserial 中的 inter_byte_timeout (interCharTimeout)?的主要内容,如果未能解决你的问题,请参考以下文章

pyserial 中的 ser.write() 函数

pyserial中的ser.write()函数

pySerial:端口只工作第一个命令

python中Pyserial如何实现RS485串口通讯

PySerial 丢失数据

pySerial 串口工具简介