python - pyserial 中的 inter_byte_timeout (interCharTimeout) 是什么?

标签 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 之间的区别如下:

  • 超时:调用读取函数时开始倒计时。即使字节不断到来,当从调用读取函数时起经过指定的时间量时,它也会停止读取/抛出异常。
  • 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 上使用 serial 3.0.1。另一端的串行设备是 Teensy(Arduino 模拟)。

最佳答案

您的理解似乎是正确的(请参阅有关 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 系统的代码。

关于python - pyserial 中的 inter_byte_timeout (interCharTimeout) 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35871822/

相关文章:

python - 为什么serial read(1)在收到一个字符后继续等待直到超时?

python - 樱桃不关闭套接字

python - Django 中通过固定装置加载的数据的字符串表示

python - 如何解析从pyserial接收的json字符串?

python - PySerial App 在 shell 中运行,而不是 py 脚本

python - PySerial [错误 5] 访问被拒绝

Python 通过 TCP/IP 读取串行 (RS-232) 数据

python - 打印出给定字母的字母序列 - python

当时间转换为 timedelta64 时,Python matplotlib.pyplot 正在绘制不同的图形

python - 高效获取正方形线上的格点