gpt4 book ai didi

python - 如何在 Raspberry Pi 中同步时钟?

转载 作者:太空宇宙 更新时间:2023-11-03 15:08:33 26 4
gpt4 key购买 nike

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

最佳答案

您不应尝试根据时间同步发送方和接收方。你应该在发送方选择发送频率,让接收方只是坐在那里等待比特的到来,不要 sleep 。因为 sleep 会让你错过一些东西。

使用:

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)

单线协议(protocol)

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

  • 每次传输由两个比特组成: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)

关于python - 如何在 Raspberry Pi 中同步时钟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29906547/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com