USB経由でPythonアプリと通信しているavr microに接続されたモーションセンサーがあります。私は通信を行うためにpyserialを使用しています。スクリプト中に、avr micro からのデータをチェックする無限ループがあります。このループの前に、サブプロセスを終了する関数を呼び出す signal.alarm() でタイマーを開始します。このアラームが発生すると、pyserial 通信が中断され、プログラムは完全に終了します。pyserial read() が中断されたというエラーが表示されます。この問題を回避する方法はありますか。どんな助けでも素晴らしいでしょう
2 に答える
0
alarm()
信号を送信する、と、シリアルポートの読み取りと書き込みを行うpyserialを使用しています。そのようなデバイスに対して読み取りまたは書き込みを行っていて、SIGALRM
信号を受信すると、read()
またはwrite()
呼び出しが中断され、信号を処理できるようになります。
シグナルはユーザースペースで処理され、読み取りと書き込みは実際にはカーネルによって処理されるため、これはかなり醜いものになります。これは、信号が処理される方法の既知の疣贅であり、UNIXの非常に初期の時代にまでさかのぼります。
Pythonでシグナルを正しく処理するコードは次のようになります。
import errno
while True:
try:
data = read_operation()
except OSError, e:
if getattr(e, 'errno', errno.EINTR):
continue
raise
else:
break
于 2010-10-27T06:49:35.210 に答える
0
問題は、アラームがシリアルポートからの読み取りを中断することです。これは、まったく望んでいないことです。
おそらく、これを別々に機能する 2 つのスレッドに分割したいようです。
于 2010-10-27T05:48:04.393 に答える