gousb - 不是OUT端点

时间:2017-05-01 19:49:43

标签: go usb

我是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上尝试这个。

1 个答案:

答案 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上提交一个问题,这绝对不应该发生

相关问题