我正在尝试为433 mhz收发器实施manchester协议 . 所以我写了一个简单的程序,使用2个引脚 - 一个用于发送,另一个用于接收信号 . 接收器部分使用IRQ截取引脚上的边沿变化,并读取其值以传递给曼彻斯特解码器 . 到目前为止它在理论和测试中看起来都不错,但实际上,一旦我开始向 transmitter 引脚写入一些数据 - receiver 引脚上的中断观察器就会停止工作 . 我使用相同的板连接 Launcher 和接收器部件 .

我创建了一些简单的程序,只是简单地观察边缘变化 - 除非你使用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")

}