2016-03-08 18 views
3

以前interCharTimeout,從3.0版本inter_byte_timeout什麼是pyserial中的inter_byte_timeout(interCharTimeout)?

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上使用串口3.0.1。另一端的串行設備是Teensy(Arduino模擬)。

回答

2

您的理解似乎正確(請參閱此頁面關於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系統的代碼。

+0

哇,ndemou!很好找,對我來說這是一個pyserial補丁的候選人。我會認爲指定的任何非零值應該設置爲最小可能的非零值(如果太低),而不是零!像:'vtime = max(int(self。_inter_byte_timeout * 10),1)if self._inter_byte_timeout else 0' – RufusVS