在Linux中通过USB连接到USBTMC设备

时间:2019-01-18 16:33:54

标签: go usb libusb visa

我目前正在实现gotmc / VISA软件包,以将SCPI命令发送到万用表。

但是每次我尝试连接到设备时,都会收到相同的消息:

  

libusb:设备或资源繁忙[代码-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 个答案:

答案 0 :(得分:1)

以下是一些可以尝试的事情:

  1. 示例代码中的usbtmc.De行似乎不完整或有错字。您能提供完整的行吗?
  2. 确认您使用的VISA地址字符串对您的万用表正确。
  3. 自提出此问题以来,gotmc/usbtmc项目已经进行了一些更新,因此我建议您在go.mod中使用v0.4.0或更高版本。
  4. 在尝试调试时暂时消除gotmc/visa
  5. 启用以下代码中所示的USB调试,并使用USB调试级别4运行程序。
  6. 尝试使用NewDeviceByVIDPID()而不是NewDevice()
  7. 万用表的Keysight型号是什么?

使用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)
    }
}