[英]python socket issue with while true
我正在树莓派上为我创建的游戏运行此脚本,其中true时有三个不同的输入:
其中之一是从其他树莓派获取套接字消息。 但是问题是我剩下的true不再执行了。 我收到套接字消息后只有第一个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)
根据您的评论,确定,如果要避免阻塞套接字,则需要将其设置为非阻塞并使用select()函数。 我已在此下方发布了一份代码副本,其中显示了基于此答案的必要编辑,并且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秒,则将超时设置为与您的应用程序相关的时间。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.