如何在Raspberry Pi中同步时钟?

时间:2015-04-27 21:46:00

标签: python python-2.7 synchronization raspberry-pi clock-synchronization

我是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)

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)

单线协议

如果您不想使用两条线,另一种解决方案是创建一个简单的协议。例如:

  • 每次传输都由两位组成: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)