Python pyserial中的字节间超时(interCharTimeout)是什么?

Python pyserial中的字节间超时(interCharTimeout)是什么?,python,pyserial,Python,Pyserial,以前的interCharTimeout,从3.0版开始inter\u byte\u timeout API: 我怀疑以下是常规超时和字节间超时之间的区别: 超时:调用读取函数时开始倒计时。即使字节不断出现,它也会在调用read函数后经过指定的时间后停止读取/抛出异常 字节间超时:每次接收到一个字节时,启动倒计时时钟。如果字符以连续流的形式出现,字节间的fx为1ms,那么如果字节间的超时刚好大于1ms,则可以一直持续下去 我说的对吗 我想不会,因为我就是不能让函数超时。我尝试了下面的例子。我希

以前的
interCharTimeout
,从3.0版开始
inter\u byte\u timeout

API:

我怀疑以下是常规
超时
字节间超时
之间的区别:

  • 超时:调用读取函数时开始倒计时。即使字节不断出现,它也会在调用read函数后经过指定的时间后停止读取/抛出异常
  • 字节间超时:每次接收到一个字节时,启动倒计时时钟。如果字符以连续流的形式出现,字节间的fx为1ms,那么如果字节间的超时刚好大于1ms,则可以一直持续下去
我说的对吗

我想不会,因为我就是不能让函数超时。我尝试了下面的例子。我希望inter_byte_超时使其每次读取并打印一个“字符串”,因为它们是由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() {
}
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'
Python脚本:

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() {
}
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'
命令行输出:

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() {
}
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上使用serial 3.0.1。另一端的串行设备是Teensy(Arduino模拟)

您的理解似乎是正确的(请参阅本页关于)。我仔细看了一下,发现在POSIX系统(如Linux和android)上,字节间超时设置为十分之一秒。因此,当您要求值为0.01时,pyserial中的这行代码

vtime = int(self._inter_byte_timeout * 10)
…将其转换为零的vtime,这就是代码失败的原因。将其设置为0.1或更高,它应该可以工作

您可能还希望查看
alt://
处理程序,看看是否可以成功地将
PosixPollSerial
替代处理程序用于
read()



附言:我没有检查非POSIX系统的代码。

哇,我没有!很好的发现,这对我来说是pyserial补丁的候选。我认为任何指定的非零值都应该设置为最小可能的非零值(如果太低),而不是零!比如:
vtime=max(int(self.\u inter\u byte\u timeout*10),如果self.\u inter\u byte\u timeout,则为1,否则为0