Я хочу использовать 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