我使用socket从一个RPi向另一个RPi发送命令。当接收到命令“turnRight”时,接收rpi转动伺服(通过运行Yservo函数),当接收到“stop”时,通过终止过程停止转动伺服。伺服位置从x=50的一半开始。问题是伺服位置没有在主代码中更新,所以下一次进程运行时,它会在50再次启动。你知道吗
我需要在python进程中更新/更改一个值(让Yservo中断while循环)。例如,while state==True:,因此当state更新为false时,while循环中断,可以返回值x(而不是终止进程),或者让进程更新主实例中的变量(x)。你知道吗
接收代码:
import socket
from multiprocessing import Process
import RPi.GPIO as gpio
import time
gpio.setmode(gpio.BCM)
ps = 27
ys = 28
gpio.setup(ps,gpio.OUT)
gpio.setup(ys,gpio.OUT)
pitchS = gpio.PWM(ps,50)
pitchS.start(0)
x = 50
def Yservo(): #x is starting position / current position
global x
while 1:
x += 1
pitchS.ChangeDutyCycle(x)
time.sleep(1)
print(x)
if x >= 100:
while 1:
pass
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_socket.bind(('', 6666))
print ("UDPServer Waiting for client on port 6666")
try:
while True:
dataFromClient, address = server_socket.recvfrom(256)
data = str(dataFromClient.decode('utf-8'))
data = data.split(',')
if data[0] == 'turnRight':
TS = Process(target=Yservo,args=())
TS.daemon = True
TS.start()
#TS.join()
if data[0] == 'stop':
TS.terminate()
TS.join()
except:
print('STOP! wait a minute')
TS.terminate()
TS.join()
我建议让您的进程保持活动状态,或者每次生成/杀死它,并让它每1s侦听一个队列以从主进程获取命令。另外,只要您不终止子进程,那么Yservo子进程中的内部while循环将最大化一个核心if
x>=100
,这是不可取的。此版本将记住您以前停过的位置:q.get()
将阻止代码的执行,但是通过传递False
布尔值并捕获Queue.Empty
异常,您可以尝试以非阻塞方式使用队列中的对象。你知道吗相关问题 更多 >
编程相关推荐