在 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")
    }
}

这里有一些尝试:

  1. usbtmc.De 行似乎不完整或示例代码中有错字。你能提供完整的行吗?
  2. 确认您使用的 VISA 地址字符串对于您的万用表是正确的。
  3. 自从提出这个问题后,gotmc/usbtmc 项目有了一些更新,所以我建议您在 go.mod.
  4. 中使用 v0.4.0 或更新版本
  5. 尝试调试时暂时消除 gotmc/visa
  6. 启用 USB 调试,如下面的代码所示,运行使用 USB 调试级别 4 启动程序。
  7. 尝试使用 NewDeviceByVIDPID() 而不是 NewDevice()
  8. 万用表的是德科技型号是多少?

命令 运行 使用 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)
    }
}