我正在使用 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·韦德