pyserial 中的 inter_byte_timeout (interCharTimeout) 是什么?

What is inter_byte_timeout (interCharTimeout) in pyserial?

以前 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 让它一次读取和打印一个 "string",因为它们是由 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 模拟)。

您的理解似乎是正确的(请参阅有关 UNIX termios VMIN and VTIME). I took a closer look at the 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:// 处理程序,看看您是否可以成功地使用 read()PosixPollSerial 替代处理程序。


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