2017-12-13 9 views
0

私は作成したゲームのためにラズベリーでこのスクリプトを実行しています。pythonソケットの問題while true with

そのうちの1人が別のラズベリーからソケットメッセージを受信して​​います。しかし問題は、私の残りの部分が真実ではなく、もはや実行しないことです。ソケットメッセージを受け取った後の最初のIFステートメントのみ。

どのようにそれらを実行するには?あなたは、ソケット上でブロックを回避したい場合は、あなたのコメントどおり

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

GPIO.setmode(GPIO.BCM) 

UDP_IP = "192.168.0.21" 
UDP_PORT = 20 

sock = socket.socket(socket.AF_INET, # Internet 
        socket.SOCK_DGRAM) # UDP 
sock.bind((UDP_IP, 20)) 

# Klopspelout, pianospel, sleutelspel, totaalspel 

pinList = [27, 22, 4, 17] 
klopinput = 21 
sleutelinput = 11 

# loop through pins 

for i in pinList: 
    GPIO.setup(i, GPIO.OUT) 

GPIO.setup(klopinput, GPIO.IN) 
GPIO.setup(sleutelinput, GPIO.IN, GPIO.PUD_UP) 
# time to sleep between operations in the main loop 
SleepTimeL = 2 

#variables 
totaal = 0 
klop = 0 
sleutel = 0 
piano = 0 
wacht = 0 
GPIO.output(pinList[0], GPIO.LOW) 
GPIO.output(pinList[1], GPIO.LOW) 
GPIO.output(pinList[2], GPIO.LOW) 
GPIO.output(pinList[3], GPIO.LOW) 
data = 0 

# main loop 
#GPIO.cleanup() 
while True: 


    #if GPIO.input(klopinput) == True: 
    # GPIO.output(pinList[0], GPIO.HIGH) 
    # totaal += 1 
    # print ('klopspel is goed') 
    # time.sleep(SleepTimeL) 
    # GPIO.output(pinList[0], GPIO.LOW) 


    data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes 
    print "received message:", data 
    if data == "slotpiano2": 
    print "slot open" 
    totaal += 1 
    time.sleep(1) 

    if GPIO.input(klopinput) == True and wacht == 0 and klop == 0: 
    GPIO.output(pinList[1], GPIO.HIGH) 
    totaal += 1 
    klop = 1 
    print ('klop is goed') 
    time.sleep(SleepTimeL) 
    GPIO.output(pinList[1], GPIO.LOW) 
    time.sleep(SleepTimeL) 

    if GPIO.input(sleutelinput) == False and sleutel == 0: 
    GPIO.output(pinList[0], GPIO.HIGH) 
    totaal += 1 
    sleutel = 1 
    wacht = 1 
    print ('Sleutel is goed') 
    time.sleep(SleepTimeL) 
    GPIO.output(pinList[0], GPIO.LOW) 
    time.sleep(SleepTimeL) 
    wacht = 0 

    if totaal == 3: 
    GPIO.output(pinList[3], GPIO.HIGH) 
    totaal = 0 
    sleutel = 0 
    klop = 0 
    print ('reset') 
    time.sleep(SleepTimeL) 
    GPIO.output(pinList[3], GPIO.LOW) 
+0

、sock.recvfrom()データがソケットに到着するまでブロックします - これは何ですかあなたは意図した?または、データがない場合にソケットを無視して、GPIO入力の確認に移りますか? –

+0

または、データがない場合にソケットを無視して、GPIO入力の確認に移りましたか? はい、その最後のは正しいです。 –

答えて

0

OK事前に

おかげで、あなたはノンブロッキングに設定し、select()関数を使用する必要があります。私は、this answer,に基づいて必要な編集を示したコードのコピーを投稿しました。また、Pythonのドキュメントではselect()に関する多くの情報があります。

#!/usr/bin/python 
import RPi.GPIO as GPIO 
import time 
import socket 
import pygame 
import serial 
import select # select() function <--------- 

GPIO.setmode(GPIO.BCM) 

UDP_IP = "192.168.0.21" 
UDP_PORT = 20 

sock = socket.socket(socket.AF_INET, # Internet 
        socket.SOCK_DGRAM) # UDP 
sock.bind((UDP_IP, 20)) 
sock.setblocking(0) # set to non-blocking <----------- 

# Klopspelout, pianospel, sleutelspel, totaalspel 

pinList = [27, 22, 4, 17] 
klopinput = 21 
sleutelinput = 11 

# loop through pins 

for i in pinList: 
    GPIO.setup(i, GPIO.OUT) 

GPIO.setup(klopinput, GPIO.IN) 
GPIO.setup(sleutelinput, GPIO.IN, GPIO.PUD_UP) 
# time to sleep between operations in the main loop 
SleepTimeL = 2 

#variables 
totaal = 0 
klop = 0 
sleutel = 0 
piano = 0 
wacht = 0 
GPIO.output(pinList[0], GPIO.LOW) 
GPIO.output(pinList[1], GPIO.LOW) 
GPIO.output(pinList[2], GPIO.LOW) 
GPIO.output(pinList[3], GPIO.LOW) 
data = 0 

# main loop 
#GPIO.cleanup() 
while True: 


    #if GPIO.input(klopinput) == True: 
    # GPIO.output(pinList[0], GPIO.HIGH) 
    # totaal += 1 
    # print ('klopspel is goed') 
    # time.sleep(SleepTimeL) 
    # GPIO.output(pinList[0], GPIO.LOW) 

    fds = select.select([sock], [], [], 1.0)  <----------- 
    if (fds[0]): # sock has some data 
     data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes 
     print "received message:", data 
     if data == "slotpiano2": 
     print "slot open" 
     totaal += 1 
     time.sleep(1) 

    if GPIO.input(klopinput) == True and wacht == 0 and klop == 0: 
    GPIO.output(pinList[1], GPIO.HIGH) 
    totaal += 1 
    klop = 1 
    print ('klop is goed') 
    time.sleep(SleepTimeL) 
    GPIO.output(pinList[1], GPIO.LOW) 
    time.sleep(SleepTimeL) 

    if GPIO.input(sleutelinput) == False and sleutel == 0: 
    GPIO.output(pinList[0], GPIO.HIGH) 
    totaal += 1 
    sleutel = 1 
    wacht = 1 
    print ('Sleutel is goed') 
    time.sleep(SleepTimeL) 
    GPIO.output(pinList[0], GPIO.LOW) 
    time.sleep(SleepTimeL) 
    wacht = 0 

    if totaal == 3: 
    GPIO.output(pinList[3], GPIO.HIGH) 
    totaal = 0 
    sleutel = 0 
    klop = 0 
    print ('reset') 
    time.sleep(SleepTimeL) 
    GPIO.output(pinList[3], GPIO.LOW) 

(1.0秒が許容できない場合はNBは、アプリケーションに関連するものにタイムアウトを設定します。)

各ループで