2013-08-19 195 views
2

編輯PySerial寫()即時超時

我發現了什麼問題是,並回​​答了我自己的問題。

這條線之下

原來的問題

我有COM4COM5之間的串行橋軟件(具體來說,HDD的免費虛擬串行配置實用程序)

實現我有兩個不同的Python腳本啓動Powershell的兩個不同實例,先收到:

import serial 
receive = serial.Serial(port = 'COM5', baudrate = 9600) 
text = receive.read(100) 
receive.close() 
print text 

然後寄件人:

import serial 
send = serial.Serial(port = 'COM4', baudrate = 9600, timeout = 0) 
send.write("Hello") 
send.close() 

當開始發送腳本時,接收器腳本獲取發送消息(讓溝通明確規定),但發件人腳本立即以錯誤結束:

Traceback (most recent call last): 
    File ".\sending.py", line 3, in <module> 
    send.writelines("Hello") 
    File "C:\Python27\lib\site-packages\serial\serialwin32.py", line 270, in write 
    raise writeTimeoutError 
serial.serialutil.SerialTimeoutException: Write timeout 

我得到同樣的錯誤時,我將發件人腳本更改爲

send = serial.Serial(port = 'COM4', baudrate = 9600) 

所以我的問題是:什麼時候超時?我如何防止這種情況發生?我的意思是,數據正在發送,所以我可能只是把整個東西放在try/except(and do nothing)塊中,但從長遠來看這似乎是一個不好的解決方案。

+0

軟件橋可能存在bug,我在硬件端口COM或USB-COM上沒有看到這個異常。 在異常情況下傳遞(不做任何事)是不好的,因爲你有超時並且它降低了傳輸速度。 – eri

+0

其實,在我發佈這個和現在之間,我想我已經發現了這個問題 - pyserial似乎只適用於32位體系結構(至少在Windows平臺上) - 文件serialwin32.py是一個提示,有人可以證實嗎? – medivh

+0

我剛剛遇到了FTDI USB/RS-232橋接器的這個問題。驅動程序似乎阻止進程被殺死(腳本停止異常,python不能被殺死,CMD沒有關閉),只有拉動設備(謹防藍屏)才能使事情重演。 – handle

回答

1

的線索是在錯誤消息[1]

File "C:\Python27\lib\site-packages\serial\serialwin32.py", line 270, in write 
raise writeTimeoutError 

,所以我們打開這個文件,找到:

if self._writeTimeout != 0: # if blocking (None) or w/ write timeout (>0) 
      # Wait for the write to complete. 
      #~ win32.WaitForSingleObject(self._overlappedWrite.hEvent, win32.INFINITE) 
      err = win32.GetOverlappedResult(self.hComPort, self._overlappedWrite, ctypes.byref(n), True) 
      if n.value != len(data): 
       raise writeTimeoutError 

閱讀又是第一個條件:

if self._writeTimeout != 0: 

所以讓我們重寫我們之前的代碼

send = serial.Serial(port = 'COM4', baudrate = 9600, timeout = 0) 

成爲

send = serial.Serial(port = 'COM4', baudrate = 9600, writeTimeout = 0) 

和Et瞧:未見異常。

[1]設計良好的錯誤信息?這是新的!

+0

此外,API文檔清楚地表明:'timeout'是READ超時參數。 writeTimeout是WRITE超時參數。我閱讀文檔很好。 – medivh