我是go编程语言的新手。尝试使用gousb访问epson收据打印机。
所以我从repo中获取了一些示例代码并重新调整了一下,以验证我是否可以访问打印机。
我可以看到打印机并枚举端点。我收到了这个输出:
Printer found: 020.005 Receipt Printer M129C/TM-T70 (Seiko Epson Corp.)
Length of device array: 1
[0] 020.005 04b8 - 0202
[0] Config 01 [1]
[0]--------------[0]
[0] Interface 00 Setup 00 [0]
Vendor Specific Class (Vendor Specific Subclass)
[0] [1] Endpoint #1 OUT bulk - unsynchronized data [64 0] [OUT]
[1] [130] Endpoint #2 IN bulk - unsynchronized data [64 0] [IN]
我的理解是,如果我想给打印机写东西,我会打开与[OUT]对应的端点。这是我的麻烦开始的地方。
如果我使用outEP, err := thePrinter.OpenEndpoint(1,0,0,0)
,我会收到seg错误。如果我传递1,gousb假设我试图访问端点130 [IN]。
那么..我作为端点ID传递什么来访问OUT端点?
代码:
package main
import (
"fmt"
"strings"
"github.com/kylelemons/gousb/usb"
"github.com/kylelemons/gousb/usbid"
"C"
)
func main() {
ctx := usb.NewContext()
defer ctx.Close()
ctx.Debug(3)
var thePrinter *usb.Device
devs, _ := ctx.ListDevices(func(desc *usb.Descriptor) bool {
if strings.Contains(usbid.Describe(desc), "Seiko Epson Corp") {
fmt.Printf("Printer found: %03d.%03d %s\n", desc.Bus, desc.Address, usbid.Describe(desc))
return true
} else {
return false
}
})
fmt.Printf("Length of device array: %d\n", len(devs))
for x, dev := range devs {
fmt.Printf("[%d] %03d.%03d %s - %s\n", x, dev.Bus, dev.Address, dev.Vendor, dev.Product)
for i, cfg := range dev.Configs {
// This loop just uses more of the built-in and usbid pretty printing to list
// the USB devices.
fmt.Printf(" [%d] %s [%d]\n", i, cfg, cfg.Config)
for j, alt := range cfg.Interfaces {
fmt.Printf(" [%d]--------------[%d]\n", j, alt.Number)
for k, iface := range alt.Setups {
fmt.Printf(" [%d] %s [%d]\n", k, iface, iface.Number)
fmt.Printf(" %s\n", usbid.Classify(iface))
for l, end := range iface.Endpoints {
fmt.Printf(" [%d] [%d] %s [%s]\n", l, end.Address, end, end.Direction() )
}
}
}
fmt.Printf(" --------------\n")
}
thePrinter=dev
}
outEP, err := thePrinter.OpenEndpoint(1,0,0,1)
fmt.Printf("OpenEndpoint Err: [%s]\n", err)
fmt.Printf("direction: [%s] %d\n", outEP.Info().Direction(), outEP.Info().Address)
message := []byte("hi there!\n")
_, outerr := outEP.Write(message)
fmt.Printf("write Err: [%s]", outerr)
}
编辑:在查看端点的值之前,我被要求检查OpenEndpoint返回的错误。这是返回的内容(它是零)
OpenEndpoint Err: [%!s(<nil>)]
direction: [IN] 130
OpenEndpoint Err: [%!s(<nil>)]
libusb: warning [libusb_exit] application left some devices open
write Err: [usb: write: not an OUT endpoint]
[Finished in 1.512s]
这是我发送端点号为零时收到的信息:
OpenEndpoint Err: [usb: unknown endpoint 00]
libusb: warning [libusb_exit] application left some devices open
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x20 pc=0x41e94c4]
goroutine 1 [running]:
main.main()
/Users/.../go/src/github.com/deltasonic/epson/main.go:63 +0xcb4
exit status 2
[Finished in 0.817s]
编辑:
我是在mac,Mac OS 10.12上尝试这个。
答案 0 :(得分:0)
github.com/kylelemons/gousb软件包已被弃用,转而使用github.com/google/gousb。请注意,新软件包的API略有不同 - 我们认为它应该不那么令人困惑。
话虽如此,您使用OpenEndpoint(1,0,0,1)的调用看起来是正确的 - 它应该在设备上设置配置#1,使用alt设置#0声明接口#0然后返回端点的表示地址0x01,这是一个OUT端点。看看gousb代码,我找不到任何明显的问题。您可以使用github中的当前头包重试,如果它仍然在OpenEndpoint(1,0,0,1)之后返回EP地址130(0x82),请在github上提交一个问题,这绝对不应该发生