2016-11-15 6 views
0

Ich habe eine Karte lesen verbunden mit einem ttyUSB0-Gerät, ich muss ein Python-Skript, das beim Ausführen wird warten (zum Beispiel 30s) für eine Karte zu übergeben und nachdem es geht und erhält eine Zeile mit Daten schließt das Skript und druckt die Zeile nur mit Daten. Wenn die Karte nicht innerhalb von 30 Sekunden passiert, schließt das Skript. HierPython lesen von der seriellen

ist das Skript:

#!/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 

Mit diesem, was passiert, ist, dass es hält immer die Zeilendruck bis traf ich Ctrl + C

EDIT: gefunden, wie für das Lesen warten Ich möchte jetzt, was wäre der beste Weg, um das ganze Skript nach 30s Timeout zu machen?

#!/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

Und wie hast du es gesagt, um 30 Sekunden zu warten? – Fejs

+0

Bitte schauen Sie sich die Änderung an. Das war es was ich gefragt habe, wie man das ganze Skript auf 30s warten lässt. – rgomez

Antwort

0

Sie könnten sicherlich 30 Sekunden warten, um zu beenden, bevor Sie testen, ob etwas eingefügt wird (wie von Fejs Antwort vorgeschlagen), aber ich nehme an, dass Sie nicht 30 volle Sekunden jedes Mal warten möchten, wenn etwas eingefügt wird.

Wenn Sie etwas aus und beenden das Skript kontinuierlich testen wollen, ob etwas gefunden wird, könnte man so etwas tun:

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) 

Dies wird überprüft etwas lesbar kontinuierlich einmal pro Sekunde, für 30 Sekunden. Wenn etwas gefunden wird, wird die for-Schleife beendet.

0

Um Skript Schlaf für 30 Sekunden zu machen, fügen Sie einfach folgende:

time.sleep(30) 

vor x = ser.read().

0

Der einfachste Weg, um eine serielle Schnittstelle abzufragen, ist die Verwendung des Zeitmoduls. Dies geschieht durch Berechnen des Endpunkts, zu dem Sie laufen möchten, und Verwenden dieser Bedingung als Bedingung für eine While-Schleife.

#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 

Als Nebenwirkung nach dem pySerial api, tritt in einen Sperrmodus einen Timeout-Wert von None übergeben. Mit anderen Worten, der serielle Port sitzt und hört den Port ab, bis Daten gelesen werden. Ich würde vorschlagen, stattdessen einen Float zu übergeben (dessen Wert von Ihrer Anwendung abhängt).

Verwandte Themen