我有一个可以通过SIUSBXP(Silicon Labs)访问的硬件。

有没有一种方法可以直接从Go中访问硬件?

还是应该编写C/C++包装并将其链接到Go程序?

最佳答案

特别是关于此dll,我使这种动物起作用了:

SiUSBXp                      = syscall.MustLoadDLL("SiUSBXp.dll")
SIGetNumDevices              = SiUSBXp.MustFindProc("SI_GetNumDevices")
SIGetProductString           = SiUSBXp.MustFindProc("SI_GetProductString")
.
.
.
... and so on...

这样,第一行将加载dll,其他行将引用所需的功能。

调用一个函数,例如:
func GetNumDevices() int {
var lpdwNumDevices int
r1, _, _ := SIGetNumDevices.Call(uintptr(unsafe.Pointer(&lpdwNumDevices)))

if int(r1) == StatusSISUCCESS {
    if lpdwNumDevices == 1 {
        log.Println(lpdwNumDevices,"hardware(s) found")
    }
    return lpdwNumDevices
}

return -1
}

据我所知,当您需要与另一个dll通信时,可以使用这种代码。

请注意,我没有使用cgo。

10-06 14:45