======================================================
一般情况
======================================================
1.一般情况下,超声波测距仪的核心python程序如下:
GPIO.output(TrigPin, 1)
time.sleep(0.00001)
GPIO.output(TrigPin, 0)
while GPIO.input(EchoPin) == 0:
pass
time1 = time.time()
while GPIO.input(EchoPin) == 1:
pass
time2 = time.time()
during = time2 - time1
distance = (during * 340 / 2 * 100)
核心程序是先计算时间差during,后,通过超声波的传播速度,计算出距离distance。
======================================================
问题
======================================================
以上代码,在主线程中是没有问题的,但当在主线程中启动2个子线程(分别为t1和t2),其中1个子线程(t2)是实时计算超声波测距仪测量的距离,那么连续测量出的距离就会出现较大的偏差(会计算出2000公里的连续数据)。
======================================================
问题分析
======================================================
分析认为,应该是Python多线程的机制造成的(全局解释器锁(GIL))
t2子线程在计算time1 =time.time()后被挂起,过一段时间后,继续t2子线程,则计算了time2 = time.time(),此时,计算时间差during实际是包含了被挂起的时间,因此计算出的距离就会有问题。
======================================================
问题解决
======================================================
放弃线程,采用进程,问题解决! |