0

我正在使用 FT245R USB 到并行 FIFO 接口设备。该芯片使用 FTDI D2XX 库。我正在使用 powershell 和 DllImport 来加载和访问库函数。我在使用 FT_ListDevices 函数时遇到问题。该设备的参考和示例可以在下面的链接中找到。请参见第 11、12 页和第 13 页的一部分

http://www.ftdichip.com/Support/Documents/ProgramGuides/D2XX_Programmer's_Guide(FT_000071).pdf _

我和一位同事能够让第二个示例工作,但我们没有成功获得第三个示例。下面是有效的代码。第三个示例类似于下面的示例,但是它使用数组数组而不是 Byte 数组,如下面的工作代码中所示。

#2. Get serial number of first device
$FT_LIST_BY_INDEX = '0x40000000'
$FT_OPEN_BY_SERIAL_NUMBER = 1

$numDevs = 0

$SerialNumber = New-Object byte[] 64

$run=@'
[DllImport("FTD2XX.dll")] static public extern UInt32 FT_ListDevices(System.IntPtr pvArg1, byte[] pvArg2, System.UInt32 dwFlags);
'@
$typef = Add-Type -MemberDefinition $run -Name "ListDevices" -PassThru
$typef::FT_ListDevices($numDevs, $SerialNumber, $FT_LIST_BY_INDEX -bor $FT_OPEN_BY_SERIAL_NUMBER)
[System.Text.Encoding]::ASCII.GetString($SerialNumber)

下面是使示例 3 起作用的最佳尝试。

#3. Get device descriptions of all devices currently connected
$FT_LIST_ALL = '0x20000000'
$FT_OPEN_BY_SERIAL_NUMBER = 1
$FT_OPEN_BY_DESCRIPTION = 2
$numDevs = 0
$TotalnumDevs = 2

[Byte[][]]$BufferPtrs = (,([Byte[]] (,"" * 64)))*$TotalnumDevs
[Byte[][]]$BufferPtrs += ,""

$run=@'
[DllImport("FTD2XX.dll")] static public extern UInt32 FT_ListDevices(Array BufferPtrs, ref UInt32 pvArg2, UInt32 dwFlags);
'@
$typef = Add-Type -MemberDefinition $run -Name "ListDevices1" -PassThru
$ftStatus = $typef::FT_ListDevices($BufferPtrs, [ref] $numDevs, $FT_LIST_ALL -bor $FT_OPEN_BY_DESCRIPTION)
'(FT_OK = 0) ftStatus = ' + [string]$ftStatus
'Number of Devices = ' + [string]$numDevs
[ref] $BufferPtrs    #Display the Pointers Array
$BufferPtrs.GetType()

所以这里的目标是在DLLimport语句中把Array改成Byte[][],但是
这样会报错。. .

错误:“嵌套数组不支持封送处理”

我做了一些研究并尝试使用自定义编组,但这导致了另一个错误。

错误:“找不到类型或命名空间名称‘ICuztomMarshaler’”

我需要能够将 Jagged/Nested 数组发送到库以
使其正常工作。

请帮助并提前感谢您。J·韦德

4

1 回答 1

0

您是否使用 64 或 x86 版本的 PowerShell 来运行代码?我之前遇到过类似的问题,因为驱动程序在运行“错误”位版本的 PowerShell 时找不到设备。

于 2016-02-18T05:45:06.427 回答