2016-10-03 4 views
0

Все, привет!Чтение серийного номера и ответа Python

В настоящее время я использую попытку связаться с моим Arduino (который подключен к моей малине Pi через Serial) и использует информацию в моем сценарии Python на моей малиновой пи.

Таким образом, мой скрипт Python должен дождаться, когда Arduino сообщит о своих данных, прежде чем я захочу, чтобы сценарий продолжался, хотя я не совсем уверен, как это сделать.

Это то, что я получил до сих пор:

#!/usr/bin/env python 
import time 
import serial 
import RPi.GPIO as GPIO 

ser = serial.Serial('/dev/ttyACM0', 9600) 

GPIO.setmode(GPIO.BCM) 
GPIO.setwarnings(False) 
GPIO.setup(20, GPIO.OUT) #green LED 
GPIO.setup(16, GPIO.IN, GPIO.PUD_UP) #green button 

GPIO.output(20, True) #green ON 

start = time.time() 

while True: 
     if (GPIO.input(16) == False): 
       print "green button pressed" 
       time.sleep(0.25) 
       start = time.time() 
       while (GPIO.input(16) == False): 
         time.sleep(0.01) 
       if (GPIO.input(16) == True): 
         print "released!" 
         end = time.time() 
         elapsed = end - start 
         print elapsed 
         if elapsed >= 5: 
           print "longer than 5s" 
         else: 
           print "shorter than 5s" 
           ser.write("0") 
           while True: 
             print ser.readline().rstrip() 
             if ser.readline().rstrip() == "a": 
               print "ready" 
               continue 
             if ser.readline().rstrip() == "b": 
               print "timeout" 
               break 
             if ser.readline().rstrip()[0] == "c": 
               print "validated: " + ser.readline().rstrip()[2] 
               break 

Как вы можете видеть, я посылаю число 0 на мой Arduino, и ждать его, чтобы ответить а, значит, он готов , После этого, когда у него есть данные, он отправляет сообщение «c», в результате мне нужно ждать 2 разных отдельных сообщения.

Я пытался сделать это, имея петлю и разбивая ее, когда у меня есть то, что мне нужно, но это не работает.

В настоящее время он переходит в цикл, и он печатает сообщение «a», но не возвращается со вторым сообщением.

Любая идея, как правильно связать этот цикл?

Спасибо!

ответ

0

Это работает хорошо для меня, чтобы сохранить мое время, и избежать блока, пока не получите то, что я хочу:

loop = 1 
while loop == 1: 
     message = ser.readline().rstrip() 
if message == "a": 
     print "ready" 
     continue 
if message == "b": 
     print "Timeout" 
     loop = 0 
if message[0] == "c": 
     print "Validated: " + message[2] 
     loop = 0 
if message == "d": 
     print "error, try again" 
     loop = 0 
0

используйте функции

def wait_for(ser,targetChar): 
    resp = "" 
    while True: 
     tmp=ser.read(1) 
     resp = resp + tmp 
     if not tmp or tmp == targetChar: 
      return resp 

first_resp = wait_for(ser,'a') 
second_resp = wait_for(ser,'c') 
while not second_resp.endswith('c'): 
    print "RETRY" 
    second_resp = wait_for(ser,'c') 
+0

Спасибо за ваш ответ, но я Я боюсь, что это немного похоже на мою голову. Можете ли вы объяснить, что здесь происходит? – user5740843

+0

он читает байты за один раз, пока не получит «targetChar» и не возвращает все это ... если он встречает тайм-аут для запрошенного байта ... он просто возвращает то, что у него есть до сих пор ... путем изолирования поведения, которое повторяется в функции, вы можете просто сосредоточиться на той части, которая проблематична ... –

 Смежные вопросы

  • Нет связанных вопросов^_^