Golang (Win11) 可以向 TinyGo USB HID 设备发送消息吗 (Badger2040)

Can Golang (Win11) send messages to a TinyGo USB HID device (Badger2040)

提问人:AndyS 提问时间:1/17/2023 最后编辑:AndyS 更新时间:1/17/2023 访问量:285

问:

注意:以下内容可能是不可能的 - 我找不到 USB 规范中是否。

我目前正在使用 Badger2040 作为键盘 - 使用 TinyGo 的 USB HID - 效果很好。

我还可以(我没想到)从 Badger2040 到控制台并在 Putty 上查看打印结果(尽管它似乎不可靠并且从那时起所有输出都失败 - 但 badger2040 程序仍在运行)。print

我还想从 Putty(和 PC Go 应用程序) Badger2040 发送 (USB HID OUT?) 文本。我尝试在 Putty 中输入文本,但它没有发送(即使在按 Enter 键时)。

那么 - 首先 - 这是可能的(或不可能的)吗?我猜也许 USB HID 协议握手(或 TinyGo 版本)无法启用从(在我的情况下)PC 主机到 Badger2040 设备的标准(串行?)通信。我查看了 https://github.com/tinygo-org/tinygo/blob/release/src/machine/usb.go 并且 EnableHID 没有设置 RxHandler - 这是一个错误还是必需的?

或者,我可以使用 USB HID OUT(我对此一无所知)将数据从 PC 主机发送到 Badger2040,就好像它是带显示器的键盘一样吗?如果有人知道 TinyGo 的例子会很棒——我自己还没有找到。

我的 go 代码包括:

...
import (
...
    "machine/usb/hid/keyboard"
)
...
var kbd = keyboard.New()


func kbd_send(str string) {
    kbd.Write([]byte(str))
}

我可以将字符串键入为键盘 - 我还可以(明显不可靠)将 Putty 终端设置为 Speed:115200、Serial、(COM5) 和默认值(数据位:8,停止位:1,奇偶校验:无,流:XON/XOFF)并且输出(通常)出现(但缓冲区可能会填充并失败......sendprint

USB 隐藏 RP2040 Tinygo

评论


答:

0赞 willwade 1/17/2023 #1

不确定。但我认为你可以用 circuitPy 更轻松地做到这一点,因为它支持 HID,请参阅 https://circuitpython.org/board/pimoroni_badger2040/

评论

0赞 AndyS 1/17/2023
谢谢 - 我还找到了 CircuitPython,它可能会做我想要的 - 但后来我设法让它与 TinyGo 一起工作:)在一定程度上知道这是可能的,这产生了巨大的影响......
0赞 AndyS 1/17/2023 #2

我从 https://github.com/tinygo-org/tinygo/blob/release/src/examples/echo/echo.go 的一个示例中找到了一种同时拥有通信和 USB HID 的方法 - 通过使用非标准 IO。

事情比我真正理解的要多得多 - 但 USB HID 设备有可能(如 CircuitPython 所详述的那样)例如鼠标和键盘,这也适用于 TinyGo。但是,我目前只需要能够做单个设备和单独的串行通信。

代码有点长 - 而且根本没有重构 - 但这里有一个小示例,可能会帮助其他人(也使用我在问题中发布的代码):

...
    uart := machine.Serial
    uart.Configure(machine.UARTConfig{TX: machine.UART_TX_PIN, RX: machine.UART_RX_PIN})
...
    uart.Write([]byte("Started...\r\n")) // This shows fine
...
    for {
...     // this code below is specific to myself - just checks for a button being pressed
        button_b.Refresh()
        if button_b.Changed && button_b.Val {
            kbd_send("b") // this send a key press to the connected PC
            // println("be good") // this doesn't work now seems to hang
            uart.Write([]byte("b-")) // this appears in putty
        }
...
        if uart.Buffered() > 0 {
            b, _ := uart.ReadByte()
            led.Set(b == byte('z'))
        }
    // sleep here
.. } // ever

现在,这将允许您通过腻子打开/关闭 LED - 按先前的设置连接 - 通过 z 型打开 LED - 以及任何其他方式将其关闭。