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,则可以一直持续下去李>
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