下面是我在Intel Galileo Gen2上运行的代码。我只是想知道为什么当对象非常接近超声波传感器程序停止并抱怨变量sig"局部变量'sig'在赋值之前引用"?
import mraa
import time
trig = mraa.Gpio(0)
echo = mraa.Gpio(1)
trig.dir(mraa.DIR_OUT)
echo.dir(mraa.DIR_IN)
def distance(measure='cm'):
trig.write(0)
time.sleep(0.2)
trig.write(1)
time.sleep(0.00001)
trig.write(0)
while echo.read() == 0:
nosig = time.time()
while echo.read() == 1:
sig = time.time()
# et = Elapsed Time
et = sig - nosig
if measure == 'cm':
distance = et * 17150
elif measure == 'in':
distance = et / 0.000148
else:
print('improper choice of measurement!!')
distance = None
return distance
while True:
print(distance('cm'))
您的问题是您的传感器产生的尖峰太短而无法被注意到,因为您的while echo.read()
的采样频率有限。
这样就不会定义变量sig
。
为了克服这个问题,在进入函数时定义sig = None
,然后稍后测试它是否为None
-然后您知道您不能使用您的测量。
如果你想以更高的频率采样,你需要使用比Python更快的语言,例如c++。
问题是:
while echo.read() == 0:
nosig = time.time()
while echo.read() == 1:
sig = time.time()
如果满足第一个条件,并且在读取下一行之前没有返回1,则sig将永远不会得到值。