나는 나무 딸기 파이에 Arduino에서 직렬 포트를 읽을 수있는 아래의 스크립트가 있습니다. 의도는 Arduino rfid 출력을 모니터하고 특정 카드 번호가 식별되면 릴레이 보드에서 두 개의 다른 릴레이를 활성화하는 것입니다. 스크립트가 본질적으로 특정 카드 번호가 식별되면 두 번 실행됩니다. 왜 그렇게하는지 모르겠습니다. 유효한 카드가 읽기에RFID Arduino to Raspberry Pi 시리얼 읽기 파이썬 액션 두 번 실행
#!/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)
..., 내가 받고 있어요 :
알람 무장 해제 문 잠금 해제 카드 합격자 알람 무장 해제 문 잠금 해제 카드
인정왜 당신이 생각 두 번이나 뛰어 다니고 있니?
'true while'에 있기 때문에 결코 빠져 나올 수 없기 때문에, 나는 ** 단지 ** 두 번만, 왜'ser.readline()'가 3 번째를 막고 있는지 짐작할 수 있습니다. 그것이 불려지는 시간이지만 나는 확실히 말할 수 없다. (나는 슬프게도 문제를 재현 할 수있는 HW가 없다.) –
True에 대한 대안에 대한 제안 사항이 있습니까? 필자는 Python을 처음 사용하기 때문에이 스크립트를 실행하기위한 최선의 대안이 무엇인지 모릅니다. 끊임없이 Arduino 직렬 출력을 모니터해야합니다. –
반복을 원하지 않을 때'중단 '하는 것이 가장 간단한 생각이지만, 그로 인해 모니터링이 중단됩니다. Arduino가 "stutters"하고 두 번 선을 보내는 경우, 예를 들어 마지막으로 본 '데이터'값의 'dict'을 사용하여이를 해결해야 할 수도 있습니다. 따라서 너무 빠르게 반복되는 것을 무시할 수 있습니다. 그걸 안내하는 답변에 몇 가지 코드가 필요합니까? 그렇게 알려 줘서 고마워! –