我正在尝试为433 mhz收发器实施manchester协议。所以我写了一个简单的程序,使用2个引脚 - 一个用于发送,另一个用于接收信号。接收器部分使用IRQ截取引脚上的边沿变化,并读取其值以传递给曼彻斯特解码器。到目前为止它在理论和测试中看起来都不错,但实际上,一旦我开始将一些数据写入发送器引脚 - 接收器引脚上的中断观察器就会停止工作。我使用相同的板连接发射器和接收器部件。
我创建了一些简单的程序来简单地观察边缘变化 - 除非你使用mem(wirespi gpio)或sysfs将值写入另一个引脚,否则它会截获这些变化。此时中断停止发生。
我错过了什么吗?
以下是使用GPIO 17读取和观察边沿变化的原始样本,以及用于传输信号的GPIO 21。
package main
import (
"github.com/jdevelop/go-manchester/manchester"
"github.com/davecheney/gpio"
"fmt"
"os"
"strconv"
"time"
)
func receive(bps int) {
pin, err := gpio.OpenPin(17, gpio.ModeInput)
if err != nil {
panic(err)
}
frame := manchester.NewDataFrame()
driver := manchester.NewManchesterDriver(int64(bps), 1000000)
if err = pin.BeginWatch(gpio.EdgeBoth, func() {
driver.ReadBit(manchester.Up, time.Now().UnixNano(), func(bool) {
val := pin.Get()
println(val)
if frame.ReadBit(val) {
println("DONE")
}
})
}); err != nil {
panic(err)
}
defer pin.EndWatch()
defer pin.Close()
time.Sleep(10 * time.Second)
fmt.Println(frame)
}
func main() {
text := os.Args[2]
bps, _ := strconv.Atoi(os.Args[1])
driver := manchester.NewManchesterDriver(int64(bps), 100)
frame := manchester.BuildDataFrame([]byte(text))
pin, _ := gpio.OpenPin(21, gpio.ModeOutput)
pin.Clear()
defer pin.Close()
logger := make(chan bool, 100)
loggerF := func() {
for {
select {
case lvl := <-logger:
if lvl {
fmt.Print(1)
} else {
fmt.Print(0)
}
}
}
}
signal := func(level bool) {
if level {
pin.Set()
} else {
pin.Clear()
}
}
go loggerF()
go receive(bps)
frame.WriteFrame(func(bit bool) {
logger <- bit
driver.WriteBit(bit, signal)
})
pin.Clear()
fmt.Println()
fmt.Println("Done")
}