pyserial中的inter_byte_timeout(interCharTimeout)是什么?

Mad*_*ern 5 python 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以下之间的区别:

  • timeout:调用read函数时开始倒计时.即使字节不断出现,当从调用读取函数开始经过指定的时间后,它将停止读取/抛出异常.
  • 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() {
}
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

命令行输出:

~$ 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'
Run Code Online (Sandbox Code Playgroud)

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

nde*_*mou 5

您的理解似乎是正确的(请参阅有关UNIX termios VMIN和VTIME的此页面).我仔细看了一下serialposix.py代码,我看到在POSIX系统上(比如Linux和android),inter_byte_timeout设置为十分之一秒.所以当你在pyserial中要求值为0.01这行代码时......

vtime = int(self._inter_byte_timeout * 10)
Run Code Online (Sandbox Code Playgroud)

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

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


PS:我没有检查非POSIX系统的代码.

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