以前interCharTimeout
,自版本3.0 inter_byte_timeout
以来。
API:http://pyserial.readthedocs.org/en/latest/pyserial_api.html#serial.Serial.inter_byte_timeout
我怀疑以下是常规timeout
和inter_byte_timeout
之间的区别如下:
我是对的吗?
我怀疑没有,因为我只是无法使功能超时。我试过下面的例子。我期待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上使用串行3.0.1。另一端的串行设备是Teensy(Arduino模拟)。
答案 0 :(得分:5)
您的理解似乎是正确的(请参阅此页有关UNIX termios VMIN and VTIME)。我仔细看了code of serialposix.py,我发现在POSIX系统上(比如Linux和android),inter_byte_timeout设置为十分之一秒。所以当你在pyserial中要求值为0.01这段代码时......
vtime = int(self._inter_byte_timeout * 10)
...将其转换为零的vtime,这就是您的代码失败的原因。将其设置为0.1或更高,它应该工作。
您可能还希望查看the url_handlers documentation,特别是alt://
处理程序,看看您是否可以成功使用PosixPollSerial
替代处理程序read()
。
P.S。:我没有检查非POSIX系统的代码。