2016-02-18 5 views
0

Я использую USB-устройство FT245R для параллельного интерфейса FIFO. Чип использует библиотеку FTDI D2XX. Я использую powershell и DllImport для загрузки и доступа к библиотечным функциям. У меня возникла проблема с использованием функции FT_ListDevices. Ссылка и примеры для устройства можно найти по ссылке ниже. См Страницы 11, 12 и часть 13Как использовать powershell для получения информации об устройстве с помощью FT_ListDevices библиотеки драйверов FTDI D2XX

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 

[email protected]' 
[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 += ,"" 

[email protected]' 
[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() 

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

ОШИБКИ: «Там нет поддержки сортировочной для вложенных массивов»

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

ОШИБКА: «Тип или пространство имен имя„ICuztomMarshaler“не может быть найден»

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

Пожалуйста, помогите и благодарите вас заранее. J. Wade

ответ

0

Вы используете версию PowerShell 64 или x86 для запуска кода? Раньше у меня была аналогичная проблема, потому что драйвер не смог найти устройства при запуске «неправильной» битовой версии PowerShell.

+0

Благодарим вас за быстрый ответ. В настоящее время я запускаю 64-битную версию Powershell. Драйверы D2XX поставляются с 64 и 32 бит. Я перезагрузил драйверы, чтобы убедиться, что используется 64 бит. J. Wade – user2981057

+0

Negorath, я попытался проголосовать за ваш ответ, но у меня недостаточно очков репутации. Я не делаю этого очень часто, поэтому я не инвестирую требуемую деятельность, чтобы увеличить свои очки репутации. Еще раз спасибо. Дж. Уэйд – user2981057