我有以下腳本從Raspberry Pi上的Arduino讀取串行端口。目的是讓Pi監控Arduino rfid輸出,並在識別特定卡號時激活繼電器板上的兩個不同的繼電器。發生了什麼事情是腳本在識別特定卡號時實質上運行了兩次。我無法弄清楚爲什麼這樣做。RFID Arduino to Raspberry Pi串行讀取python動作運行兩次
#!/usr/bin/python # -*- coding: utf-8 -*-
import serial
import time
import RPi.GPIO as GPIO
ser = serial.Serial('/dev/ttyACM0', 9600)
GPIO.setmode(GPIO.BCM)
# init list with pin numbers
pin_assignments = {'Disarm Alarm': 18, 'Unlock Door': 23}
GPIO.setup(18, GPIO.OUT)
GPIO.setup(23, GPIO.OUT)
GPIO.output(18, GPIO.HIGH)
GPIO.output(23, GPIO.HIGH)
while True:
try:
data = ser.readline() .decode("utf-8*)
if "12 34 56 78" in data:
time.sleep(2)
GPIO.output(18, GPIO.LOW) # Disarm alarm
print('Alarm Disarmed')
time.sleep(1)
GPIO.output(23, GPIO.LOW) # Unlock door
print('Door Unlocked')
time.sleep(3)
GPIO.output(18, GPIO.HIGH)
GPIO.output(23, GPIO.HIGH)
print('Card Admitted')
time.sleep(1)
if data == 'no card select':continue
except ser.SerialTimeoutException:
print('Data could not be read')
time.sleep(1)
...在一個有效的讀卡,我越來越:
報警撤防 鎖門 卡考上 報警撤防 鎖門 卡考上
爲什麼你認爲它通過兩次?
因爲它在'while True'中並且你永遠不會跳出它,所以我猜 - 不知道爲什麼**只有**兩次,我猜'ser.readline()'會阻止第三個它的時間被稱爲,但我無法確定(我手頭沒有HW來重現問題,唉)。 – 2015-01-27 01:52:58
關於True替代品的任何建議?我是Python新手,不確定運行此腳本的最佳選擇是什麼。我確實需要它來持續監視Arduino串行輸出。 – 2015-01-27 02:04:37
當你不想繼續重複時,「休息」是最簡單的想法,但這會阻止監控。如果Arduino「口吃」併發送一行兩次,則可能需要解決該問題,例如,在上次看到「數據」值的時候已經看到「數據」值,這樣就可以忽略過快的重複。在回答中需要一些代碼來指導呢?如果有,請告訴我,謝謝! – 2015-01-27 02:07:12