2016-10-03 8 views
0

皆さん、こんにちは!シリアルを読み、Pythonで応答する

私は現在Arduino(シリアル経由で自分のRaspberry Piに接続しています)と通信し、自分のRaspberry Piで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 

あなたが見ることができるように、私は私のArduinoに番号0を送っていて、それはそれは準備ができて意味し、で応答するのを待ちます。その後、データがあれば、メッセージ "c"を送ります。その結果、2つの別々のメッセージを待つ必要があります。

私は必要なときにループを作り、それを壊すことでこれを試みましたが、これは機能しません。

現在、ループに入り、「a」メッセージが表示されますが、2番目のメッセージは表示されません。

どのようにこのループを適切に結びつけることができますか?

ありがとうございました!私は私の中を維持し、私は私が望む結果を得るまでのブロックをエスケープするため

答えて

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'を得るまで一度に1バイトを読み込み、それをすべて返します。要求されたバイトのタイムアウトが発生した場合....これまでの動作を返します。機能に繰り返されると、問題になっている部分だけに焦点を当てることができます... –

関連する問題