4

編集

問題が何であるかを知り、自分の質問に答えました。

この行の下の元の質問

ソフトウェア (具体的には、HDD の無料の仮想シリアル構成ユーティリティ)との間にシリアル ブリッジCOM4を実装しています。COM5

Powershell の 2 つの異なるインスタンスで起動する 2 つの異なる Python スクリプトがあり、最初に受け取ります。

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)ますが、それは長期的には悪い解決策のようです.

4

2 に答える 2

3

手がかりはエラーメッセージにあります[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)

そして出来上がり:例外はありません。

[1] 適切に設計されたエラー メッセージ? それは新しいです!

于 2013-08-19T13:11:48.853 に答える