在 Linux 中通过 USB 连接到 USBTMC 设备
Connecting to USBTMC devices via USB in Linux
我目前正在实施一个 gotmc/VISA 包来将 SCPI 命令发送到我的万用表。
但每次我尝试连接到设备时,它都会收到相同的消息:
libusb: device or resource busy [code -6].
有办法解决这个问题吗?
从我读到的一个来源,我需要从设备上分离内核,但我可以从这个包中做到这一点吗?
如果有另一个支持通过 USB 的 SCPI 命令的软件包,我将不胜感激。
这是我的示例代码:
package main
import (
"fmt"
"io"
"log"
"time"
_ "github.com/gotmc/usbtmc/driver/google"
"github.com/gotmc/visa"
_ "github.com/gotmc/visa/driver/usbtmc"
)
const (
usbAddress string = "USB0::10893::4610::MY58130019::INSTR"
)
func main() {
fg, err := visa.NewResource(usbAddress)
usbtmc.De
if err != nil {
log.Fatal("Couldn't open the resource for the function generator")
}
}
这里有一些尝试:
usbtmc.De
行似乎不完整或示例代码中有错字。你能提供完整的行吗?
- 确认您使用的 VISA 地址字符串对于您的万用表是正确的。
- 自从提出这个问题后,gotmc/usbtmc 项目有了一些更新,所以我建议您在
go.mod
. 中使用 v0.4.0 或更新版本
- 尝试调试时暂时消除 gotmc/visa。
- 启用 USB 调试,如下面的代码所示,运行使用 USB 调试级别 4 启动程序。
- 尝试使用
NewDeviceByVIDPID()
而不是 NewDevice()
。
- 万用表的是德科技型号是多少?
命令 运行 使用 USB 4 级调试
$ ./myprogram -d=4
go.mod
module github.com/myproj/myrepo
go 1.12
github.com/gotmc/usbtmc v0.4.0
main.go
package main
import (
"flag"
"log"
"time"
"github.com/gotmc/usbtmc"
_ "github.com/gotmc/usbtmc/driver/google"
)
var (
debugLevel uint
)
func init() {
const (
defaultLevel = 1
debugUsage = "USB debug level"
)
flag.UintVar(&debugLevel, "debug", defaultLevel, debugUsage)
flag.UintVar(&debugLevel, "d", defaultLevel, debugUsage+" (shorthand)")
}
func main() {
// Parse the config flags to determine the config JSON filename
flag.Parse()
// Create new USBTMC context and new device.
start := time.Now()
ctx, err := usbtmc.NewContext()
if err != nil {
log.Fatalf("Error creating new USB context: %s", err)
}
ctx.SetDebugLevel(int(debugLevel))
mm, err := ctx.NewDevice("USB0::10893::4610::MY58130019::INSTR")
// You could try the following instead:
// mm, err := ctx.NewDeviceByVIDPID(10893, 4610)
if err != nil {
log.Fatalf("NewDevice error: %s", err)
}
log.Printf("%.2fs to create new device.", time.Since(start).Seconds())
// Send a SCPI command to the multimeter.
mm.WriteString("*CLS\n")
// Close the multimeter and USBTMC context and check for errors.
err = mm.Close()
if err != nil {
log.Printf("error closing mm: %s", err)
}
err = ctx.Close()
if err != nil {
log.Printf("Error closing context: %s", err)
}
}
我目前正在实施一个 gotmc/VISA 包来将 SCPI 命令发送到我的万用表。
但每次我尝试连接到设备时,它都会收到相同的消息:
libusb: device or resource busy [code -6].
有办法解决这个问题吗? 从我读到的一个来源,我需要从设备上分离内核,但我可以从这个包中做到这一点吗?
如果有另一个支持通过 USB 的 SCPI 命令的软件包,我将不胜感激。
这是我的示例代码:
package main
import (
"fmt"
"io"
"log"
"time"
_ "github.com/gotmc/usbtmc/driver/google"
"github.com/gotmc/visa"
_ "github.com/gotmc/visa/driver/usbtmc"
)
const (
usbAddress string = "USB0::10893::4610::MY58130019::INSTR"
)
func main() {
fg, err := visa.NewResource(usbAddress)
usbtmc.De
if err != nil {
log.Fatal("Couldn't open the resource for the function generator")
}
}
这里有一些尝试:
usbtmc.De
行似乎不完整或示例代码中有错字。你能提供完整的行吗?- 确认您使用的 VISA 地址字符串对于您的万用表是正确的。
- 自从提出这个问题后,gotmc/usbtmc 项目有了一些更新,所以我建议您在
go.mod
. 中使用 v0.4.0 或更新版本
- 尝试调试时暂时消除 gotmc/visa。
- 启用 USB 调试,如下面的代码所示,运行使用 USB 调试级别 4 启动程序。
- 尝试使用
NewDeviceByVIDPID()
而不是NewDevice()
。 - 万用表的是德科技型号是多少?
命令 运行 使用 USB 4 级调试
$ ./myprogram -d=4
go.mod
module github.com/myproj/myrepo
go 1.12
github.com/gotmc/usbtmc v0.4.0
main.go
package main
import (
"flag"
"log"
"time"
"github.com/gotmc/usbtmc"
_ "github.com/gotmc/usbtmc/driver/google"
)
var (
debugLevel uint
)
func init() {
const (
defaultLevel = 1
debugUsage = "USB debug level"
)
flag.UintVar(&debugLevel, "debug", defaultLevel, debugUsage)
flag.UintVar(&debugLevel, "d", defaultLevel, debugUsage+" (shorthand)")
}
func main() {
// Parse the config flags to determine the config JSON filename
flag.Parse()
// Create new USBTMC context and new device.
start := time.Now()
ctx, err := usbtmc.NewContext()
if err != nil {
log.Fatalf("Error creating new USB context: %s", err)
}
ctx.SetDebugLevel(int(debugLevel))
mm, err := ctx.NewDevice("USB0::10893::4610::MY58130019::INSTR")
// You could try the following instead:
// mm, err := ctx.NewDeviceByVIDPID(10893, 4610)
if err != nil {
log.Fatalf("NewDevice error: %s", err)
}
log.Printf("%.2fs to create new device.", time.Since(start).Seconds())
// Send a SCPI command to the multimeter.
mm.WriteString("*CLS\n")
// Close the multimeter and USBTMC context and check for errors.
err = mm.Close()
if err != nil {
log.Printf("error closing mm: %s", err)
}
err = ctx.Close()
if err != nil {
log.Printf("Error closing context: %s", err)
}
}