Вопрос, поднятый пользователем, касается работы с библиотекой DLL в среде Delphi, в частности, с функцией I2C_DeviceWrite, которая используется для записи данных в I2C-устройства. Пользователь столкнулся с трудностями при объявлении параметров функции, которые в языке C представлены указателями.
Объявление функции I2C_DeviceWrite в Delphi
Для начала, рассмотрим объявление функции I2C_DeviceWrite в соответствии с документацией C API:
FT_STATUS I2C_DeviceWrite(
FT_HANDLE handle,
uint32 deviceAddress,
uint32 sizeToTransfer,
uint8 *buffer, // Указатель на буфер
uint32 *sizeTransferred, // Указатель на переменную, содержащую количество переданных байт
uint32 options
);
В языке C указатель обозначается символом *. В Delphi для работы с указателями используется тип PByte. Таким образом, параметр buffer необходимо объявить как PByte, а не как byte. Также параметр sizeTransferred необходимо объявить как PUInt32, чтобы передать указатель на переменную.
Объявление функции в Delphi будет выглядеть следующим образом:
function I2C_DeviceWrite(
handle :dword;
deviceAddress :uint32;
sizeToTransfer :uint32;
buffer :PByte; // Указатель на буфер данных
out sizeTransferred :PUInt32; // Указатель на переменную, содержащую количество переданных байт
options :uint32
): FT_Result; cdecl; external 'libmpsse.dll';
При вызове функции I2C_DeviceWrite необходимо передать адрес начала буфера и адрес переменной, которая будет содержать количество переданных байт. Пример кода на Delphi:
var
Buffer: array of Byte;
written, towrite: cardinal;
sizeTransferred: cardinal;
begin
SetLength(Buffer, I2C_DEVICE_BUFFER_SIZE);
Buffer[0] := $07;
towrite := 1;
i2c_openchannel(1, FT_HANDLE); // открыть канал 1
i2c_initchannel(FT_HANDLE, I2C_CLOCK_STANDARD_MODE and LATENCY_TIMER and 0);
i2c_devicewrite(FT_HANDLE, I2C_DEVICE_ADDRESS, towrite, @Buffer[0], @sizeTransferred, I2C_TRANSFER_OPTIONS_START_BIT);
i2c_closechannel(FT_HANDLE); // закрыть устройство
end;
Обратите внимание, что для передачи указателя на буфер используется оператор @.
Подтвержденный ответ
Пользователь неправильно перевел параметр массива байтов. Вместо out buffer: byte, который является одиночным байтом, передаваемым по ссылке, необходимо использовать buffer: PByte, что означает указатель на массив байтов. Затем необходимо передать адрес первого элемента массива, как показано в примере выше.
Также стоит отметить, что константный размер массива может быть проще в использовании, чем динамический массив.
Важно всегда проверять возвращаемые значения функций на наличие ошибок.
Заключение
Работа с библиотеками DLL в Delphi требует понимания того, как в C языке программирования работают указатели и как их можно использовать в Delphi. Правильное объявление функций с использованием указателей и буферов позволит корректно взаимодействовать с I2C-устройствами через библиотеку libmpsse.dll.
Вопрос связан с правильным объявлением функций, использующих указатели и буферы, в среде разработки Delphi при работе с библиотекой DLL, предназначенной для взаимодействия с I2C-устройствами.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.