您不应该尝试根据时间同步发送方和接收方。你应该在发送方选择发送的频率,让接收方坐在那里等待比特的到来,而不是睡觉。因为睡觉会让你错过东西。在
使用:GPIO.add_event_detect(17, GPIO.BOTH, callback=my_callback)
监听PIN上的更改,并在发生更改时执行my_callaback。
您也可以选择等待上升沿通孔GPIO.RISING或下降通孔GPIO.FALLING。在
例如,这里有一些东西可以开始,没有经过测试或任何东西:
^{pr2}$
这可能还不够,因为你无法检测到不改变状态的位。
要解决这个问题,您有很多选择,我只想提两个最简单的选项:
控制信号
您可以使用另一个管脚作为控制信号,并用它触发接收器上的读数。这样,您就触发了对控制引脚上升沿的读取,并读取数据引脚的值。在
发送人:def send_bit(pin, bit):
GPIO.output(24, GPIO.HIGH) # first send the control bit
GPIO.output(pin, bit): # then the data on another pin
while True:
send_bit(23, GPIO.HIGH)
time.sleep(1)
send_bit(23, GPIO.LOW)
time.sleep(1)
在接收器上:DATA_PIN = 17
CONTROL_PIN = 18 # or whatever
def readbit(channel):
bit = GPIO.input(DATA_PIN)
print bit
GPIO.add_event_detect(CONTROL_PIN, GPIO.RISING, callback=readbit)
单线协议
另一个解决方案,如果你不想使用两根电线,那就是创建一个简单的协议。例如:每次传输由两个位组成:1和X
要传输的数据位是X,而第一位总是1,并充当接收器的触发器
保证X位在第一位上升沿后0.1到0.9秒处于活动状态。在
这可能很复杂,但实际上并非如此,你现在需要做的就是触发上升沿的读数,然后在0.1到0.9秒之间读取数据。我们把时间定在0.5秒,以确保我们在这段时间的中间。在
发送人:def send_bit(pin, bit):
GPIO.output(pin, GPIO.HIGH) # send the control bit first, always HIGH
GPIO.output(pin, bit) # send the actual data bit
while True:
send_bit(23, GPIO.HIGH)
time.sleep(1)
send_bit(23, GPIO.LOW)
time.sleep(1)
# .... some more bits here
在接收器上:def readbit(channel):
time.sleep(0.5) # waiting to be in the safe time for read
bit = GPIO.input(17)
print bit
GPIO.add_event_detect(17, GPIO.RISING, callback=readbit)