如何同步 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)