Как использовать powershell для получения информации об устройстве с помощью FT_ListDevices библиотеки драйверов FTDI D2XX

Я использую 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

Сотрудник и я смогли заставить Второй пример работать, но нам не удалось получить Третий. Ниже приведен код, который работает. Третий пример похож на пример ниже, однако он использует массив массивов вместо байтового массива, как в рабочем коде ниже.

#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()

Таким образом, цель здесь состоит в том, чтобы изменить Array на Byte[][] в операторе DLLimport, но
это приведет к ошибке.,,

ОШИБКА: "Нет поддержки маршалинга для вложенных массивов"

Я провел некоторые исследования и попытался использовать пользовательский маршалинг, но это привело к другой ошибке.

ОШИБКА: "Не удалось найти тип или имя пространства имен" ICuztomMarshaler ""

Мне нужно иметь возможность отправить массив Jagged/Nested в библиотеку, чтобы получить это
работать.

Пожалуйста, помогите и спасибо заранее. Дж. Уэйд

1 ответ

Используете ли вы версию PowerShell для 64 или x86 для запуска кода? У меня раньше была похожая проблема, потому что драйвер не мог найти устройства при запуске "неправильной" битовой версии PowerShell.

Другие вопросы по тегам