Python для .NET: как предоставить переменную специального типа (FTDI.FT_DEVICE_INFO_NODE []) в качестве параметра метода - PullRequest
0 голосов
/ 09 мая 2018

Я хочу использовать DLL с помощью Python для .NET (pythonnet). Методы в этой DLL требуют (указатель на?) Переменные в качестве параметров.

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

Я не мог понять, как предоставить такую ​​переменную параметра, если требуется специальный тип (здесь: FTD2XX_NET.FTDI.FT_DEVICE_INFO_NODE []).

При игре с различными вариантами вызова FTDI.GetDeviceList (некоторые из них технически одинаковы), я получаю различные ошибки типа:

TypeError: Ни один метод не соответствует заданным аргументам

  • FTDI.GetDeviceList([ftdi.FT_DEVICE_INFO_NODE()][:])
  • FTDI.GetDeviceList(ftdi.FT_DEVICE_INFO_NODE)
  • FTDI.GetDeviceList(ftdi.FT_DEVICE_INFO_NODE())
  • FTDI.GetDeviceList(ftdi.FT_DEVICE_INFO_NODE(device_count))
  • FTDI.GetDeviceList([devicelist_])
  • FTDI.GetDeviceList(devicelist_)

Ошибка типа: неиндексируемый объект

  • FTDI.GetDeviceList(ftdi.FT_DEVICE_INFO_NODE()[:])

Ошибка типа: ожидаемый тип (ы)

  • FTDI.GetDeviceList(ftdi.FT_DEVICE_INFO_NODE[:])

  • FTDI.GetDeviceList(ftdi.FT_DEVICE_INFO_NODE[1])

  • FTDI.GetDeviceList(ftdi.FT_DEVICE_INFO_NODE[0])

Вот сводка кода и результаты:

import clr
import sys
sys.path.append("C:\\Users\\[...]\\FTD2XX_NET_v1.1.0\\") # path to dll
clr.AddReference("System")
clr.AddReference("FTD2XX_NET")
from FTD2XX_NET import FTDI
from System import UInt32
ftdi = FTDI()

if __name__ == '__main__':

# This method requires an integer as parameter, the code is working
    # M:FTD2XX_NET.FTDI.GetLibraryVersion(System.UInt32@)
    # summary: Gets the current FTD2XX.DLL driver version number.
    # returns: FT_STATUS value from FT_GetLibraryVersion in FTD2XX.DLL
    # param: name: LibraryVersion. The current library version.

    version_ = 0 # empty variable to provide as parameter
    ft_status, version = ftdi.GetLibraryVersion(version_)
    print('status: {}\nversion: {}'.format(ft_status, version)) 
    # prints 
    # status: 0
    # version: 197140

# This method requires an FT_DEVICE_INFO_NODE[] as parameter, the code is not working
    # M:FTD2XX_NET.FTDI.GetDeviceList(FTD2XX_NET.FTDI.FT_DEVICE_INFO_NODE[])
    # summary: Gets information on all of the FTDI devices available.
    # returns: FT_STATUS value from FT_GetDeviceInfoDetail in FTD2XX.DLL
    # param: name: devicelist. 
    #        An array of type FT_DEVICE_INFO_NODE to contain the device information 
    #        for all available devices.

    # no idea how to create the fitting parameter FT_DEVICE_INFO_NODE[]
    devicelist_ = ftdi.FT_DEVICE_INFO_NODE() # empty variable to provide as parameter
    print(devicelist_.Flags, devicelist_.Type, devicelist_.ID, 
          devicelist_.LocId, devicelist_.SerialNumber, 
          devicelist_.Description, devicelist_.ftHandle) 
    # prints
    # 0 0 0 0 None None 0

    status, devicelist = FTDI.GetDeviceList(devicelist_)
    print(devicelist)
    # throws a TypeError: No method matches given arguments

Здесь Я нашел некоторый c # -код, где FT_DEVICE_INFO_NODE [] и GetDeviceList используются в методе:

private int countDevices()
{
    FTDI.FT_STATUS ftStatus = FTDI.FT_STATUS.FT_OK;
    ftStatus = myDevice.GetNumberOfDevices(ref ftdiDeviceCount);
    if (ftStatus != FTDI.FT_STATUS.FT_OK)
        return 0;
    if (ftdiDeviceCount > 0)
    {
        //allocate device info list
        ftdiDeviceList = new FTDI.FT_DEVICE_INFO_NODE[ftdiDeviceCount];
        //populate list
        ftStatus = myDevice.GetDeviceList(ftdiDeviceList);
        if (ftStatus == FTDI.FT_STATUS.FT_OK)
        {
            return (int)ftdiDeviceCount;
        }
        else
            return 0;
    }
    else
        return 0;
}

Что мне не хватает в предоставлении FTDI.FT_DEVICE_INFO_NODE[] в качестве параметра FTDI.GetDeviceList?

Драйвер USB от FTDI был загружен здесь: http://www.ftdichip.com/Drivers/D2XX.htm,, а оболочка .Net - здесь: http://www.ftdichip.com/Support/SoftwareExamples/CodeExamples/CSharp.htm

1 Ответ

0 голосов
/ 05 июля 2018

Исходный код ожидает список, содержащий FT_DEVICE_INFO_NODE. Вот объявление функции:

public FTDI.FT_STATUS GetDeviceList(FTDI.FT_DEVICE_INFO_NODE[] devicelist)

Этот код работал для меня:

ft_device_info_node = ftdi.FT_DEVICE_INFO_NODE()
ft_status = ftdi.GetDeviceList([ft_device_info_node])
print(ft_status)

В конце концов я отказался от этой функции, потому что не мог заставить ее вернуть то, что хотел, и вместо этого использовал функции «GetDeviceID», «GetDescription» и «GetSerialNumber» отдельно после открытия устройства, которое я хотел получить информацию от.

Пример:

# Open
ftdi.OpenByIndex(0)
print("Opened Index 0")

# Get Device ID
device_id = 0
ft_status, device_id = ftdi.GetDeviceID(device_id)
assert(ft_status == 0)
print(device_id)

# Close
ftdi.Close()
print("Closed")

...