我正在写一个关于覆盆子pi的简单python程序,我对python编程很新。我已经定义了一个名为GetMessage的函数,该函数没有参数并返回一个我称之为数据的变量,但是我收到的错误表明
文件" Raspberry_pi.py",第39行
不返回
^
SyntaxError:语法无效
import os
import glob
import time
import RPi.GPIO as GPIO
from math import *
from bluetooth import *
from RPIO import PWM
os.system('sudo hciconfig hci0 pisca')
os.system('sudo hciconfig hci0 name "De Quadcoptur"')
servo = PWM.Servo()
StartSpin()
server_sock=BluetoothSocket( RFCOMM )
server_sock.bind(("",PORT_ANY))
server_sock.listen(1)
port = server_sock.getsockname()[1]
GetMessage()
DecodeInput()
uuid = "94f39d29-7d6d-437d-973b-fba39e49d4ee"
def GetMessage():
advertise_service( server_sock, "XT1032", #phone bluetooth name
service_id = uuid,
service_classes = [ uuid, SERIAL_PORT_CLASS ],
profiles = [ SERIAL_PORT_PROFILE ],
#protocols = [ OBEX_UUID ]
)
client_sock, client_info = server_sock.accept()
try:
data = client_sock.recv(1024)
if len(data) == 0: break
print "received [%s]" % data
client_sock.close()
server_sock.close()
except IOError:
pass
break
return data
def StartSpin():
# Set servo on GPIO17 to 1200µs (1.2ms)
servo.set_servo(17, 1000)
servo.set_servo(18, 1000)
servo.set_servo(19, 1000)
servo.set_servo(20, 1000)
time.sleep(1)
servo.stop_servo(17)
servo.stop_servo(18)
servo.stop_servo(19)
servo.stop_servo(20)
#Check if more pulses is faster
time.sleep(2000)
PWM.add_channel_pulse(0, 17, start = 1000, width = 100)
PWM.add_channel_pulse(0, 17, start = 1000, width = 100)
PWM.add_channel_pulse(0, 17, start = 1000, width = 100)
PWM.add_channel_pulse(0, 17, start = 1000, width = 100)
PWM.add_channel_pulse(0, 17, start = 1000, width = 100)
servo.stop_servo(17)
servo.stop_servo(18)
servo.stop_servo(19)
servo.stop_servo(20)
return None
def DecodeInput():
data = GetMessage()
if(data == 'start')
StartSpin()
return 0
else if(data[0] == 'U')
data.strip('U')
UpPower = int(data)
SetUpPower(UpPower)
else if(data[0] == 'P')
data.strip('P')
PitchPower = int(data)
SetPitchPower
else
data.strip('P')
RollPower = int(data)
SetPower(UpPower, PitchPower, RollPower)
return None
def SetPower(UpPower, PitchPower, RollPower):
#Make Arbitrary Values
Motor1Power = UpPower #Front Left
Motor2Power = UpPower #Front Right
Motor3Power = UpPower #Back Left
Motor4Power = UpPower #Back Right
PitchPower = PitchPower /2
RollPower = RollPower /2
if(PitchPower < 25)
Motor1Power = Motor1Power + abs(25-PitchPower)
Motor2Power = Motor1Power + abs(25-PitchPower)
else
Motor3Power = Motor3Power + (PitchPower-25)
Motor4Power = Motor4Power + (PitchPower-25)
if(RollPower < 25)
Motor1Power = Motor1Power + abs(25-RollPower)
Motor3Power = Motor3Power + abs(25-RollPower)
else
Motor2Power = Motor2Power + (RollPower - 25)
Motor4Power = Motor4Power + (RollPower - 25)
导致此错误的原因是什么?如何解决?
编辑:我已将数据定义为全局变量,现在错误是
文件&#34; Raspberry_pi.py&#34;,第39行
返回数据
^
SyntaxError:语法无效
答案 0 :(得分:2)
您的代码中存在许多语法问题。由于SyntaxError
异常的性质(当解释器不理解代码语法时会引发异常),错误消息可能无法将正确的行标识为问题的来源。
我看到的第一个语法错误是您在break
函数中使用GetMessage
而没有处于循环中。 break
语句仅在for
或while
块中有用,并且在其他地方使用(在这种情况下在except
块中)是语法错误。
下一组错误与缺少的冒号有关。 DecodeInput
和SetPower
中的每个条件分支都需要在条件之后包含冒号:if condition1:
,elif condition2:
,else:
使用else if
而不是elif
也是错误的(如果在{{1}之后添加冒号,换行符和额外级别的缩进,则可以使其有效然后使用单独的else:
语句,但这会浪费空间。)
还有一些其他问题,但它们不是语法错误。例如,您在定义之前从顶级代码调用您的函数,而if
有一行表达式为DecodeInput
但不做任何有用的东西(你可能想用一些参数调用SetPower
)。
希望这会让你走上正轨。
答案 1 :(得分:1)
修复冒号后,您可能会遇到GetMessage
语法问题。除非你在循环中,否则你不能break
。如果您打算从例外返回,则不需要pass
电话。这个方法可以(应该?)看起来的一个例子(从你的代码中简化):
def GetMessage():
data = None
try:
data = [1,2]
if len(data) == 0:
return None
except IOError:
return None
return data
显然,您需要使用自己的代码替换大部分方法,并确定您是否真的想要return
来自放置break
的点的函数。