提问人:AndyS 提问时间:1/17/2023 最后编辑:AndyS 更新时间:1/17/2023 访问量:285
Golang (Win11) 可以向 TinyGo USB HID 设备发送消息吗 (Badger2040)
Can Golang (Win11) send messages to a TinyGo USB HID device (Badger2040)
问:
注意:以下内容可能是不可能的 - 我找不到 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)并且输出(通常)出现(但缓冲区可能会填充并失败......send
print
答:
不确定。但我认为你可以用 circuitPy 更轻松地做到这一点,因为它支持 HID,请参阅 https://circuitpython.org/board/pimoroni_badger2040/
评论
我从 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 - 以及任何其他方式将其关闭。
评论