【笔记】Go语言操作USB

前言

Go语言操作USB

准备工作

  • 安装libusb环境

手动编译

1
2
apt-get install libusb-1.0-0-dev
apt-get install libusb-dev

下载依赖

1
go get github.com/google/gousb

引入依赖

1
import "github.com/google/gousb"

获取指定USB的VID和PID

1
lsusb -v

操作USB

ctx.OpenDeviceWithVIDPID(0x1111, 0x0000):通过VID和PID获取设备对象

1111:VID
0000:PID

main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package main

import (
"github.com/google/gousb"
"log"
)

func main() {
ctx := gousb.NewContext()
defer ctx.Close()

dev, err := ctx.OpenDeviceWithVIDPID(0x1111, 0x0000)
if err != nil {
log.Println("连接USB", "失败", "err:", err)
return
}
if dev == nil {
log.Println("连接USB", "为空", "dev:", dev)
return
}
log.Println("连接USB", "完成", "dev:", dev)
defer dev.Close()

// 获取默认接口
//intf, done, err := dev.DefaultInterface()
//if err != nil {
// log.Println("定义USB配置和接口", "失败", "err:", err)
// return
//}
//log.Println("定义USB配置和接口", "完成", "intf:", intf)
//defer done()

// 手动指定接口
cfg, err := dev.Config(1)
if err != nil {
log.Println("定义USB配置", "失败", "err:", err)
return
}
log.Println("定义USB配置", "完成", "cfg:", cfg)
defer cfg.Close()

intf, err := cfg.Interface(0, 0)
if err != nil {
log.Println("定义USB接口", "失败", "err:", err)
return
}
log.Println("定义USB接口", "完成", "intf:", intf)
defer intf.Close()

epOut, err := intf.OutEndpoint(0x02)
if err != nil {
log.Println("定义USB输出点", "失败", "err:", err)
return
}
log.Println("定义USB输出点", "完成", "epOut:", epOut)

epIn, err := intf.InEndpoint(0x82)
if err != nil {
log.Println("定义USB输入点", "失败", "err:", err)
return
}
log.Println("定义USB输入点", "完成", "epIn:", epIn)

writes, err := epOut.Write([]byte(command))
if err != nil {
log.Println("向USB输出", "失败", "err:", err)
return
}
log.Println("向USB输出", "完成", "err:", writes)

buf := make([]byte, 20)
readBytes, err := epIn.Read(buf)
if err != nil {
log.Println("从USB输入", "失败", "err:", err)
}
if readBytes == 0 {
log.Println("从USB输入", "为空", "readBytes:", readBytes)
return
}
log.Println("从USB输入", "完成", "readBytes:", readBytes)
log.Println("从USB输入", "完成", "string(buf):", string(buf))

}
  • 由于操作系统底层接口,所以需要root权限运行程序
1
sudo go run main.go

完成

参考文献

CSDN——_WindChimes
知乎——BBCoder
Go官方文档