2016-11-15 3 views
0

私はttyUSB0デバイスに接続されたカードの読み込みを持っています。カードが通過するのを待って(例えば30秒)、データを渡してデータを受け取った後にpythonスクリプトを作成する必要がありますスクリプトを閉じて、データのみで行を印刷します。 30秒以内にカードが通過しなければ、スクリプトが終了します。ここでPythonのシリアルからの読み出し

はスクリプトです:これにより

#!/usr/bin/python 

import time 
import serial 

ser = serial.Serial(
    port='/dev/ttyUSB0', 
    baudrate = 4800, 
    parity=serial.PARITY_NONE, 
    stopbits=serial.STOPBITS_ONE, 
    bytesize=serial.SEVENBITS, 
    timeout=1 
) 

counter=0 

while 1: 
    x=ser.readline() 
    print x 

何が起こるかは、それは私にCtrl + C

EDITヒットするまで、これまでの行を印刷し続けるということです。読み込みを待つためにどのように発見を私は今、30秒後にスクリプト全体のタイムアウトを行う最良の方法は何でしょうか? x = ser.read()

time.sleep(30) 

:ちょうど次を追加し、30秒間のスクリプト睡眠を作るために

#!/usr/bin/python 

import time 
import serial 

ser = serial.Serial(
     port='/dev/ttyUSB0', 
     baudrate = 4800, 
     parity=serial.PARITY_NONE, 
     stopbits=serial.STOPBITS_ONE, 
     bytesize=serial.SEVENBITS, 
     timeout=None 
) 


#while 1: 
x=ser.read(size=16) 
print x 
+0

30秒待つとはどうでしたか? – Fejs

+0

編集を見てください。それは私が尋ねてきたことです、スクリプト全体を30秒待たせる方法です。 – rgomez

答えて

0

何かが挿入されているかどうかをテストする前に(Fejsの回答によって示唆されているように)30秒間待つことができますが、何かが挿入されるたびに30秒間待つことは望ましくないと思います。

あなたが連続して何のためにテストし、何かが発見された場合はスクリプトを終了したい場合は、あなたがこのような何かを行うことができますが:

for x in range(30): 
    if ser.read(size=16) != None: 
     x = ser.read(size=16) 
     #(DO WHATEVER WITH X HERE) 
     break 
    else: 
     time.sleep(1) 

これは、30秒間、1秒ごとに連続して読みやすい何かをチェックします。何かが見つかった場合は、forループを終了します。

0

私がシリアルポートをポーリングする最も簡単な方法は、timeモジュールを利用することです。これは、実行したい時点での終了点を計算し、それをwhileループの条件として使用することによって実行されます。

#Set up serial connection 
import time 
time_end = time.time() + 30 

while time.time() < time_end: 
    x = ser.read(16) 
    if x is not None: 
     break 

さておき、pySerial apiによれば、なしのタイムアウト値を通過するブロッキングモードに入るように。つまり、シリアルポートは、データが読み込まれるまでポートに接続して待機します。代わりにfloatを渡すことをお勧めします(その値はアプリケーションによって異なります)。

関連する問題