我是raspberry pi的新手,试图从发送者向接收者发送一串比特。然而,大多数时候没有以正确的模式接收比特,它们似乎被移动了一点。我想我无法正确同步它们。有谁可以同步时钟
Python代码在这里
# Sender
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setup(23, GPIO.OUT)
while True:
GPIO.output(23, GPIO.HIGH)
time.sleep(1)
GPIO.output(23, GPIO.LOW)
time.sleep(1)
# .... some more bits here
# Receiver
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.IN)
while True:
bit = GPIO.input(17)
print bit
time.sleep(1)
答案 0 :(得分:4)
您不应该尝试根据时间同步发件人和收件人。您应该选择发送方发送的频率,让接收方只是坐在那里等待比特来,而不是睡觉。因为睡觉会让你错过任何东西。
使用:
GPIO.add_event_detect(17, GPIO.BOTH, callback=my_callback)
收听PIN的更改,并在发生时执行my_callaback
。
您也可以选择通过GPIO.RISING
或通过GPIO.FALLING
下降等待上升沿。
对于您的示例,这里有一些东西可以开始,没有经过测试或其他任何东西:
import RPi.GPIO as GPIO
from time import sleep
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.IN)
def readbit(channel):
bit = GPIO.input(17)
print bit
GPIO.add_event_detect(17, GPIO.BOTH, callback=readbit)
while True:
sleep(1) # do something useful here
这可能不够,因为你无法检测到不会改变状态的位。 要解决这个问题,你有很多选择,我只会提到两个最简单的选择:
您可以使用另一个PIN作为控制信号,并使用它来触发接收器上的读数。这样,您可以在控制引脚的上升沿触发读操作,并读取数据引脚的值。
发件人:
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)
如果您不想使用两条线,另一种解决方案是创建一个简单的协议。例如:
这可能很复杂,但实际上并非如此。您现在需要做的就是在上升沿触发读数,然后在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)