如何同步 Raspberry Pi 中的时钟?
How to sync the clocks in Raspberry Pi?
我是 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)
您不应尝试根据时间同步发送方和接收方。你应该在发送方选择发送频率,让接收方只是坐在那里等待比特的到来,不要睡觉。因为睡觉会让你想念一些东西。
使用:
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)
单线协议
如果您不想使用两条线,另一种解决方案是创建一个简单的协议。例如:
- 每次传输由两个位组成: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)
我是 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)
您不应尝试根据时间同步发送方和接收方。你应该在发送方选择发送频率,让接收方只是坐在那里等待比特的到来,不要睡觉。因为睡觉会让你想念一些东西。
使用:
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)
单线协议
如果您不想使用两条线,另一种解决方案是创建一个简单的协议。例如:
- 每次传输由两个位组成: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)