Программирование PC FTDI: справочник по функциям библиотеки D2XX Fri, April 19 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

FTDI: справочник по функциям библиотеки D2XX Печать
Добавил(а) microsin   

BitBang. Технология BitBang для чипов FTDI означает управление ножками чипа через соединение USB. На компьютере запускается программа, которая с помощью вызовов функций из фирменной DLL FTDI может управлять логическими уровнями выводов микросхемы FTDI, и может читать логический уровень на этих выводах. Таким образом, ножки чипа FTDI работают как порты ввода/вывода микроконтроллера GPIO, но управляются они не из firmware микроконтроллера, а программой, работающей на компьютере.

Программное обеспечение, поддерживающее BitBang, называется D2XX Direct Drivers [1] и туда относится библиотека DLL (FTD2XX.DLL), которую должно загрузить приложение, чтобы впоследствии вызывать функции BitBang (FT_SetBitMode, FT_GetBitMode). На сайте FTDI есть примеры кода для C++ Builder, C#, Delphi, LabVIEW, Visual Basic, Visual C++ и других платформ [2]. Далее приведен перевод даташита FTDI "D2XX Programmer's Guide" [1].

D2XX. Интерфейс D2XX является проприетарной (закрытой) разработкой компании FTDI, специально предназначенной для программного интерфейса с чипами этой компании. Использует драйверы D2XX и FTD2XX.DLL.

VCP. Virtual COM Port - виртуальный последовательный порт (COM-порт), который получается в операционной системе Windows, когда к ней подключается устройство класса USB CDC. Чипы компании FTDI часто работают именно как устройства USB CDC.

CDM. Эта аббревиатура расшифровывается как Combined Driver Model. Пакет драйверов Windows, в котором сосредоточены и драйверы D2XX, и драйверы VCP.

CDM v2.12.00 WHQL Certified.exe универсальный, единый пакет драйверов VCP и D2XX для всех операционных систем семейства Windows, 32-битных и 64 битных (за исключением Windows RT и Windows CE)

FTD2XX_NET_v1.0.14.zip FTD2XX_NET.dll, так называемая managed wrapper DLL, и XML-файл для Intellisense документации в среде Visual Studio

D2XX Programmer's Guide описание функций библиотеки FTD2XX.DLL

[Введение]

Компания FTDI предоставляет 2 альтернативных программных интерфейса для своих микросхем USB-UART и USB-FIFO. Один интерфейс предоставляет Virtual COM Port (VCP), который система Windows видит как обычный COM-порт. Второй интерфейс, D2XX, предоставляется через проприетарную DLL (FTD2XX.DLL). Интерфейс D2XX дает доступ к специальным функциям, которые не доступны в стандартном API COM-порта операционной системы, таким как установка устройства FTDI в разные режимы или запись данных в память EEPROM устройства.

В случае драйверов FTDI для Windows, оба драйвера D2XX и VCP распространяются в одном инсталляционном пакете (см. ссылки [1]), так называемом Combined Driver Model (CDM) package (на момент написания перевода это был универсальный инсталлятор CDM v2.12.00 WHQL Certified.exe). На рис. 2.1 показана Windows CDM Driver Architecture (архитектура драйвера Windows CDM).

Windows CDM Driver Architecture

Рис. 2.1. Windows CDM Driver Architecture.

Для Linux, Mac OS X (10.4 и более свежих) и Windows CE (4.2 и более свежих) драйверы D2XX и VCP являются взаимоисключающими опциями, т. е. только один тип драйвера может быть установлен в одно и то же время для имеющегося идентификатора устройства USB (device ID). В случае системы Windows, на которой работает драйвер CDM, приложения могут использовать либо D2XX, либо VCP интерфейс без необходимости установки другого драйвера, но все-таки нельзя использовать оба интерфейса одновременно.

Поскольку интерфейс драйвера VCP разработан для эмулирования стандартного COM-порта, то FTDI не предоставляет специальную документацию, где описано, как осуществлять обмен между драйвером VCP и приложением; разработчик может пользоваться большим количеством имеющегося справочного материала и готового кода по теме последовательного обмена данными.

В этом документе специально рассматривается проприетарный интерфейс D2XX для устройств компании FTDI. Описаны функции библиотеки FTD2XX которые разработчик может использовать в своих приложениях.

[3. Классические функции D2XX]

Функции, описанные в этой секции, совместимы со всеми устройствами FTDI.

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие).

Команда подключает пользовательскую комбинацию VID и PID к внутренней таблице устройства. Это позволяет драйверу работать через указанную комбинацию идентификаторов VID и PID.

FT_STATUS FT_SetVIDPID (DWORD dwVID, DWORD dwPID);

Параметры:

dwVID Device Vendor ID, идентификатор производителя (VID)
dwPID Device Product ID, идентификатор продукта (PID)

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

По умолчанию драйвер будет поддерживать ограниченный набор VID и PID, соответствующих устройствам (только VID 0x0403 с PID-ами 0x6001, 0x6010, 0x6006). Чтобы использовать драйвер с другими комбинациями VID и PID, предварительно должна быть использована функция FT_SetVIDPID, и только после этого можно использовать такие функции как FT_ListDevices, FT_Open, FT_OpenEx или FT_CreateDeviceInfoList.

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие).

Команда запрашивает текущую комбинацию VID и PID из внутренней таблицы устройства.

FT_STATUS FT_GetVIDPID (DWORD * pdwVID, DWORD * pdwPID);

Параметры:

pdwVID указатель на DWORD, который содержит внутренний VID устройства
pdwPID указатель на DWORD, который содержит внутренний PID устройства

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Примечание: см. описание функции FT_SetVIDPID.

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Эта функция строит список информации об устройствах, и возвращает количество устройств D2XX, подключенных к системе. В списке содержится информация о не открытых устройствах (которые пока не используются программно) и об открытых устройствах (с которыми программно ведется взаимодействие).

FT_STATUS FT_CreateDeviceInfoList (LPDWORD lpdwNumDevs);

Параметры:

lpdwNumDevs указатель на число типа unsigned long, куда будет сохранено количество подключенных устройств.

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Приложение может использовать эту функцию для получения количества устройств, подключенных к системе. Функция выделяет место для информационного списка устройств, который потом можно опросить с использованием FT_GetDeviceInfoList или FT_GetDeviceInfoDetailFT_GetDeviceInfoDetail.

Если в системе были изменения, связанные с подключениями устройств, то информационный список устройств не изменится, пока функция FT_CreateDeviceInfoList не будет вызвана заново. Пример:

FT_STATUS ftStatus;
DWORD numDevs;
 
// Создание device information list:
ftStatus = FT_CreateDeviceInfoList(&numDevs);
if (ftStatus == FT_OK)
{
   printf("Количество устройств %d\n", numDevs);
}
else
{
   // Ошибка вызова FT_CreateDeviceInfoList
}

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Эта функция возвращает список информации об устройствах, и количество устройств D2XX в этом списке.

FT_STATUS FT_GetDeviceInfoList (FT_DEVICE_LIST_INFO_NODE *pDest,
                                LPDWORD lpdwNumDevs);

Параметры:

*pDest указатель на массив структур FT_DEVICE_LIST_INFO_NODE.
lpdwNumDevs указатель на количество элементов в массиве.

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Эта функция должна быть вызвана только после вызова FT_CreateDeviceInfoList. Если в подключениях устройств со стороны системы были изменения, то они не отразятся в списке device info list, пока функция FT_CreateDeviceInfoList не будет вызвана заново.

Информация Location ID для устройств не будет возвращена для устройств, которые были открыты в момент вызова FT_CreateDeviceInfoList.

Информация не будет доступна для устройств, которые открыты в других процессах. В этом случае параметр Flags в структуре FT_DEVICE_LIST_INFO_NODE покажет, что устройство открыто, но в других полях информация не появится.

Значение флагов представлено 4-байтной картой бит, содержащей различные данные, как это определено в приложении Appendix A – Type Definitions. Бит 0 (самый младший) этого числа показывает, что порт открыт (open, 1) или закрыт (closed, 0). Бит 1 показывает, как устройство прошло энумерацию - как high-speed USB device (1) или full-speed USB device (0). Остальные биты (2 - 31) зарезервированы для будущего использования.

Массив FT_DEVICE_LIST_INFO_NODES содержит все доступные данные по каждому устройству в системе. Структура FT_DEVICE_LIST_INFO_NODES приведена в приложении. Место в памяти для списка должно быть выделено приложением. Для этой цели может быть использовано количество устройств, возвращенное функцией FT_CreateDeviceInfoList.

Когда программирование осуществляется в Visual Basic, LabVIEW или подобных языках, может потребоваться FT_GetDeviceInfoDetail вместо этой функции.

Обратите внимание, что Linux, Mac OS X и Windows CE не поддерживают идентификаторы размещения (location ID). Поэтому для этих систем параметр Location ID в структуре будет пуст.

Пример:

FT_STATUS ftStatus;
FT_DEVICE_LIST_INFO_NODE *devInfo;
DWORD numDevs;
 
// Создание device information list:
ftStatus = FT_CreateDeviceInfoList(&numDevs);
 
if (ftStatus == FT_OK)
{
   printf("Количество устройств %d\n", numDevs);
}
 
if (numDevs > 0)
{
   // Выделение памяти для списка на основе количества устройств numDevs:
   devInfo = (FT_DEVICE_LIST_INFO_NODE*)malloc(sizeof(FT_DEVICE_LIST_INFO_NODE)*numDevs);
   // Получение device information list:
   ftStatus = FT_GetDeviceInfoList(devInfo,&numDevs);
   if (ftStatus == FT_OK)
   {
      for (int i = 0; i < numDevs; i++)
      {
         printf("Dev %d:\n", i);
         printf(" Flags=0x%x\n",      devInfo[i].Flags);
         printf(" Type=0x%x\n",       devInfo[i].Type);
         printf(" ID=0x%x\n",         devInfo[i].ID);
         printf(" LocId=0x%x\n",      devInfo[i].LocId);
         printf(" SerialNumber=%s\n", devInfo[i].SerialNumber);
         printf(" Description=%s\n",  devInfo[i].Description);
         printf(" ftHandle=0x%x\n",   devInfo[i].ftHandle);
      }
   }
}

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Функция берет одну запись из списка информации об устройствах.

FT_STATUS FT_GetDeviceInfoDetail (DWORD dwIndex,
                                  LPDWORD lpdwFlags,
                                  LPDWORD lpdwType,
                                  LPDWORD lpdwID,
                                  LPDWORD lpdwLocId,
                                  PCHAR pcSerialNumber,
                                  PCHAR pcDescription,
                                  FT_HANDLE *ftHandle);

Параметры:

dwIndex индекс записи в списке device info list.
lpdwFlags указатель на unsigned long, куда будет сохранено значение флагов.
lpdwType указатель на unsigned long для сохранения типа устройства.
lpdwID указатель на unsigned long для сохранения device ID.
lpdwLocId указатель на unsigned long для сохранения device location ID.
pcSerialNumber указатель на буфер для сохранения серийного номера устройства как ASCIIZ строки (null-terminated string, строка оканчивающаяся нулем).
pcDescription указатель на буфер для сохранения описания устройства как ASCIIZ строки (null-terminated string, строка оканчивающаяся нулем).
*ftHandle указатель на переменную типа FT_HANDLE, куда будет сохранен хендл.

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Эта функция должна быть вызвана только после вызова FT_CreateDeviceInfoList. Если в подключениях устройств со стороны системы были изменения, то они не отразятся в списке device info list, пока функция FT_CreateDeviceInfoList не будет вызвана заново.

Значение переменной индекса начинается с 0.

Значение флагов представлено 4-байтной картой бит, содержащей различные данные, как это определено в приложении Appendix A – Type Definitions. Бит 0 (самый младший) этого числа показывает, что порт открыт (open, 1) или закрыт (closed, 0). Бит 1 показывает, как устройство прошло энумерацию - как high-speed USB device (1) или full-speed USB device (0). Остальные биты (2 - 31) зарезервированы для будущего использования.

Информация Location ID для устройств не будет возвращена для устройств, которые были открыты в момент вызова FT_CreateDeviceInfoList.

Информация не будет доступна для устройств, которые открыты в других процессах. В этом случае параметр Flags в структуре FT_DEVICE_LIST_INFO_NODE покажет, что устройство открыто, но в других полях информация не появится.

Для возврата всего списка информации об устройства как массива структур FT_DEVICE_LIST_INFO_NODE используйте FT_CreateDeviceInfoList.

Обратите внимание, что Linux, Mac OS X и Windows CE не поддерживают идентификаторы размещения (location ID). Поэтому для этих систем параметр Location ID в структуре будет пуст.

Пример:

FT_STATUS ftStatus;
FT_HANDLE ftHandleTemp;
DWORD numDevs;
DWORD Flags;
DWORD ID;
DWORD Type;
DWORD LocId;
 
char SerialNumber[16];
char Description[64];
 
// Создание device information list:
ftStatus = FT_CreateDeviceInfoList(&numDevs);
if (ftStatus == FT_OK)
{
   printf("Количество устройств %d\n",numDevs);
}
 
if (numDevs > 0)
{
   // Получение информации об устройстве 0:
   ftStatus = FT_GetDeviceInfoDetail(0, &Flags, &Type, &ID, &LocId,
                                     SerialNumber, Description, &ftHandleTemp);
   if (ftStatus == FT_OK)
   {
   printf("Dev 0:\n");
   printf(" Flags=0x%x\n", Flags);
   printf(" Type=0x%x\n", Type);
   printf(" ID=0x%x\n", ID);
   printf(" LocId=0x%x\n", LocId);
   printf(" SerialNumber=%s\n", SerialNumber);
   printf(" Description=%s\n", Description);
   printf(" ftHandle=0x%x\n", ftHandleTemp);
   }
}

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Получает информацию об устройствах, подключенных к системе в настоящий момент. Функция может вернуть такую информацию, как количество подключенных устройств, серийный номер устройства и строки описания устройства, и идентификаторы location ID для подключенных устройств.

FT_STATUS FT_ListDevices (PVOID pvArg1, PVOID pvArg2, DWORD dwFlags);

Параметры:

pvArg1 значение зависит от dwFlags.
pvArg2 значение зависит от dwFlags.
dwFlags определяет формат возвращенной информации.

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Эта функция может использоваться разными способами для получения информации различного типа. Более продвинутый способ, чем эта функция - использовать FT_CreateDeviceInfoList, FT_GetDeviceInfoList и FT_GetDeviceInfoDetail, потому что они возвращают больше информации об устройствах.

В этой упрощенной форме функция может быть использована для получения количества подключенных в настоящее время устройств. Если в dwFlags установлен бит FT_LIST_NUMBER_ONLY, то параметр pvArg1 интерпретируется как указатель на переменную DWORD для сохранения количества подключенных в настоящее время устройств.

Функция может быть использована для возврата информации об устройстве: если в dwFlags установлен флаг FT_OPEN_BY_SERIAL_NUMBER, то будет возвращена строка серийного номера; если в dwFlags установлен бит FT_OPEN_BY_DESCRIPTION, то будет возвращена строка описания продукта; если в dwFlags установлен бит FT_OPEN_BY_LOCATION, то будет возвращен Location ID; если не установлен ни один из этих битов, то по умолчанию будет возвращена строка серийного номера.

Функция может использоваться для возврата строки описания одного устройства. Если в dwFlags установлены биты FT_LIST_BY_INDEX и FT_OPEN_BY_SERIAL_NUMBER или FT_OPEN_BY_DESCRIPTION, то параметр pvArg1 интерпретируется как индекс устройства, и параметр pvArg2 интерпретируется как указатель на буфер, который должен принять соответствующую строку. Используются индексы по базе 0, и для недопустимого индекса будет возвращен код ошибки FT_DEVICE_NOT_FOUND.

Функция может использоваться для возврата строки описания всех подключенных устройств. Если в dwFlags установлены биты FT_LIST_ALL и FT_OPEN_BY_SERIAL_NUMBER или FT_OPEN_BY_DESCRIPTION, то параметр pvArg1 интерпретируется как указатель на массив указателей на буферы, куда должны быть помещены соответствующие строки, и параметр pvArg2 интерпретируется как указатель на DWORD, куда будет сохранено количество подключенных в настоящее время устройств. Имейте в виду для pvArg1, что последняя запись в массиве указателей на буферы должна содержать NULL-указатель, так что в массиве может быть больше записей, чем количество подключенных устройств.

Будет возвращен location ID устройства, если в dwFlags установлены биты FT_LIST_BY_INDEX и FT_OPEN_BY_LOCATION. В этом случае параметр pvArg1 интерпретируется как индекс устройства, и параметр pvArg2 интерпретируется как указатель на переменную типа long, куда должно быть помещено значение location ID. Используются индексы по базе 0, и для недопустимого индекса будет возвращен код ошибки FT_DEVICE_NOT_FOUND. Имейте в виду, что Windows CE и Linux не поддерживают идентификаторы location ID.

Идентификаторы location ID всех подключенных устройств могут быть возвращены, если в dwFlags установлены биты FT_LIST_ALL и FT_OPEN_BY_LOCATION. В этом случае pvArg1 интерпретируется как указатель на массив переменных типа long, куда должны быть сохранены идентификаторы location ID, и параметр pvArg2 интерпретируется как указатель на DWORD, куда будет сохранено количество подключенных в настоящее время устройств.

Пример 1. Получение количества подключенных устройств.

FT_STATUS ftStatus;
DWORD numDevs;
  
ftStatus = FT_ListDevices(&numDevs, NULL, FT_LIST_NUMBER_ONLY);
if (ftStatus == FT_OK)
{
   // FT_ListDevices OK, в переменной numDevs содержится количество устройств.
}
else
{
   // функция FT_ListDevices завершилась с ошибкой
}

Пример 2. Получение серийного номера устройства.

FT_STATUS ftStatus;
DWORD numDevs;
 
DWORD devIndex = 0;  // первое устройство
char Buffer[64];     // место под строку серийного номера ограничено!
 
ftStatus = FT_ListDevices((PVOID)devIndex, Buffer,
                          FT_LIST_BY_INDEX|FT_OPEN_BY_SERIAL_NUMBER);
if (ftStatus == FT_OK)
{
   // FT_ListDevices OK, в Buffer находится серийный номер
}
else
{
   // функция FT_ListDevices завершилась с ошибкой
}

Помните, что индексы базируются на нуле. Если подключено больше одного устройства, то инкремент devIndex приведет к получению серийного номера следующего устройства, и т. д.

Пример 3. Получение описаний всех подключенных устройств.

FT_STATUS ftStatus;
DWORD numDevs;
 
char *BufPtrs[3];    // указатель на массив из 3 указателей
char Buffer1[64];    // буфер для описания первого устройства
char Buffer3[64];    // буфер для описания второго устройства
 
// Инициализация массива указателей:
BufPtrs[0] = Buffer1;
BufPtrs[1] = Buffer2;
BufPtrs[2] = NULL;    // последняя запись в массиве должна быть NULL
 
ftStatus = FT_ListDevices(BufPtrs, &numDevs, FT_LIST_ALL|FT_OPEN_BY_DESCRIPTION);
if (ftStatus == FT_OK)
{
   // FT_ListDevices OK, описание устройств находятся в буферах Buffer1 и Buffer2,
   // и numDevs содержит количество подключенных устройств
}
else
{
   // функция FT_ListDevices завершилась с ошибкой
}

Этот пример подразумевает, что к системе подключено 2 устройства. Если на самом деле устройств больше, то размер массива указателей должен быть увеличен, и должно быть создано большее количество буферов для строк.

Пример 4. Получение размещений (location) всех подключенных устройств.

FT_STATUS ftStatus;
DWORD numDevs;
 
long locIdBuf[16];
 
ftStatus = FT_ListDevices(locIdBuf, &numDevs, FT_LIST_ALL|FT_OPEN_BY_LOCATION);
if (ftStatus == FT_OK)
{
   // FT_ListDevices OK, идентификаторы location ID находятся в locIdBuf,
   // и в numDevs содержится количество подключенных устройств.
}
else
{
   // функция FT_ListDevices завершилась с ошибкой
}

Этот пример подразумевает, что к системе подключено не более 16 устройств. Если на самом деле устройств больше, то размер массива должен быть увеличен.

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Открывает устройство, и возвращает хендл, который будет использован для последующего доступа к устройству.

FT_STATUS FT_Open (int iDevice, FT_HANDLE *ftHandle);

Параметры:

iDevice индекс по базе 0 для открываемого устройства.
ftHandle указатель на переменную типа FT_HANDLE, куда будет сохранен хендл. Этот хендл должен использоваться для доступа к устройству.

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Хотя эта функция может быть использована для открытия нескольких устройств путем установки iDevice в 0, 1, 2 и т. д., у неё нет возможности открыть специфическое устройство. Чтобы открыть именованные устройства, используйте функцию FT_OpenEx.

Пример:

FT_HANDLE ftHandle;
FT_STATUS ftStatus;
 
ftStatus = FT_Open(0, &ftHandle);
if (ftStatus == FT_OK)
{
   // FT_Open OK, используйте ftHandle для работы с устройством
}
else
{
   // FT_Open завершилась по ошибке
}

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Открывает указанное устройство и возвращает хендл к нему, который будет использоваться для последующего доступа к устройству. Устройство может быть указано по серийному номеру, по описанию или по размещению (location).

Эта функция может также использоваться для того, чтобы открыть несколько устройств одновременно. Несколько устройств может быть указано по серийному номеру, описанию устройства или location ID (информация размещения, полученная от физического места подключения устройства на шине USB). Идентификаторы Location ID для специфических портов USB может быть получена утилитой USBView и дана в шестнадцатеричном формате. Идентификаторы Location ID для устройств, подключенных к системе, могут быть получены вызовом FT_GetDeviceInfoList или FT_ListDevices с соответствующими флагами.

FT_STATUS FT_OpenEx (PVOID pvArg1, DWORD dwFlags, FT_HANDLE *ftHandle);

Параметры:

pvArg1 указатель на аргумент, тип которого зависит от значения dwFlags. Обычно он интерпретируется как указатель на ASCIIZ-строку.
dwFlags FT_OPEN_BY_SERIAL_NUMBER, FT_OPEN_BY_DESCRIPTION или FT_OPEN_BY_LOCATION.
ftHandle указатель на переменную типа FT_HANDLE, куда будет сохранен хендл. Этот хендл должен использоваться для доступа к устройству.

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Параметр в pvArg1 зависит от dwFlags: если dwFlags FT_OPEN_BY_SERIAL_NUMBER, то pvArg1 интерпретируется как указатель на null-terminated строку, представляющую серийный номер устройства; если dwFlags FT_OPEN_BY_DESCRIPTION, то pvArg1 интерпретируется как указатель на null-terminated строку, представляющую описание устройства; если dwFlags FT_OPEN_BY_LOCATION, то pvArg1 интерпретируется как значение long, которое содержит location ID устройства. Имейте в виду, что Windows CE и Linux не поддерживают идентификаторы location ID.

Пример 1. Открыть устройство с серийным номером "FT000001".

FT_STATUS ftStatus;
FT_HANDLE ftHandle1;
 
ftStatus = FT_OpenEx("FT000001", FT_OPEN_BY_SERIAL_NUMBER, &ftHandle1);
if (ftStatus == FT_OK)
{
   // устройство "FT000001" успешно открыто
}
else
{
   // открыть устройство не получилось
}

Пример 2. Открыть устройство с описанием "USB Serial Converter".

FT_STATUS ftStatus;
FT_HANDLE ftHandle1;
 
ftStatus = FT_OpenEx("USB Serial Converter", FT_OPEN_BY_DESCRIPTION, &ftHandle1);
if (ftStatus == FT_OK)
{
   // устройство успешно открыто
}
else
{
   // открыть устройство не получилось
}

Пример 3. Открыть 2 устройства с серийными номерами "FT000001" и "FT999999".

FT_STATUS ftStatus;
FT_STATUS ftStatus2;
FT_HANDLE ftHandle1;
FT_HANDLE ftHandle2;
 
ftStatus = FT_OpenEx("FT000001", FT_OPEN_BY_SERIAL_NUMBER, &ftHandle1);
ftStatus2 = FT_OpenEx("FT999999", FT_OPEN_BY_SERIAL_NUMBER, &ftHandle2);
if (ftStatus == FT_OK && ftStatus2 == FT_OK)
{
   // оба устройства были успешно открыты
}
else
{
   // не получилось открыть одно или оба устройства
}

Пример 4. Открыть 2 устройства с описаниями "USB Serial Converter" и "USB Pump Controller".

FT_STATUS ftStatus;
FT_STATUS ftStatus2;
FT_HANDLE ftHandle1;
FT_HANDLE ftHandle2;
 
ftStatus = FT_OpenEx("USB Serial Converter", FT_OPEN_BY_DESCRIPTION, &ftHandle1);
ftStatus2 = FT_OpenEx("USB Pump Controller", FT_OPEN_BY_DESCRIPTION, &ftHandle2);
 
if (ftStatus == FT_OK && ftStatus2 == FT_OK)
{
   // оба устройства были успешно открыты
}
else
{
   // не получилось открыть одно или оба устройства
}

Пример 5. Открыть устройство с location 23.

FT_STATUS ftStatus;
FT_HANDLE ftHandle1;
long dwLoc;
dwLoc = 0x23;
 
ftStatus = FT_OpenEx(dwLoc, FT_OPEN_BY_LOCATION, &ftHandle1);
if (ftStatus == FT_OK)
{
   // устройство с location 23 успешно открыто
}
else
{
   // открыть устройство не получилось
}

Пример 6. Открыть 2 устройства с location 23 и 31.

FT_STATUS ftStatus;
FT_STATUS ftStatus2;
FT_HANDLE ftHandle1;
FT_HANDLE ftHandle2;
long dwLoc;
 
dwLoc = 0x23;
ftStatus = FT_OpenEx(dwLoc, FT_OPEN_BY_LOCATION, &ftHandle1);
dwLoc = 0x31;
ftStatus2 = FT_OpenEx(dwLoc, FT_OPEN_BY_LOCATION, &ftHandle2);
if (ftStatus == FT_OK && ftStatus2 == FT_OK)
{
   // оба устройства были успешно открыты
}
else
{
   // не получилось открыть одно или оба устройства
}

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Закрывает открытое устройство по указанному хендлу.

FT_STATUS FT_Close (FT_HANDLE ftHandle);

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Пример:

FT_HANDLE ftHandle;
FT_STATUS ftStatus;
 
ftStatus = FT_Open(0, &ftHandle);
if (ftStatus == FT_OK)
{
   // FT_Open OK, используйте ftHandle для доступа к устройству
   ...
   // когда закончите, то вызовите FT_Close:
   FT_Close(ftHandle);
}
else
{
   // ошибка FT_Open
}

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Читает данные из устройства.

FT_STATUS FT_Read (FT_HANDLE ftHandle,
                   LPVOID lpBuffer,
                   DWORD dwBytesToRead,
                   LPDWORD lpdwBytesReturned);

Параметры:

ftHandle хендл устройства.
lpBuffer указатель на буфер, который примет данные от устройства.
dwBytesToRead количество байт, которые нужно прочитать из устройства.
lpdwBytesReturned указатель на переменную типа DWORD, которая примет количество байт, прочитанных из устройства.

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код FT_IO_ERROR.

FT_Read всегда вернет в lpdwBytesReturned количество прочитанных байт.

Эта функция не завершит управление, пока не будет прочитано в буфер количество dwBytesToRead байт. Количество байт в очереди приема может быть получено вызовом FT_GetStatus или FT_GetQueueStatus, и передано функции FT_Read как параметр dwBytesToRead, чтобы функция прочитала данные и сделала возврат немедленно.

Когда предыдущим вызовом FT_SetTimeouts был указан таймаут, FT_Read возвратит управление, когда истечет таймаут, или когда будет прочитано dwBytesToRead байт - в любом из этих двух случаев, который произойдет быстрее. Если произошел таймаут, то FT_Read прочитает доступные данные в буфер и вернет FT_OK.

Приложение должно использовать значение возврата функции и значение lpdwBytesReturned, когда обрабатывается буфер. Если возвращенное значение FT_OK, и lpdwBytesReturned равна dwBytesToRead, то FT_Read была нормально завершена до истечения таймаута. Если возвращаемое значение FT_OK, и lpdwBytesReturned меньше dwBytesToRead, то был таймаут, и чтение было выполнено только частично. Имейте в виду, что если произошел таймаут, и не были прочитаны данные, то возвращенное значение все равно будет FT_OK.

Возвращаемое значение FT_IO_ERROR говорит об ошибке в параметрах функции, или о фатальной ошибке наподобие отключения устройства от USB.

Пример 1. Как прочитать все доступные в настоящий момент данные.

FT_HANDLE ftHandle;
FT_STATUS ftStatus;
DWORD EventDWord;
DWORD TxBytes;
DWORD RxBytes;
DWORD BytesReceived;
char RxBuffer[256];
 
ftStatus = FT_Open(0, &ftHandle);
if(ftStatus != FT_OK)
{
   // ошибка FT_Open
   return;
}
FT_GetStatus(ftHandle, &RxBytes, &TxBytes, &EventDWord);
if (RxBytes > 0)
{
   ftStatus = FT_Read(ftHandle, RxBuffer, RxBytes, &BytesReceived);
   if (ftStatus == FT_OK)
   {
      // FT_Read OK
   }
   else
   {
      // ошибка FT_Read
   }
}
FT_Close(ftHandle);

Пример 2. Как читать данные с таймаутом 5 секунд.

FT_HANDLE ftHandle;
FT_STATUS ftStatus;
DWORD RxBytes = 10;
DWORD BytesReceived;
char RxBuffer[256];
 
ftStatus = FT_Open(0, &ftHandle);
if(ftStatus != FT_OK)
{
   // ошибка FT_Open
   return;
}
FT_SetTimeouts(ftHandle, 5000, 0);
ftStatus = FT_Read(ftHandle, RxBuffer, RxBytes, &BytesReceived);
if (ftStatus == FT_OK)
{
   if (BytesReceived == RxBytes)
   {
      // FT_Read OK
   }
   else
   {
      // таймаут FT_Read
   }
}
else
{
   // ошибка FT_Read
}
FT_Close(ftHandle);

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Записывает данные в устройство.

FT_STATUS FT_Write (FT_HANDLE ftHandle,
                    LPVOID lpBuffer,
                    DWORD dwBytesToWrite,
                    LPDWORD lpdwBytesWritten);

Параметры:

ftHandle хендл устройства.
lpBuffer указатель на буфер, который содержит данные для записи в устройство.
dwBytesToRead количество байт, которые нужно записать в устройство.
lpdwBytesReturned указатель на переменную типа DWORD, которая примет количество байт, записанных в устройство.

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Пример:

FT_HANDLE ftHandle;
FT_STATUS ftStatus;
DWORD BytesWritten;
char TxBuffer[256]; // содержит данные для записи в устройство
 
ftStatus = FT_Open(0, &ftHandle);
if(ftStatus != FT_OK)
{
   // ошибка FT_Open
   return;
}
ftStatus = FT_Write(ftHandle, TxBuffer, sizeof(TxBuffer), &BytesWritten);
if (ftStatus == FT_OK)
{
   // FT_Write OK
}
else
{
   // ошибка FT_Write
}
FT_Close(ftHandle);

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Устанавливает скорость обмена (baud rate) для устройства.

FT_STATUS FT_SetBaudRate (FT_HANDLE ftHandle, DWORD dwBaudRate);

Параметры:

ftHandle хендл устройства.
dwBaudRate скорость обмена, бод.

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Пример:

FT_HANDLE ftHandle;
FT_STATUS ftStatus;
 
ftStatus = FT_Open(0, &ftHandle);
if(ftStatus != FT_OK)
{
   // ошибка FT_Open
   return;
}
ftStatus = FT_SetBaudRate(ftHandle, 115200); // установка скорости 115200 бод
if (ftStatus == FT_OK)
{
   // FT_SetBaudRate OK
}
else
{
   // ошибка FT_SetBaudRate
}
FT_Close(ftHandle);

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Функция влияет на скорость (baud rate) устройства, и может использоваться для установки нестандартных скоростей обмена.

FT_STATUS FT_SetDivisor (FT_HANDLE ftHandle, USHORT usDivisor);

Параметры:

ftHandle хендл устройства.
usDivisor делитель.

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Эта функция больше не нужна, потому что FT_SetBaudRate сама автоматически вычислит требуемый делитель для запрошенного параметра скорости. В апноуте "Setting baud rates for the FT8U232AM" (доступен в разделе Application сайта компании FTDI) описано, как вычислять делитель для нестандартных скоростей обмена.

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Эта функция устанавливает характеристики формата передачи данных устройства.

FT_STATUS FT_SetDataCharacteristics (FT_HANDLE ftHandle,
                                     UCHAR uWordLength,
                                     UCHAR uStopBits,
                                     UCHAR uParity);

Параметры:

ftHandle хендл устройства.
uWordLength количество бит на слово (фрейм) - тут должно быть значение FT_BITS_8 или FT_BITS_7.
uStopBits количество стоп-бит - должно быть FT_STOP_BITS_1 или FT_STOP_BITS_2.
uParity четность - должно быть FT_PARITY_NONE, FT_PARITY_ODD, FT_PARITY_EVEN, FT_PARITY_MARK или FT_PARITY SPACE.

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Пример:

FT_HANDLE ftHandle;
FT_STATUS ftStatus;
 
ftStatus = FT_Open(0, &ftHandle);
if(ftStatus != FT_OK)
{
   // ошибка FT_Open
   return;
}
// Устанавливает 8 бит данных, 1 стоп-бит, без четности:
ftStatus = FT_SetDataCharacteristics(ftHandle, FT_BITS_8, FT_STOP_BITS_1, FT_PARITY_NONE);
if (ftStatus == FT_OK)
{
   // FT_SetDataCharacteristics OK
}
else
{
   // ошибка FT_SetDataCharacteristics
}
FT_Close(ftHandle);

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Устанавливает таймауты чтения и записи устройства.

FT_STATUS FT_SetTimeouts (FT_HANDLE ftHandle,
                          DWORD dwReadTimeout,
                          DWORD dwWriteTimeout);

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Параметры:

ftHandle хендл устройства.
dwReadTimeout таймаут чтения в миллисекундах.
dwWriteTimeout таймаут записи в миллисекундах.

Пример:

FT_HANDLE ftHandle;
FT_STATUS ftStatus;
 
ftStatus = FT_Open(0, &ftHandle);
if(ftStatus != FT_OK)
{
   // ошибка FT_Open
   return;
}
// Установка таймаута чтения 5 секунд, записи 1 секунда
ftStatus = FT_SetTimeouts(ftHandle, 5000, 1000);
if (ftStatus == FT_OK)
{
   // FT_SetTimeouts OK
}
else
{
   // ошибка FT_SetTimeouts
}
FT_Close(ftHandle);

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Эта функция устанавливает управление потоком обмена данных (flow control) устройства.

FT_STATUS FT_SetFlowControl (FT_HANDLE ftHandle,
                             USHORT usFlowControl,
                             UCHAR uXon,
                             UCHAR uXoff);

Параметры:

ftHandle хендл устройства.
usFlowControl должен быть одним из значений FT_FLOW_NONE, FT_FLOW_RTS_CTS, FT_FLOW_DTR_DSR или FT_FLOW_XON_XOFF.
uXon символ, используемый как сигнал Xon. Используется только для варианта FT_FLOW_XON_XOFF.
uXoff символ, используемый как сигнал Xoff. Используется только для варианта FT_FLOW_XON_XOFF.

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Пример:

FT_HANDLE ftHandle;
FT_STATUS ftStatus;
 
ftStatus = FT_Open(0, &ftHandle);
if(ftStatus != FT_OK)
{
   // ошибка FT_Open
   return;
}// Устанавливает тип управления потоком RTS/CTS:
ftStatus = FT_SetFlowControl(ftHandle, FT_FLOW_RTS_CTS, 0x11, 0x13);
if (ftStatus == FT_OK)
{
   // FT_SetFlowControl OK
}
else
{
   // ошибка FT_SetFlowControl
}
FT_Close(ftHandle);

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Устанавливает сигнал управления Data Terminal Ready (DTR).

FT_STATUS FT_SetDtr (FT_HANDLE ftHandle);

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Пример:

FT_HANDLE ftHandle;
FT_STATUS ftStatus;
 
ftStatus = FT_Open(0, &ftHandle);
if(ftStatus != FT_OK)
{
   // ошибка FT_Open
   return;
}
ftStatus = FT_SetDtr(ftHandle);
if (ftStatus == FT_OK)
{
   // FT_SetDtr OK
}
else
{
   // ошибка FT_SetDtr
}
FT_Close(ftHandle);

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Сбрасывает сигнал управления Data Terminal Ready (DTR).

FT_STATUS FT_ClrDtr (FT_HANDLE ftHandle);

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Пример:

FT_HANDLE ftHandle;
FT_STATUS ftStatus;
 
ftStatus = FT_Open(0, &ftHandle);
if(ftStatus != FT_OK)
{
   // ошибка FT_Open
   return;
}
ftStatus = FT_ClrDtr(ftHandle);
if (ftStatus == FT_OK)
{
   // FT_ClrDtr OK
}
else
{
   // ошибка FT_ClrDtr
}
FT_Close(ftHandle);

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Устанавливает сигнал управления Request To Send (RTS).

FT_STATUS FT_SetRts (FT_HANDLE ftHandle);

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Пример:

FT_HANDLE ftHandle;
FT_STATUS ftStatus;
 
ftStatus = FT_Open(0, &ftHandle);
if(ftStatus != FT_OK)
{
   // ошибка FT_Open
   return;
}
ftStatus = FT_SetRts(ftHandle);
if (ftStatus == FT_OK)
{
   // FT_SetRts OK
}
else
{
   // ошибка FT_SetRts
}
FT_Close(ftHandle);

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Сбрасывает сигнал управления Request To Send (RTS).

FT_STATUS FT_ClrRts (FT_HANDLE ftHandle);

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Пример:

FT_HANDLE ftHandle;
FT_STATUS ftStatus;
 
ftStatus = FT_Open(0, &ftHandle);
if(ftStatus != FT_OK)
{
   // ошибка FT_Open
   return;
}
ftStatus = FT_ClrRts(ftHandle);
if (ftStatus == FT_OK)
{
   // FT_ClrRts OK
}
else
{
   // ошибка FT_ClrRts
}
FT_Close(ftHandle);

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Получает состояние модема и состояние линии из устройства.

FT_STATUS FT_GetModemStatus (FT_HANDLE ftHandle, LPDWORD lpdwModemStatus);

Параметры:

ftHandle хендл устройства.
lpdwModemStatus указатель на переменную типа DWORD, в которую будут записаны состояние модема и линии устройства.

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Младший байт lpdwModemStatus содержит состояние модема. На Windows и Windows CE, состояние линии содержится в следующем за самым младшим по старшинству байте lpdwModemStatus.

Состояние модема описывается набором флагов, определяемых по маскам: Clear To Send (CTS) = 0x10, Data Set Ready (DSR) = 0x20, Ring Indicator (RI) = 0x40, Data Carrier Detect (DCD) = 0x80.

Состояние линии описывается набором флагов, определяемых по маскам: Overrun Error (OE) = 0x02, Parity Error (PE) = 0x04, Framing Error (FE) = 0x08, Break Interrupt (BI) = 0x10.

Пример:

FT_HANDLE ftHandle;
FT_STATUS ftStatus;
DWORD dwModemStatus = 0;
DWORD dwLineStatus = 0;
 
ftStatus = FT_Open(0, &ftHandle);
if(ftStatus != FT_OK)
{
   // ошибка FT_Open
   return;
}
ftStatus = FT_GetModemStatus(ftHandle, &dwModemStatus);
if (ftStatus == FT_OK)
{
   // FT_GetModemStatus OK
   // Состояние линии находится во втором байте dwModemStatus:
   dwLineStatus = ((dwModemStatus >> 8) & 0x000000FF);
   // Теперь маской выделим байт состояния модема:
   dwModemStatus = (dwModemStatus & 0x000000FF);
}
else
{
   // ошибка FT_GetModemStatus
}
FT_Close(ftHandle);

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Получает количество байт, находящихся в очереди приема.

FT_STATUS FT_GetQueueStatus (FT_HANDLE ftHandle, LPDWORD lpdwAmountInRxQueue);

Параметры:

ftHandle хендл устройства.
lpdwAmountInRxQueue указатель на переменную типа DWORD, в которую будет записано количество байт в очереди приема.

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Пример:

FT_HANDLE ftHandle;
FT_STATUS ftStatus;
DWORD RxBytes;
DWORD BytesReceived;
char RxBuffer[256];
 
ftStatus = FT_Open(0, &ftHandle);
if(ftStatus != FT_OK)
{
   // ошибка FT_Open
   return;
}
FT_GetQueueStatus(ftHandle,&RxBytes);
if (RxBytes > 0)
{
   ftStatus = FT_Read(ftHandle, RxBuffer, RxBytes, &BytesReceived);
   if (ftStatus == FT_OK)
   {
      // FT_Read OK
   }
   else
   {
      // ошибка FT_Read
   }
}
FT_Close(ftHandle);

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Получает информацию об открытом устройстве.

FT_STATUS FT_GetDeviceInfo (FT_HANDLE ftHandle,
                            FT_DEVICE *pftType,
                            LPDWORD lpdwID,
                            PCHAR pcSerialNumber,
                            PCHAR pcDescription,
                            PVOID pvDummy);

Параметры:

ftHandle хендл устройства.
pftType указатель на unsigned long для сохранения типа устройства.
lpdwID указатель на unsigned long для сохранения device ID.
pcSerialNumber указатель на буфер, куда будет записан серийный номер устройства как null-terminated string.
pcDescription указатель на буфер, куда будет записано описание устройства как null-terminated string.
pvDummy зарезервировано для будущего использования - сюда нужно записать NULL.

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Эта функция используется для возврата типа устройства, идентификатора устройства (device ID), описателя устройства и серийного номера. Идентификатор device ID закодирован в DWORD - старшая половина двойного слова (старшее слово, 2 байта) содержит vendor ID (идентификатор производителя, VID), младшая половина двойного слова (младшее слово, 2 байта) содержит product ID (идентификатор продукта, PID). Таким образом, возвращенный ID 0x04036001 соответствует device ID VID_0403&PID_6001.

Пример:

FT_HANDLE ftHandle;
FT_DEVICE ftDevice;
FT_STATUS ftStatus;
DWORD deviceID;
char SerialNumber[16];
char Description[64];
 
ftStatus = FT_Open(0, &ftHandle);
if(ftStatus != FT_OK)
{
   // FT_Open failed
   return;
}
ftStatus = FT_GetDeviceInfo( ftHandle,
                             &ftDevice,
                             &deviceID,
                             SerialNumber,
                             Description,
                             NULL );
if (ftStatus == FT_OK)
{
   if (ftDevice == FT_DEVICE_232H)
      ; // это FT232H
   else if (ftDevice == FT_DEVICE_4232H)
      ; // это FT4232H
   else if (ftDevice == FT_DEVICE_2232H)
      ; // это FT2232H
   else if (ftDevice == FT_DEVICE_232R)
      ; // это FT232R
   else if (ftDevice == FT_DEVICE_2232C)
      ; // это FT2232C/L/D
   else if (ftDevice == FT_DEVICE_BM)
      ; // это FTU232BM
   else if (ftDevice == FT_DEVICE_AM)
      ; // это FT8U232AM
   else
      ; // неизвестное устройство (это не должно было случиться!)
   // deviceID содержит закодированный encoded device ID
   // SerialNumber, Description содержат 0-terminated строки
}
else
{
   // ошибка FT_GetDeviceType!
}
FT_Close(ftHandle);

Поддерживаемые ОС: Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Возвращает номер версии драйвера D2XX.

FT_STATUS FT_GetDriverVersion (FT_HANDLE ftHandle, LPDWORD lpdwDriverVersion);

Параметры:

ftHandle хендл устройства.
lpdwDriverVersion указатель на номер версии драйвера.

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Номер версии (unsigned long, 4 байта) содержит в себе части major, minor и build. Байт 0 (самый младший) содержит версию сборки (build version), байт 1 содержит minor version, и байт 2 содержит major version. Байт 3 в настоящий момент установлен в 0.

Например, версия драйвера "2.04.06" представлена как 0x00020406. Имейте в виду, что устройство должно быть открыто перед вызовом этой функции.

Пример:

FT_HANDLE ftHandle;
FT_STATUS ftStatus;
DWORD dwDriverVer;
 
ftStatus = FT_Open(0,&ftHandle);
if (ftStatus == FT_OK)
{
   // Получение версии драйвера устройства:
   ftStatus = FT_GetDriverVersion(ftHandle, &dwDriverVer);
   if (ftStatus == FT_OK)
      printf("Версия драйвера = 0x%x\n", dwDriverVer);
   else
      printf("ошибка чтения версии драйвера\n");
   FT_Close(ftHandle);
}

Поддерживаемые ОС: Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Возвращает номер версии DLL.

FT_STATUS FT_GetLibraryVersion (LPDWORD lpdwDLLVersion);

Параметр:

lpdwDLLVersion указатель на номер версии DLL.

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Номер версии (unsigned long, 4 байта) содержит в себе части major, minor и build. Байт 0 (самый младший) содержит версию сборки (build version), байт 1 содержит minor version, и байт 2 содержит major version. Байт 3 в настоящий момент установлен в 0.

Например, версия D2XX DLL "3.01.15" представлена как 0x00030115. Обратите внимание, что в параметрах функции нет хендла, так что не обязательно открывать устройство перед вызовом этой функции.

Пример:

FT_STATUS ftStatus;
DWORD dwLibraryVer;
 
// Получение версии DLL:
ftStatus = FT_GetLibraryVersion(&dwLibraryVer);
if (ftStatus == FT_OK)
   printf("Версия библиотеки = 0x%x\n",dwLibraryVer);
else
   printf("ошибка чтения версии библиотеки\n");

Поддерживаемые ОС: Windows (2000 и более свежие).

Возвращает номер виртуального COM-порта, который привязан к устройству.

FT_STATUS FT_GetComPortNumber (FT_HANDLE ftHandle, LPLONG lplComPortNumber);

Параметры:

ftHandle хендл устройства.
lplComPortNumber указатель на переменную типа LONG, в которую будет записан номер COM-порта, связанного с устройством.

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Функция доступна только тогда, когда используется драйвер Windows CDM, так что одновременно могут быть установлены драйверы D2XX и VCP.

Если к устройству не привязан COM-порт, то lplComPortNumber получит значение -1.

Пример:

FT_HANDLE ftHandle; // допустимый хендл, который был получен вызовом FT_OpenEx
FT_STATUS ftStatus;
LONG lComPortNumber;
 
ftStatus = FT_GetComPortNumber(ftHandle, &lComPortNumber);
if (status == FT_OK)
{
   if (lComPortNumber == -1)
   {
      // Устройству не назначен COM-порт
   }
   else
   {
      // Назначенный COM-порт содержится в lComPortNumber
   }
}
else
{
   // ошибка FT_GetComPortNumber!
}
FT_Close(ftHandle);

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Получает состояние устройства, включая количество символов в очереди приема, количество символов в очереди передачи, и текущее состояние событий (event status).

FT_STATUS FT_GetStatus (FT_HANDLE ftHandle,
                        LPDWORD lpdwAmountInRxQueue,
                        LPDWORD lpdwAmountInTxQueue,
                        LPDWORD lpdwEventStatus);

Параметры:

ftHandle хендл устройства.
lpdwAmountInRxQueue указатель на переменную типа DWORD, которая примет количество символов в очереди приема.
lpdwAmountInTxQueue указатель на переменную типа DWORD, которая примет количество символов в очереди передачи.
lpdwEventStatus указатель на переменную типа DWORD, которая примет текущее состояние событий (event status).

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Пример, как использовать эту функцию, см. в описании функции FT_SetEventNotification.

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Устанавливает условия оповещения по событиям (event notification).

FT_STATUS FT_SetEventNotification (FT_HANDLE ftHandle,
                                   DWORD dwEventMask,
                                   PVOID pvArg);

Параметры:

ftHandle хендл устройства.
dwEventMask условия, которые приведут к установке события.
pvArg интерпретируется как обработчик события.

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Приложение может использовать эту функцию для настройки условий, которые позволяют заблокировать поток, пока не наступит одно из условий. Обычно приложение создает событие, вызывает эту функцию, в результате чего поток блокируется. Когда условие срабатывает, устанавливается событие, и поток приложения разблокируется.

dwEventMask является набором битов, заданных маской, которые описывают события, интересующие приложение. pvArg интерпретируется как обработчик события, который создается приложением. Если срабатывает одно из заданных условий, то устанавливается событие.

Если в dwEventMask установлен бит FT_EVENT_RXCHAR, то событие будет установлено, когда устройство примет символ.

Если в dwEventMask установлен бит FT_EVENT_MODEM_STATUS, то событие будет установлено, когда устройство обнаружит изменение сигналов модема.

Если в dwEventMask установлен бит FT_EVENT_LINE_STATUS, то событие будет установлено, когда устройство обнаружит изменение сигналов состояния линии.

Пример 1. Этот пример допустим для Windows и Windows CE, и он покажет, как ждать события приема символа или изменения состояния модема.

// Сначала нужно создать событие и вызвать FT_SetEventNotification.
FT_HANDLE ftHandle; // хендл для открытого устройства
FT_STATUS ftStatus;
HANDLE hEvent;
DWORD EventMask;
 
hEvent = CreateEvent( NULL,
                      false, // auto-reset event
                      false, // non-signalled state
                      "" );
EventMask = FT_EVENT_RXCHAR | FT_EVENT_MODEM_STATUS;
ftStatus = FT_SetEventNotification(ftHandle,EventMask,hEvent);
 
...
 
// Где-то позже поток приложения блокируется на ожидании события. Затем,
// когда событие произойдет, будет осуществлена проверка, какое произошло
// событие, и будет сделана подходящая обработка события.
WaitForSingleObject(hEvent, INFINITE);
 
//В этом месте поток приложение разблокировался событием.
DWORD EventDWord;
DWORD RxBytes;
DWORD TxBytes;
 
FT_GetStatus(ftHandle, &RxBytes, &TxBytes, &EventDWord);
if (EventDWord & FT_EVENT_MODEM_STATUS)
{
   // Детектировано событие изменения состояния модема,
   // получение текущего состояия модема:
   FT_GetModemStatus(ftHandle, &Status);
   if (Status & 0x00000010)
   {
      // CTS == 1
   }
   else
   {
      // CTS == 0
   }
   if (Status & 0x00000020)
   {
      // DSR == 1
   }
   else
   {
      // DSR == 0
   }
}
if (RxBytes > 0)
{
   // Обнаружено наличие данных в очереди приема, можно вызвать
   // FT_Read(), чтобы получить данные, принятые устройством.
}

Пример 2. Этот пример допустим для Linux, и он показывает как ждать приема символа и изменения состояния модема.

// Сначала нужно создать событие и вызвать FT_SetEventNotification.
FT_HANDLE ftHandle;
FT_STATUS ftStatus;
EVENT_HANDLE eh;
DWORD EventMask;
 
ftStatus = FT_Open(0, &ftHandle);
if(ftStatus != FT_OK)
{
   // FT_Open failed
   return;
}
pthread_mutex_init(&eh.eMutex, NULL);
pthread_cond_init(&eh.eCondVar, NULL);
EventMask = FT_EVENT_RXCHAR | FT_EVENT_MODEM_STATUS;
ftStatus = FT_SetEventNotification(ftHandle, EventMask, (PVOID)&eh);
 
...
 
// Где-то позже поток приложения будет заблокирован на ожидании события,
// затем когда событие произойдет, будет проверено, какое событие произошло,
// и событие будет обработано подходящим образом.
pthread_mutex_lock(&eh.eMutex);
pthread_cond_wait(&eh.eCondVar, &eh.eMutex);
pthread_mutex_unlock(&eh.eMutex);
 
// В этом месте поток приложения возобновил работу, потому что произошло событие.
DWORD EventDWord;
DWORD RxBytes;
DWORD TxBytes;
DWORD Status;
 
FT_GetStatus(ftHandle, &RxBytes, &TxBytes, &EventDWord);
if (EventDWord & FT_EVENT_MODEM_STATUS)
{
   // Детектировано событие изменения состояния модема,
   // получение текущего состояия модема:
   FT_GetModemStatus(ftHandle, &Status);
   if (Status & 0x00000010)
   {
      // CTS == 1
   }
   else
   {
      // CTS == 0
   }
   if (Status & 0x00000020)
   {
      // DSR == 1
   }
   else
   {
      // DSR == 0
   }
}
if (RxBytes > 0)
{
   // Обнаружено наличие данных в очереди приема, можно вызвать
   // FT_Read(), чтобы получить данные, принятые устройством.
}

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Функция устанавливает спецсимволы для устройства.

FT_STATUS FT_SetChars (FT_HANDLE ftHandle,
                       UCHAR uEventCh,
                       UCHAR uEventChEn,
                       UCHAR uErrorCh,
                       UCHAR uErrorChEn);

Параметры:

ftHandle хендл устройства.
uEventCh символ события (event character).
uEventChEn 0 если event character запрещен, иначе не ноль.
uErrorCh символ ошибки (error character).
uErrorChEn 0 если error character запрещен, иначе не ноль.

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Эта функция позволяет вставлять указанные символы в поток данных, чтобы сообщать о событиях или ошибках.

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Устанавливает для устройства условие обрыва потока (BREAK condition).

FT_STATUS FT_SetBreakOn (FT_HANDLE ftHandle);

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Пример:

FT_HANDLE ftHandle; // рабочий хендл, полученный вызовом FT_OpenEx
FT_STATUS ftStatus;
 
ftStatus = FT_SetBreakOn(ftHandle);
if (ftStatus == FT_OK)
{
   // FT_SetBreakOn OK
}
else
{
   // ошибка FT_SetBreakOn
}
FT_Close(ftHandle);

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Сбрасывает BREAK condition для устройства.

FT_STATUS FT_SetBreakOff (FT_HANDLE ftHandle);

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Пример:

FT_HANDLE ftHandle;  // рабочий хендл, полученный вызовом FT_OpenEx
FT_STATUS ftStatus;
 
ftStatus = FT_SetBreakOff(ftHandle);
if (ftStatus == FT_OK)
{
   // FT_SetBreakOff OK
}
else
{
   // ошибка FT_SetBreakOff
}
FT_Close(ftHandle);

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Функция вычищает буферы приема и передачи устройства.

FT_STATUS FT_Purge (FT_HANDLE ftHandle, DWORD dwMask);

Параметры:

ftHandle хендл устройства.
uEventCh комбинация масок флагов FT_PURGE_RX и FT_PURGE_TX.

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Пример:

FT_HANDLE ftHandle; // рабочий хендл, полученный вызовом FT_OpenEx
FT_STATUS ftStatus;// Сброс содержимого буферов Rx и Tx
 
ftStatus = FT_Purge(ftHandle, FT_PURGE_RX | FT_PURGE_TX);
if (ftStatus == FT_OK)
{
   // FT_Purge OK
}
else
{
   // ошибка FT_Purge
}
FT_Close(ftHandle);

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Функция отправляет устройству команду сброса.

FT_STATUS FT_ResetDevice (FT_HANDLE ftHandle);

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Пример:

FT_HANDLE ftHandle; // рабочий хендл, полученный вызовом FT_OpenEx
FT_STATUS ftStatus;
 
ftStatus = FT_ResetDevice(ftHandle);
if (ftStatus == FT_OK)
{
   // FT_ResetDevice OK
}
else
{
   // ошибка FT_ResetDevice
}
FT_Close(ftHandle);

Поддерживаемые ОС: Windows (2000 и более свежие).

Функция отправляет порту команду сброса.

FT_STATUS FT_ResetPort (FT_HANDLE ftHandle);

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Эта функция используется для попытки восстановления порта после ошибки. Она не эквивалентна событию отключения-переподключения (unplug-replug event). В качестве эквивалента unplug-replug event используйте FT_CyclePort.

Пример:

FT_HANDLE ftHandle; // рабочий хендл, полученный вызовом FT_OpenEx
FT_STATUS ftStatus;
 
ftStatus = FT_ResetPort(ftHandle);
if (ftStatus == FT_OK)
{
   // Порт был сброшен
}
else
{
   // ошибка FT_ResetPort!
}

Поддерживаемые Windows (2000 и более свежие).

Функция отправляет порту USB команду cycle.

FT_STATUS FT_CyclePort (FT_HANDLE ftHandle);

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Эффект от этой функции такой же, как от отключения и повторного подключения устройства в порту USB. Можно использовать эту функцию в случае фатальной ошибки, когда сложно, или невозможно, восстановить работоспособность без отключения и переподключения кабеля USB. Эта функция может также использоваться после перепрограммирования EEPROM, чтобы заставить устройство FTDI прочитать новые настройки из EEPROM, что иначе потребовало бы физического отключения/переподключения.

Так как текущая сессия не восстанавливается, когда драйвер устройства перезагружается, то приложение должно уметь восстанавливать нормальную работу после вызова этой функции. Приложение должно закрыть текущий хендл после успешного вызова FT_CyclePort.

Функция FT_CyclePort применима для устройств FT4232H, FT2232H и FT2232, и будет работать только на Windows XP и более свежих версиях.

Пример:

FT_HANDLE ftHandle; // рабочий хендл, полученный вызовом FT_OpenEx
FT_STATUS ftStatus;
 
ftStatus = FT_CyclePort(ftHandle);
if (ftStatus == FT_OK)
{
   // Успешно выполнена команда cycle.
   // Закрыть хендл, потому что он больше недействителен:
   ftStatus = FT_Close(ftHandle);
}
else
{
   // ошибка FT_CyclePort!
}

Поддерживаемые ОС: Windows (2000 и более свежие).

Эта функция может быть полезной при попытке программно восстановить работу с устройством.

FT_STATUS FT_Rescan (void);

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Вызов FT_Rescan эквивалентен выбору "Scan for hardware changes" (сканировать в поиске изменений в аппаратуре) в Device Manager (Менеджер Устройств). Для новых устройств проверяется только аппаратура USB. Будут просканированы все устройства USB, не только FTDI.

Пример:

FT_STATUS ftstatus;
 
ftStatus = FT_Rescan();
if(ftStatus != FT_OK)
{
   // ошибка FT_Rescan!
   return;
}

Поддерживаемые ОС: Windows (2000 и более свежие).

Функция принудительно перезагрузит драйвер для устройств с указанными VID и PID.

FT_STATUS FT_Reload (WORD wVID, WORD wPID);

Параметры:

wVID Vendor ID устройств.
wPID Product ID устройств.

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Вызов FT_Reload принуждает операционную систему выгрузить и повторно загрузить драйвер для устройств с указанными идентификаторами. Если параметры VID и PID равны null, то будут перезагружены драйверы для корневых хабов USB (USB root hub), это приведет к тому, что у всех устройств будут перезагружены их драйверы. Имейте в виду, что эта функция не будет корректно работать на 64-битной Windows, когда вызов функции происходит из 32-битного приложения.

Пример 1. Здесь показано, как вызвать FT_Reload, чтобы перезагрузить драйвер для стандартного устройства FT232R (VID 0x0403, PID 0x6001).

FT_STATUS ftstatus;
WORD wVID = 0x0403;
WORD wPID = 0x6001;
 
ftStatus = FT_Reload(wVID,wPID);
if(ftStatus != FT_OK)
{
   // ошибка FT_Reload!
   return;
}

Пример 2. Здесь показано, как вызвать FT_Reload, чтобы перезагрузить драйверы для всех устройств USB.

FT_STATUS ftstatus;
WORD wVID = 0x0000;
WORD wPID = 0x0000;
 
ftStatus = FT_Reload(wVID,wPID);
if(ftStatus != FT_OK)
{
   // ошибка FT_Reload!
   return;
}

Поддерживаемые ОС: Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Устанавливает значение ResetPipeRetryCount.

FT_STATUS FT_SetResetPipeRetryCount (FT_HANDLE ftHandle, DWORD dwCount);

Параметры:

ftHandle хендл устройства.
dwCount число unsigned long, содержащее значение для ResetPipeRetryCount.

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

ResetPipeRetryCount управляет максимальным количеством попыток драйвера сбросить канал (pipe), на котором произошла ошибка. По умолчанию значение ResetPipeRequestRetryCount равно 50. В условиях повышенного уровня помех может понадобиться увеличить это значение, когда происходит много ошибок USB.

Пример:

FT_HANDLE ftHandle; // рабочий хендл, полученный вызовом FT_OpenEx
FT_STATUS ftStatus;
DWORD dwRetryCount;
 
dwRetryCount = 100;
ftStatus = FT_SetResetPipeRetryCount(ftHandle, dwRetryCount);
if (ftStatus == FT_OK)
{
   // ResetPipeRetryCount установлен на 100
}
else
{
   // ошибка FT_SetResetPipeRetryCount!
}

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Останавливает задачу IN драйвера.

FT_STATUS FT_StopInTask (FT_HANDLE ftHandle);

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Эта функция используется для перевода задачи драйвера IN (чтение, read) в состояние ожидания (wait state). Может использоваться в ситуациях, когда постоянно происходит прием данных, чтобы можно было очистить устройство без приема большего количества данных. Функция используется совместно с FT_RestartInTask, которая снова активирует задачу IN.

Пример:

FT_HANDLE ftHandle;
FT_STATUS ftStatus;
 
ftStatus = FT_Open(0, &ftHandle);
if(ftStatus != FT_OK)
{
   // ошибка FT_Open
   return;
}
do
{
   ftStatus = FT_StopInTask(ftHandle);
}while (ftStatus != FT_OK);
 
//
// Здесь делаем что-то, например операцию purge для устройства
//
 
do
{
   ftStatus = FT_RestartInTask(ftHandle);
}while (ftStatus != FT_OK);
FT_Close(ftHandle);

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Активирует приостановленную задачу IN драйвера.

FT_STATUS FT_RestartInTask (FT_HANDLE ftHandle);

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Эта функция используется для перезапуска задачи драйвера IN (для чтения) после того, как задача IN была остановлена вызовом FT_StopInTask.

Для примера использования см. функцию FT_StopInTask.

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Устанавливает максимальное время в миллисекундах, которое запрос USB может оставаться не установленным.

FT_STATUS FT_SetDeadmanTimeout (FT_HANDLE ftHandle, DWORD dwDeadmanTimeout);

Параметры:

ftHandle хендл устройства.
dwDeadmanTimeout значение таймаута deadman в миллисекундах. Значение по умолчанию 5000.

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Таймаут deadman относится к продвинутым опциям драйвера (Advanced Driver Options), описанным в апноуте AN232B-10, который можно найти на сайте компании FTDI. Это так называемый таймаут USB. Маловероятно, что эта функция понадобится большинству пользователей.

Пример:

FT_HANDLE ftHandle;
FT_STATUS ftStatus;
 
DWORD dwDeadmanTimeout = 6000;
ftStatus = FT_Open(0, &ftHandle);
if(ftStatus != FT_OK)
{
   // ошибка FT_Open
   return;
}
ftStatus = FT_SetDeadmanTimeout(ftHandle, dwDeadmanTimeout);
if (ftStatus == FT_OK)
{
   // Deadman Timer установлен на 6 секунд
}
else
{
   // ошибка FT_SetDeadmanTimeout!
}
FT_Close(ftHandle);

Недокументированные функции.

[4. Функции интерфейса программирования EEPROM]

Энергонезависимая память устройства FTDI (EEPROM) может быть прочитана и запрограммирована с использованием функций, перечисленных в этой секции.

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Читает значение из EEPROM в указанном месте.

FT_STATUS FT_ReadEE (FT_HANDLE ftHandle, DWORD dwWordOffset, LPWORD lpwValue);

Параметры:

ftHandle хендл устройства.
dwWordOffset откуда читать.
lpwValue указатель на значение WORD, куда будет прочитано значение из EEPROM.

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Память EEPROM в устройствах FTDI организована по словам (WORD), так что каждое возвращенное значение 16-битное.

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Записывает значение в EEPROM.

FT_STATUS FT_WriteEE (FT_HANDLE ftHandle, DWORD dwWordOffset, WORD wValue);

Параметры:

ftHandle хендл устройства.
dwWordOffset куда писать.
lpwValue значение WORD, которое будет записано в EEPROM.

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Память EEPROM в устройствах FTDI организована по словам (WORD), так что каждое записанное значение 16-битное.

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Очищает содержимое EEPROM устройства.

FT_STATUS FT_EraseEE (FT_HANDLE ftHandle);

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Эта функция полностью очищает содержимое EEPROM, включая область данных пользователя. Имейте в виду, что устройства FT232R и FT245R содержат в себе встроенную память EEPROM, которая не может быть очищена.

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Читает содержимое EEPROM.

FT_STATUS FT_EE_Read (FT_HANDLE ftHandle, PFT_PROGRAM_DATA pData);

Параметры:

ftHandle хендл устройства.
pData указатель на структуру типа FT_PROGRAM_DATA.

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Функция интерпретирует параметр pData как указатель на структуру типа FT_PROGRAM_DATA, которая предназначена для приема данных из EEPROM.

Функция не производит никакие проверки на размеры буферов, так что буферы, переданные в структуре FT_PROGRAM_DATA, должны быть достаточного размера, чтобы разместить ожидаемые строки (включая завершающие null-терминаторы). Размеры, показанные в следующем примере, более чем адекватные, и могут быть уменьшены, если это необходимо. Ограничение состоит в том, что длина строки описания производителя (Manufacturer string) плюс длина строки описания (Description string) меньше или равна 40 символам.

Имейте в виду, что DLL должна быть информирована о версии используемой структуры FT_PROGRAM_DATA. Это делается через элементы структуры Signature1, Signature2 и Version. Signature1 всегда должна быть равна 0x00000000, Signature2 всегда должна быть равна 0xFFFFFFFF, и Version может быть установлена в ту версию, которая нужна. Для совместимости со всеми текущими устройствами Version должна быть установлена в последнюю версию структуры FT_PROGRAM_DATA, как это задано в заголовочном файле FTD2XX.h.

Пример:

FT_HANDLE ftHandle;
FT_STATUS ftStatus = FT_Open(0, &ftHandle);if (ftStatus != FT_OK)
{
   // ошибка FT_Open!
   return;
}
 
FT_PROGRAM_DATA ftData;
char ManufacturerBuf[32];
char ManufacturerIdBuf[16];
char DescriptionBuf[64];
char SerialNumberBuf[16];
 
ftData.Signature1 = 0x00000000;
ftData.Signature2 = 0xffffffff;
ftData.Version = 0x00000005; // структура EEPROM с расширениями FT232H
ftData.Manufacturer = ManufacturerBuf;
ftData.ManufacturerId = ManufacturerIdBuf;
ftData.Description = DescriptionBuf;
ftData.SerialNumber = SerialNumberBuf;
 
ftStatus = FT_EE_Read(ftHandle, &ftData);
if (ftStatus == FT_OK)
{
   // FT_EE_Read OK, данные доступны в ftData
}
else
{
   // ошибка FT_EE_Read!
}
FT_Close(ftHandle);

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Чтение содержимого EEPROM и передача строк по отдельности.

FT_STATUS FT_EE_ReadEx (FT_HANDLE ftHandle,
                        PFT_PROGRAM_DATA pData,
                        char *Manufacturer,
                        char *ManufacturerId,
                        char *Description,
                        char *SerialNumber);

Параметры:

ftHandle хендл устройства.
pData указатель на структуру типа FT_PROGRAM_DATA.
*Manufacturer указатель на null-terminated строку, которая содержит имя производителя.
*ManufacturerId указатель на null-terminated строку, которая содержит идентификатор производителя.
*Description указатель на null-terminated строку, которая содержит описание устройства.
*SerialNumber указатель на null-terminated строку, которая содержит серийный номер устройства.

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Эта версия стандартной функции FT_EE_Read была добавлена для поддержки таких языков, как LabVIEW, где есть проблемы с указателями на строки, которые содержатся в структуре.

Эта функция интерпретирует параметр pData как указатель на структуру FT_PROGRAM_DATA, где есть место для данных, которые будут прочитаны из EEPROM.

Функция не выполняет никакие проверки на размеры буферов, поэтому буферы, переданные через поля структуры FT_PROGRAM_DATA должны быть достаточно велики, чтобы разместить в себе ожидаемые строки (включая их null-терминаторы).

Имейте в виду, что DLL должна быть информирована о версии используемой структуры FT_PROGRAM_DATA. Это делается через элементы структуры Signature1, Signature2 и Version. Signature1 всегда должна быть равна 0x00000000, Signature2 всегда должна быть равна 0xFFFFFFFF, и Version может быть установлена в ту версию, которая нужна. Для совместимости со всеми текущими устройствами Version должна быть установлена в последнюю версию структуры FT_PROGRAM_DATA, как это задано в заголовочном файле FTD2XX.h.

Строковые параметры в структуре FT_PROGRAM_DATA должны быть переданы как DWORD, чтобы избежать пересечение параметров. Все указатели строк передаются отдельно от структуры FT_PROGRAM_DATA.

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Программирует (записывает) EEPROM.

FT_STATUS FT_EE_Program (FT_HANDLE ftHandle, PFT_PROGRAM_DATA pData);

Параметры:

ftHandle хендл устройства.
pData указатель на структуру типа FT_PROGRAM_DATA.

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Эта функция интерпретирует параметр pData как указатель на структуру FT_PROGRAM_DATA, где содержаться данные, которые должны быть записаны в EEPROM. Данные записываются в EEPROM, затем вычитываются и проверяются.

Если поле SerialNumber в FT_PROGRAM_DATA равно NULL, или SerialNumber указывает на NULL-строку, то будет сгенерирован серийный номер на основе ManufacturerId и текущих даты/времени. Длина строки Manufacturer плюс длина строки Description должна быть меньше или равна 40 символам.

Имейте в виду, что DLL должна быть информирована о версии используемой структуры FT_PROGRAM_DATA. Это делается через элементы структуры Signature1, Signature2 и Version. Signature1 всегда должна быть равна 0x00000000, Signature2 всегда должна быть равна 0xFFFFFFFF, и Version может быть установлена в ту версию, которая нужна. Для совместимости со всеми текущими устройствами Version должна быть установлена в последнюю версию структуры FT_PROGRAM_DATA, как это задано в заголовочном файле FTD2XX.h.

Если pData равен NULL, то по умолчанию версия структуры будет 0 (как в оригинальной серии BM) и устройство будет запрограммировано данными по умолчанию.

В примере ниже показано, как программировать EEPROM устройства FT232B. Остальные параметры должны быть установлены для других типов устройств.

// Структура версии 4 для программирования устройства серии BM.
// Другие поля структуры должны содержать ненулевые значения для устройств FT2232, FT232R,
// FT245R, FT2232H или FT4232H.
FT_PROGRAM_DATA ftData =
{
   0x00000000,          // заголовок - тут должно быть значение 0x00000000 
   0xFFFFFFFF, // заголовок - тут должно быть значение 0xffffffff 
   0x00000004, // заголовок - тут должна быть версия FT_PROGRAM_DATA
   0x0403,     // VID 
   0x6001,     // PID 
   "FTDI",     // строка имени производителя (Manufacturer)
   "FT",       // идентификатор производителя (Manufacturer ID)
   "USB HS Serial Converter", // строка описания (Description)
   "FT000001", // серийный номер
   44,         // максимальная потребляемая мощьность от шины (MaxPower)
   1,          // PnP 
   0,          // если не 0, то устройство имеет свой источник питания (SelfPowered)
   1,          // есть ли функция удаленного пробуждения (RemoteWakeup)
   1,          // не 0, если чип Rev4, иначе 0
   0,          // не 0, если in endpoint изохронная
   0,          // не 0, если out endpoint изохронная
   0,          // не 0, если разрешен pull down
   1,          // не 0, если используется серийный номер
   0,          // не 0, если чип использует USBVersion 
   0x0110      // BCD (0x0200 => USB2)
   //
   // Расширения для FT2232C (разрешены, если Version = 1 или больше)
   //
   0,          // не 0, если чип Rev5, иначе 0
   0,          // не 0, если in endpoint изохронная 
   0,          // не 0, если in endpoint изохронная 
   0,          // не 0, если out endpoint изохронная 
   0,          // не 0, если out endpoint изохронная 
   0,          // не 0, если pull down разрешен
   0,          // не 0, если используется серийный номер 
   0,          // не 0, если чип использует USBVersion 
   0x0,        // BCD (0x0200 => USB2) 
   0,          // не 0, если интерфейс потребляет большой ток
   0,          // не 0, если интерфейс потребляет большой ток
   0,          // не 0, если интерфейс 245 FIFO 
   0,          // не 0, если интерфейс 245 FIFO CPU target 
   0,          // не 0, если интерфейс Fast serial 
   0,          // не 0, если интерфейс использует драйверы VCP 
   0,          // не 0, если интерфейс 245 FIFO 
   0,          // не 0, если интерфейс 245 FIFO CPU target 
   0,          // не 0, если интерфейс Fast serial 
   0,          // не 0, если интерфейс использует драйверы VCP 
   //
   // Расширения для FT232R (разрешены, если Version = 2 или больше) 
   //
   0,          // если не 0, то использовать внешний генератор
   0,          // если не 0, то I/O с повышенной нагрузочной способностью
   0,          // размер конечной точки 
   0,          // не 0, если разрешен pull down 
   0,          // не 0, если используется серийный номер 
   0,          // не 0, если инверсный TXD 
   0,          // не 0, если инверсный RXD 
   0,          // не 0, если инверсный RTS 
   0,          // не 0, если инверсный CTS 
   0,          // не 0, если инверсный DTR 
   0,          // не 0, если инверсный DSR
   0,          // не 0, если инверсный DCD 
   0,          // не 0, если инверсный RI 
   0,          // Управление мультиплексором Cbus (управление мультиплексором CBUS (Cbus Mux control)) 
   0,          // Управление мультиплексором Cbus (управление мультиплексором CBUS (Cbus Mux control)) 
   0,          // Управление мультиплексором Cbus (управление мультиплексором CBUS (Cbus Mux control)) 
   0,          // Управление мультиплексором Cbus (управление мультиплексором CBUS (Cbus Mux control)) 
   0,          // Управление мультиплексором Cbus (управление мультиплексором CBUS (Cbus Mux control)) 
   0,          // не 0, если используются драйверы D2XX
   //
   // Расширения Rev 7 (FT2232H, разрешены, если Version = 3 или больше)
   //
   0,          // не 0, если разрешен pull down 
   0,          // не 0, если используется серийный номер 
   0,          // не 0, если AL выводы имеют малую скорость изменения уровня 
   0,          // не 0, если AL выводы работают как входы с триггером Шмитта 
   0,          // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА 
   0,          // не 0, если AH выводы имеют малую скорость изменения уровня 
   0,          // не 0, если AH выводы работают как входы с триггером Шмитта 
   0,          // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА 
   0,          // не 0, если BL выводы имеют малую скорость изменения уровня 
   0,          // не 0, если BL выводы работают как входы с триггером Шмитта 
   0,          // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА 
   0,          // не 0, если BH выводы имеют малую скорость изменения уровня 
   0,          // не 0, если BH выводы работают как входы с триггером Шмитта 
   0,          // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА 
   0,          // не 0, если интерфейс 245 FIFO 
   0,          // не 0, если интерфейс 245 FIFO CPU target 
   0,          // не 0, если интерфейс Fast serial 
   0,          // не 0, если интерфейс использует драйверы VCP 
   0,          // не 0, если интерфейс 245 FIFO 
   0,          // не 0, если интерфейс 245 FIFO CPU target
   0,          // не 0, если интерфейс Fast serial 
   0,          // не 0, если интерфейс использует драйверы VCP 
   0,          // не 0, если BCBUS7 используется для экономии энергии в схемах
               // с собственным питанием (self-powered)
   //
   // Расширения Rev 8 (FT4232H, разрешены если Version = 4)
   // 
   0,          // не 0, если разрешен pull down 
   0,          // не 0, если используется серийный номер 
   0,          // не 0, если AL выводы имеют малую скорость изменения уровня 
   0,          // не 0, если AL выводы работают как входы с триггером Шмитта
   0,          // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА 
   0,          // не 0, если AH выводы имеют малую скорость изменения уровня 
   0,          // не 0, если AH выводы работают как входы с триггером Шмитта 
   0,          // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА 
   0,          // не 0, если BL выводы имеют малую скорость изменения уровня 
   0,          // не 0, если BL выводы работают как входы с триггером Шмитта 
   0,          // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА 
   0,          // не 0, если BH выводы имеют малую скорость изменения уровня 
   0,          // не 0, если BH выводы работают как входы с триггером Шмитта 
   0,          // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА 
   0,          // не 0, если port A использует RI как RS485 TXDEN 
   0,          // не 0, если port B использует RI как RS485 TXDEN 
   0,          // не 0, если port C использует RI как RS485 TXDEN 
   0,          // не 0, если port D использует RI как RS485 TXDEN 
   0,          // не 0, если интерфейс использует драйверы VCP 
   0,          // не 0, если интерфейс использует драйверы VCP 
   0,          // не 0, если интерфейс использует драйверы VCP 
   0,          // не 0, если интерфейс использует драйверы VCP
   //
   // Расширения Rev 9 (FT232H, разрешено если Version = 5)
   //
   0,          // не 0, если разрешен pull down 
   0,          // не 0, если используется серийный номер 
   0,          // не 0, если AC выводы имеют малую скорость изменения уровня 
   0,          // не 0, если AC выводы работают как входы с триггером Шмитта
   0,          // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА 
   0,          // не 0, если AD выводы имеют малую скорость изменения уровня 
   0,          // не 0, если AD выводы работают как входы с триггером Шмитта 
   0,          // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА 
   0,          // Управление мультиплексором Cbus (управление мультиплексором CBUS (Cbus Mux control)) 
   0,          // Управление мультиплексором Cbus (управление мультиплексором CBUS (Cbus Mux control)) 
   0,          // Управление мультиплексором Cbus (управление мультиплексором CBUS (Cbus Mux control)) 
   0,          // Управление мультиплексором Cbus (управление мультиплексором CBUS (Cbus Mux control))
   0,          // Управление мультиплексором Cbus (управление мультиплексором CBUS (Cbus Mux control)) 
   0,          // Управление мультиплексором Cbus (управление мультиплексором CBUS (Cbus Mux control)) 
   0,          // Управление мультиплексором Cbus (управление мультиплексором CBUS (Cbus Mux control)) 
   0,          // Управление мультиплексором Cbus (управление мультиплексором CBUS (Cbus Mux control)) 
   0,          // Управление мультиплексором Cbus (управление мультиплексором CBUS (Cbus Mux control)) 
   0,          // Управление мультиплексором Cbus (управление мультиплексором CBUS (Cbus Mux control)) 
   0,          // не 0, если интерфейс 245 FIFO 
   0,          // не 0, если интерфейс 245 FIFO CPU target 
   0,          // не 0, если интерфейс Fast serial 
   0,          // не 0, если интерфейс FT1248 
   0,          // полярность тактов FT1248 - уровень ожидания тактов (clock idle) высокий (1)
               // или низкий (0)
   0,          // порядок следования данных FT1248, сначала LSB (1) или MSB (0) 
   0,          // разрешено ли управление потоком (flow control) FT1248
   0,          // не 0, если интерфейс использует драйверы VCP
   0           // не 0, если ACBUS7 используется для экономии энергии в схемах
               // с собственным питанием (self-powered)
FT_HANDLE ftHandle;
 
FT_STATUS ftStatus = FT_Open(0, &ftHandle);
if (ftStatus == FT_OK)
{
   ftStatus = FT_EE_Program(ftHandle, &ftData);
   if (ftStatus == FT_OK)
   {
      // FT_EE_Program OK!
   }
   else
   {
      // ошибка FT_EE_Program!
   }
   FT_Close(ftHandle);
}

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Программирует EEPROM, передавая строки по отдельности.

FT_STATUS FT_EE_ProgramEx (FT_HANDLE ftHandle,
                           PFT_PROGRAM_DATA pData,
                           char *Manufacturer,
                           char *ManufacturerId,
                           char *Description,
                           char *SerialNumber);

Параметры:

ftHandle хендл устройства.
pData указатель на структуру типа FT_PROGRAM_DATA.
*Manufacturer указатель на null-terminated строку, которая содержит имя производителя.
*ManufacturerId указатель на null-terminated строку, которая содержит идентификатор производителя.
*Description указатель на null-terminated строку, которая содержит описание устройства.
*SerialNumber указатель на null-terminated строку, которая содержит серийный номер устройства.

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Это версия функции FT_EE_Program была добавлена для поддержки таких языков, как LabVIEW, где есть проблемы с указателями на строки, которые содержатся в структуре.

Эта функция интерпретирует параметр pData как указатель на структуру FT_PROGRAM_DATA, где находятся данные, которые будут записаны в EEPROM. Данные записываются в EEPROM, затем вычитываются и проверяются.

Строковые параметры в структуре FT_PROGRAM_DATA должны быть переданы как DWORD, чтобы избежать пересечение параметров. Все указатели строк передаются отдельно от структуры FT_PROGRAM_DATA.

Если поле SerialNumber в FT_PROGRAM_DATA равно NULL, или SerialNumber указывает на NULL-строку, то будет сгенерирован серийный номер на основе ManufacturerId и текущих даты/времени. Длина строки Manufacturer плюс длина строки Description должна быть меньше или равна 40 символам.

Имейте в виду, что DLL должна быть информирована о версии используемой структуры FT_PROGRAM_DATA. Это делается через элементы структуры Signature1, Signature2 и Version. Signature1 всегда должна быть равна 0x00000000, Signature2 всегда должна быть равна 0xFFFFFFFF, и Version может быть установлена в ту версию, которая нужна. Для совместимости со всеми текущими устройствами Version должна быть установлена в последнюю версию структуры FT_PROGRAM_DATA, как это задано в заголовочном файле FTD2XX.h.

Если pData равен NULL, то по умолчанию версия структуры будет 0 (как в оригинальной серии BM) и устройство будет запрограммировано данными по умолчанию.

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Получает доступный размер области данных пользователя в EEPROM.

FT_STATUS FT_EE_UASize (FT_HANDLE ftHandle, LPDWORD lpdwSize);

Параметры:

ftHandle хендл устройства.
lpdwSize указатель на DWORD, куда будет записан доступный размер области данных пользователя в байтах.

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Область данных пользователя в EEPROM устройства FTDI не используется в конфигурации устройства и его дескрипторах. Эта область доступна пользователю для записи туда любой информации, специфичной для его приложения. Размер области данных пользователя зависит от длины строк Manufacturer, ManufacturerId, Description и SerialNumber, запрограммированных в EEPROM.

Пример:

FT_HANDLE ftHandle;
 
FT_STATUS ftStatus = FT_Open(0, &ftHandle);
if (ftStatus != FT_OK)
{
   // ошибка FT_Open!
   return;
}
 
DWORD EEUA_Size;
 
ftStatus = FT_EE_UASize(ftHandle, &EEUA_Size);
if (ftStatus == FT_OK)
{
   // FT_EE_UASize OK
   // EEUA_Size содержит размер области EEUA в байтах
}
else
{
   // ошибка FT_EE_UASize!
}
FT_Close(ftHandle);

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Читает из EEPROM содержимое области данных пользователя.

FT_STATUS FT_EE_UARead (FT_HANDLE ftHandle,
                        PUCHAR pucData,
                        DWORD dwDataLen,
                        LPDWORD lpdwBytesRead);

Параметры:

ftHandle хендл устройства.
pucData указатель на буфер, который содержит место для данных.
dwDataLen размер буфера в байтах.
lpdwBytesRead указатель на DWORD, куда будет записано количество прочитанных байт.

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Эта функция интерпретирует параметр pucData как указатель на байтовый массив размером dwDataLen, куда должны попасть прочитанные данные. Действительное количество прочитанных байт будет сохранено в DWORD, на которое указывает lpdwBytesRead.

Если dwDataLen меньше, чем размер области данных пользователя в EEPROM, то dwDataLen байт будет прочитано в буфер. Иначе в буфер будет прочитана вся область данных пользователя. Размер области данных пользователя может быть определен вызовом FT_EE_UASize.

Приложение должно проверить возвращенное функцией значение в переменной lpdwBytesRead, когда произошел возврат из FT_EE_UARead.

Пример:

FT_HANDLE ftHandle;
 
FT_STATUS ftStatus = FT_Open(0, &ftHandle);
if (ftStatus != FT_OK)
{
   // ошибка FT_Open!
   return;
}
 
unsigned char Buffer[64];
DWORD BytesRead;
 
ftStatus = FT_EE_UARead(ftHandle, Buffer, 64, &BytesRead);
if (ftStatus == FT_OK)
{
   // FT_EE_UARead OK,
   // данные пользвателя сохранены в буфере Buffer,
   // количество прочитанных байт из EEUA сохранено в BytesRead
}
else
{
   // ошибка FT_EE_UARead!
}
FT_Close(ftHandle);

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Записывает данные в область пользователя EEPROM.

FT_STATUS FT_EE_UAWrite (FT_HANDLE ftHandle, PUCHAR pucData, DWORD dwDataLen);

Параметры:

ftHandle хендл устройства.
pucData указатель на буфер, который содержит записываемые данные.
dwDataLen размер буфера в байтах.

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Эта функция интерпретирует параметр pucData как указатель на байтовый массив размером dwDataLen, который содержит данные для записи в область данных пользователя EEPROM. Если dwDataLen будет больше размера области данных пользователя в EEPROM, то произойдет ошибка программирования данных. Доступный размер области данных пользователя может быть определен вызовом FT_EE_UASize.

Пример:

FT_HANDLE ftHandle;
 
FT_STATUS ftStatus = FT_Open(0, &ftHandle);
if (ftStatus != FT_OK)
{
   // ошибка FT_Open!
   return;
}
 
char *buffer = "Hello, World";
ftStatus = FT_EE_UAWrite(ftHandle, (unsigned char*)buffer, 12);
if(ftStatus == FT_OK)
{
   // FT_EE_UAWRITE OK
}
else
{
   // ошибка FT_EE_UAWRITE
}
FT_Close(ftHandle);

Поддерживаемые ОС: Windows (XP и более свежие).

Читает данные из EEPROM. Эта команда будет работать на всех существующих чипсетах FTDI, и должна использоваться для серии FT-X.

FT_STATUS FT_EEPROM_Read(FT_HANDLE ftHandle,
                         void *eepromData,
                         DWORD eepromDataSize,
                         char *Manufacturer,
                         char *ManufacturerId,
                         char *Description,
                         char *SerialNumber);

Параметры:

ftHandle хендл устройства.
*eepromData указатель на буфер, который предназначен для прочитанных данных. Примечание: эта структура отличается для каждого типа устройства.
epromDataSize размер буфера eepromData.
*Manufacturer указатель на null-terminated строку, содержащую место для имени производителя.
*ManufacturerId указатель на null-terminated строку, содержащую место для идентификатора производителя (manufacturer ID).
*Description указатель на null-terminated строку, содержащую место для описания устройства.
*SerialNumber указатель на null-terminated строку, содержащую место для серийного номера устройства.

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Эта функция интерпретирует параметр *eepromDATA как указатель на структуру, соответствующую типу устройства, например:

PFT_EEPROM_232B это структура для устройств FT2xxB.
PFT_EEPROM_2232 это структура для устройств FT2232D.
PFT_EEPROM_232R это структура для устройств FT232R.
PFT_EEPROM_2232H это структура для устройств FT2232H.
PFT_EEPROM_4232H это структура для устройств FT4232H.
PFT_EEPROM_232H это структура для устройств FT232H.
PFT_EEPROM_X_SERIES это структура для устройств FT2xxX.

Функция не выполняет никаких проверок на размеры буферов, так что размеры буферов, которые передаются в структуре eepromDATA, должны быть достаточно велики, чтобы вместить соответствующие строки (включая null-терминаторы). Размеры, показанные в следующем примере, более чем адекватные, и могут быть уменьшены, если это необходимо. Ограничение состоит в том, что длина строки описания производителя (Manufacturer string) плюс длина строки описания (Description string) меньше или равна 40 символам.

Имейте в виду, что DLL должна быть информирована о версии используемой структуры eepromDATA. Это делается через структуру PFT_EEPROM_HEADER. Первый элемент структуры deviceType, который может быть FT_DEVICE_BM, FT_DEVICE_AM, FT_DEVICE_2232C, FT_DEVICE_232R, FT_DEVICE_2232H, FT_DEVICE_4232H, FT_DEVICE_232H или FT_DEVICE_X_SERIES, как это задано в FTD2XX.h.

Пример:

FT_HANDLE fthandle;
FT_STATUS status;
char Manufacturer[64];
char ManufacturerId[64];
char Description[64];
char SerialNumber[64];
FT_EEPROM_HEADER ft_eeprom_header;
 
// тип устройства, к которому осуществляется доступ:
ft_eeprom_header.deviceType = FT_DEVICE_2232H;
 
FT_EEPROM_2232H ft_eeprom_2232h;
ft_eeprom_2232h.common = ft_eeprom_header;
ft_eeprom_2232h.common.deviceType = FT_DEVICE_2232H;
 
status = FT_Open(0, &fthandle);
if(status != FT_OK)
{
   printf("Устройство не открыто на доступ, статус %d\n", status);
   return;
}
 
status = FT_EEPROM_Read(fthandle,
                        &ft_eeprom_2232h,
                        sizeof(ft_eeprom_2232h),
                        Manufacturer,
                        ManufacturerId,
                        Description,
                        SerialNumber);
if (status != FT_OK)
{
   printf("Ошибка EEPROM_Read, статус %d\n", status);
}
else
{
   printf("VendorID = 0x%04x\n", ft_eeprom_2232h.common.VendorId);
   printf("ProductID = 0x%04x\n", ft_eeprom_2232h.common.ProductId);
   ...
   ...
}
FT_Close(fthandle);

Поддерживаемые ОС: Windows (XP и более свежие).

Записывает данные в EEPROM. Эта команда будет работать на всех существующих чипсетах FTDI, и должна использоваться для серии FT-X.

FT_STATUS FT_EEPROM_Program(FT_HANDLE ftHandle,
                            void *eepromData,
                            DWORD eepromDataSize,
                            char *Manufacturer,
                            char *ManufacturerId,
                            char *Description,
                            char *SerialNumber);

Параметры:

ftHandle хендл устройства.
*eepromData указатель на буфер, который содержит данные для записи. Примечание: эта структура отличается для каждого типа устройства.
epromDataSize размер буфера eepromData.
*Manufacturer указатель на null-terminated строку, содержащую имя производителя.
*ManufacturerId указатель на null-terminated строку, содержащую идентификатор производителя (manufacturer ID).
*Description указатель на null-terminated строку, содержащую описание устройства.
*SerialNumber указатель на null-terminated строку, содержащую серийный номер устройства.

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Эта функция интерпретирует параметр *eepromDATA как указатель на структуру, соответствующую типу устройства, например:

PFT_EEPROM_232B это структура для устройств FT2xxB.
PFT_EEPROM_2232 это структура для устройств FT2232D.
PFT_EEPROM_232R это структура для устройств FT232R.
PFT_EEPROM_2232H это структура для устройств FT2232H.
PFT_EEPROM_4232H это структура для устройств FT4232H.
PFT_EEPROM_232H это структура для устройств FT232H.
PFT_EEPROM_X_SERIES это структура для устройств FT2xxX.

Функция не выполняет никаких проверок на размеры буферов, так что размеры буферов, которые передаются в структуре eepromDATA, должны быть достаточно велики, чтобы вместить соответствующие строки (включая null-терминаторы). Размеры, показанные в следующем примере, более чем адекватные, и могут быть уменьшены, если это необходимо. Ограничение состоит в том, что длина строки описания производителя (Manufacturer string) плюс длина строки описания (Description string) меньше или равна 40 символам.

Имейте в виду, что DLL должна быть информирована о версии используемой структуры eepromDATA. Это делается через структуру PFT_EEPROM_HEADER. Первый элемент структуры deviceType, который может быть FT_DEVICE_BM, FT_DEVICE_AM, FT_DEVICE_2232C, FT_DEVICE_232R, FT_DEVICE_2232H, FT_DEVICE_4232H, FT_DEVICE_232H или FT_DEVICE_X_SERIES, как это задано в FTD2XX.h.

Пример изменения серийного номера устройства с помощью FT_EEPROM_Read и FT_EEPROM_Program (для упрощения проверки статуса ошибки для них опущены):

FT_HANDLE fthandle;
FT_STATUS status;
char Manufacturer[64];
char ManufacturerId[64];
char Description[64];
char SerialNumber[64];
FT_EEPROM_HEADER ft_eeprom_header;
 
// Тип устройства, к которому осуществляется доступ:
ft_eeprom_header.deviceType = FT_DEVICE_2232H;
 
FT_EEPROM_2232H ft_eeprom_2232h;
 
ft_eeprom_2232h.common = ft_eeprom_header;
ft_eeprom_2232h.common.deviceType = FT_DEVICE_2232H;
status = FT_Open(0, &fthandle);
if(status != FT_OK)
{
   printf("Ошибка открытия устройства, статус %d\n", status);
   return;
}
status = FT_EEPROM_Read(fthandle,
                        &ft_eeprom_2232h,
                        sizeof(ft_eeprom_2232h),
                        Manufacturer,
                        ManufacturerId,
                        Description,
                        SerialNumber);
strcpy(SerialNumber, "FT000001");
status = FT_EEPROM_Program(fthandle,
                           &ft_eeprom_2232h,
                           sizeof(ft_eeprom_2232h),
                           Manufacturer,
                           ManufacturerId,
                           Description,
                           SerialNumber);
FT_Close(fthandle);

[5. Функции расширенного API]

Так называемые функции расширенного API (extended API) не применимы к устройствам FT8U232AM или FT8U245AM. Микросхемы FTDI, не относящиеся к USB-UART и USB-FIFO (FT2232H, FT4232H, FT232R, FT245R, FT2232, FT232B и FT245B) могут поддерживать эти функции. Имейте в виду, что что некоторые из этих функций привязаны к конкретным устройствам.

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Устанавливает значение для таймера латентности (latency timer).

FT_STATUS FT_SetLatencyTimer (FT_HANDLE ftHandle, UCHAR ucTimer);

Параметры:

ftHandle хендл устройства.
ucTimer требуемое значение в миллисекундах для latency timer. Допустимый диапазон 2 .. 255.

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

В устройствах FT8U232AM и FT8U245AM таймаут буфера приема, используемый для сброса (flush) оставшихся данных из буфера приема, был фиксирован на 16 мс. Во всех других устройствах FTDI этот таймаут программируется, и может быть установлен с шагом 1 мс в интервале 2 мс .. 255 мс. Это позволяет лучше оптимизировать устройство под протоколы, требующие ускоренного ответа на короткие пакеты данных.

Пример:

FT_HANDLE ftHandle;
FT_STATUS ftStatus;
UCHAR LatencyTimer = 10;
 
ftStatus = FT_Open(0, &ftHandle);
if(ftStatus != FT_OK)
{
   // ошибка FT_Open
   return;
}
 
ftStatus = FT_SetLatencyTimer(ftHandle, LatencyTimer);if (ftStatus == FT_OK)
{
   // LatencyTimer установлен на 10 миллисекунд
}
else
{
   // ошибка FT_SetLatencyTimer!
}
FT_Close(ftHandle);

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Получение текущего значения latency timer.

FT_STATUS FT_GetLatencyTimer (FT_HANDLE ftHandle, PUCHAR pucTimer);

Параметры:

ftHandle хендл устройства.
pucTimer указатель на unsigned char, куда будет сохранено значение latency timer.

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

В устройствах FT8U232AM и FT8U245AM таймаут буфера приема, используемый для сброса (flush) оставшихся данных из буфера приема, был фиксирован на 16 мс. Во всех других устройствах FTDI этот таймаут программируется, и может быть установлен с шагом 1 мс в интервале 2 мс .. 255 мс. Это позволяет лучше оптимизировать устройство под протоколы, требующие ускоренного ответа на короткие пакеты данных.

Пример:

FT_HANDLE ftHandle;
FT_STATUS ftStatus;
UCHAR LatencyTimer;
 
ftStatus = FT_Open(0, &ftHandle);
if(ftStatus != FT_OK)
{
   // ошибка FT_Open
   return;
}
ftStatus = FT_GetLatencyTimer(ftHandle, &LatencyTimer);
if (ftStatus == FT_OK)
{
   // LatencyTimer содержит текущее значение
}
else
{
   // ошибка FT_GetLatencyTimer!
}
FT_Close(ftHandle);

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Разрешает работу различных режимов чипа.

FT_STATUS FT_SetBitmode (FT_HANDLE ftHandle, UCHAR ucMask, UCHAR ucMode);

Параметры:

ftHandle хендл устройства.
ucMask требуемое значение для битовой маски режима. Это устанавливает, какие биты работают как входы, какие как выходы. Значение бита 0 устанавливает соответствующий вывод как вход, а 1 устанавливает соответствующий вывод как выход. В случае CBUS Bit Bang старший ниббл этого значения управляет тем, какие выводы входы и выходы, а младший ниббл управляет, какие выходы должны стать в уровень лог. 1 или лог. 0.
ucMode значение, определяющее режим. Может принимать одно из значений:

0x0 = Reset (сброс)
0x1 = Asynchronous Bit Bang, асинхронное манипулирование выводами
0x2 = MPSSE (только для устройств FT2232, FT2232H, FT4232H и FT232H, что это такое см. [3])
0x4 = Synchronous Bit Bang, синхронное управление выводами (только для устройств FT232R, FT245R, FT2232, FT2232H, FT4232H и FT232H, см. [3, 4])
0x8 = MCU Host Bus Emulation Mode, режим эмулирования микропроцессорной шины (только для устройств FT2232, FT2232H, FT4232H и FT232H, см. [3])
0x10 = Fast Opto-Isolated Serial Mode, быстрый режим с оптоизоляцией (только для устройств FT2232, FT2232H, FT4232H и FT232H, см. [3])
0x20 = CBUS Bit Bang Mode (только для устройств FT232R и FT232H, см. [4])
0x40 = Single Channel Synchronous 245 FIFO Mode (только для устройств FT2232H и FT232H, см. [3])

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Описание режимов FT232R см. в апноуте "Bit Bang Modes for the FT232R and FT245R" (перевод на русский язык [4]).

Описание режимов FT2232 см. в апноуте "Bit Mode Functions for the FT2232".

Описание режимов Bit Bang для FT232B и FT245B см. апноут "FT232B/FT245B Bit Bang Mode".

Апноуты доступны для загрузки на сайте компании FTDI.

Имейте в виду, что для использования CBUS Bit Bang в FT232R, CBUS должна быть сконфигурирована через EEPROM для CBUS Bit Bang.

Имейте также в виду, что для использования Single Channel Synchronous 245 FIFO для FT2232H, channel A должен быть сконфигурирован через EEPROM для режима FT245 FIFO.

Пример:

FT_HANDLE ftHandle;
FT_STATUS ftStatus;
UCHAR Mask = 0xff;
UCHAR Mode = 1;      // установить asynchronous bit-bang mode
 
ftStatus = FT_Open(0, &ftHandle);
if(ftStatus != FT_OK)
{
   // ошибка FT_Open
   return;
}
 
ftStatus = FT_SetBitMode(ftHandle, Mask, Mode);
if (ftStatus == FT_OK)
{
   // значение 0xff записано в устройство
}
else
{
   // ошибка FT_SetBitMode!
}
FT_Close(ftHandle);

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Немедленное получение значения с шины данных.

FT_STATUS FT_GetBitmode (FT_HANDLE ftHandle, PUCHAR pucMode);

Параметры:

ftHandle хендл устройства.
pucMode указатель на unsigned char, куда будет сохранено текущее значение с шины данных.

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Описание режимов FT232R см. в апноуте "Bit Bang Modes for the FT232R and FT245R" (перевод на русский язык см. в [4]). Описание режимов FT2232 см. в апноуте "Bit Mode Functions for the FT2232". Описание режимов Bit Bang для FT232B и FT245B см. апноут "FT232B/FT245B Bit Bang Mode". Описание режимов FT4232H и FT2232H см. в апноуте на микросхему (перевод на русский язык см. в [3]).

Апноуты доступны для загрузки на сайте компании FTDI.

Пример:

FT_HANDLE ftHandle;
UCHAR BitMode;
FT_STATUS ftStatus;
 
ftStatus = FT_Open(0, &ftHandle);
if(ftStatus != FT_OK)
{
   // ошибка FT_Open
   return;
}
ftStatus = FT_GetBitMode(ftHandle, &BitMode);
if (ftStatus == FT_OK)
{
   // BitMode содержит текущее значение
}
else
{
   // ошибка FT_GetBitMode!
}
FT_Close(ftHandle);

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Устанавливает размер запроса передачи USB.

FT_STATUS FT_SetUSBParameters (FT_HANDLE ftHandle,
                               DWORD dwInTransferSize,
                               DWORD dwOutTransferSize);

Параметры:

ftHandle хендл устройства.
dwInTransferSize размер передачи для запроса USB IN.
dwOutTransferSize размер передачи для запроса USB OUT.

Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.

Эта функция может использоваться для изменения размеров передач от значения по умолчанию 4096, чтобы лучше подходить к требованиям приложения. Размеры передач должны быть установлены как число, кратное 64 байтам, в диапазоне от 64 байт до 65536 байт.

Когда вызывается FT_SetUSBParameters, изменения вступят в силу немедленно, и любые данные, которые в настоящий момент удерживались драйвером, будут потеряны.

Имейте в виду, что в настоящий момент поддерживается только dwInTransferSize.

Пример:

FT_HANDLE ftHandle;
FT_STATUS ftStatus;
DWORD InTransferSize = 16384;
 
ftStatus = FT_Open(0, &ftHandle);
if(ftStatus != FT_OK)
{
   // ошибка FT_Open
   return;
}
ftStatus = FT_SetUSBParameters(ftHandle, InTransferSize, 0);
if (ftStatus == FT_OK)
{
   // размер передачи IN установлен на 16 килобайт
}
else
{
   // ошибка FT_SetUSBParameters!
}
FT_Close(ftHandle);

[6. Функции FT-Win32 API]

Функции, представленные в этой секции, предоставлены для упрощения портирования из приложений Win32, работающих с последовательным портом. Эти функции поддерживаются на не-Windows платформах, что значительно облегчает перенос существующих приложений из Windows. Имейте в виду, что классические функции D2XX и функции Win32 D2XX не должны смешиваться, если не указано обратное.

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Откроет указанное устройство и возвратит хендл, который будет использоваться для последующего доступа. Устройство может быть указано по своему серийному номеру, описанию или размещению на шине USB (location).

Эта функция должна использоваться, если требуется ввод/вывод с перекрытием (overlapped I/O).

FT_HANDLE FT_W32_CreateFile (PVOID pvArg1,
                             DWORD dwAccess,
                             DWORD dwShareMode,
                             LPSECURITY_ATTRIBUTES lpSecurityAttributes,
                             DWORD dwCreate,
                             DWORD dwAttrsAndFlags,
                             HANDLE hTemplate);

Параметры:

pvArg1 значение зависит от dwAttrsAndFlags. Может быть указателем на null-terminated строку, которая содержит описание или серийный номер устройства, или может быть location устройства. Эти значения могут быть получены из вызова функций FT_CreateDeviceInfoList, FT_GetDeviceInfoDetail или FT_ListDevices.
dwAccess тип доступа к устройству. Может быть GENERIC_READ, GENERIC_WRITE или оба вместе. Параметр игнорируется в Linux.
dwShareMode как устройство используется совместно. Это значение должно быть установлено в 0.
lpSecurityAttributes этот параметр не дает эффекта, и должен быть установлен в NULL.
dwCreate этот параметр должен быть установлен в OPEN_EXISTING. Параметр игнорируется в Linux.
dwAttrsAndFlags атрибуты и флаги файла. Этот параметр является комбинацией FILE_ATTRIBUTE_NORMAL, FILE_FLAG_OVERLAPPED если используется overlapped I/O, FT_OPEN_BY_SERIAL_NUMBER если pvArg1 серийный номер устройства, и FT_OPEN_BY_DESCRIPTION если pvArg1 описание устройства.
hTemplate этот параметр должен быть NULL.

Возвращаемое значение: если все прошло удачно, то будет возвращен хендл, иначе будет возвращен код ошибки Win32 INVALID_HANDLE_VALUE.

Значение pvArg1 зависит от dwAttrsAndFlags: если там установлены FT_OPEN_BY_SERIAL_NUMBER или FT_OPEN_BY_DESCRIPTION, то pvArg1 содержит указатель на соответствующую null-terminated строку с серийным номером или описанием устройства; если в dwAttrsAndFlags установлен FT_OPEN_BY_LOCATION, то pvArg1 интерпретируется как значение типа long, содержащее location ID устройства.

Параметр dwAccess может быть GENERIC_READ, GENERIC_WRITE или оба сразу; dwShareMode должен быть установлен в 0; lpSecurityAttributes должен быть установлен в NULL; dwCreate должен быть установлен в OPEN_EXISTING; как уже упоминалось, dwAttrsAndFlags является комбинацией FILE_ATTRIBUTE_NORMAL, FILE_FLAG_OVERLAPPED если используется overlapped I/O, FT_OPEN_BY_SERIAL_NUMBER, или FT_OPEN_BY_DESCRIPTION, или FT_OPEN_BY_LOCATION; hTemplate должен быть NULL.

Имейте в виду, что Linux, Mac OS X и Windows CE не поддерживают ни overlapped IO, ни идентификаторы location ID.

Пример 1. Открыть устройство для overlapped I/O по его серийному номеру.

FT_STATUS ftStatus;
FT_HANDLE ftHandle;
char Buf[64];
 
ftStatus = FT_ListDevices(0, Buf, FT_LIST_BY_INDEX|FT_OPEN_BY_SERIAL_NUMBER);
ftHandle = FT_W32_CreateFile(Buf,GENERIC_READ|GENERIC_WRITE,
                             0,
                             0,
                             OPEN_EXISTING,
                             FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED | FT_OPEN_BY_SERIAL_NUMBER,
                             0);
if (ftHandle == INVALID_HANDLE_VALUE) 
   ; // ошибка FT_W32_CreateDevice

Пример 2. Открыть устройство для не overlapped I/O по его описанию.

FT_STATUS ftStatus;
FT_HANDLE ftHandle;
char Buf[64];
 
ftStatus = FT_ListDevices(0, Buf, FT_LIST_BY_INDEX|FT_OPEN_BY_DESCRIPTION);
ftHandle = FT_W32_CreateFile(Buf,
                             GENERIC_READ|GENERIC_WRITE,
                             0,
                             0,
                             OPEN_EXISTING,
                             FILE_ATTRIBUTE_NORMAL | FT_OPEN_BY_DESCRIPTION,
                             0);
if (ftHandle == INVALID_HANDLE_VALUE)
   ; // ошибка FT_W32_CreateDevice

Пример 3. Открыть устройство для не overlapped I/O по его location.

FT_STATUS ftStatus;
FT_HANDLE ftHandle;
char Buf[64];
long locID;
 
ftStatus = FT_ListDevices(0, &locID, FT_LIST_BY_INDEX|FT_OPEN_BY_LOCATION);
ftHandle = FT_W32_CreateFile((PVOID) locID,
                             GENERIC_READ|GENERIC_WRITE,
                             0,
                             0,
                             OPEN_EXISTING,
                             FILE_ATTRIBUTE_NORMAL | FT_OPEN_BY_LOCATION,
                             0);
if (ftHandle == INVALID_HANDLE_VALUE)
   ; // ошибка FT_W32_CreateDevice

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Закрыть указанный хендл устройства.

BOOL FT_W32_CloseHandle (FT_HANDLE ftHandle);

Возвращаемое значение: если все прошло удачно, то будет возвращено ненулевое значение, иначе будет возвращен 0.

Пример ниже показывает, как закрыть устройство после того, как оно было открыто для non-overlapped I/O по описанию устройства.

FT_STATUS ftStatus;
FT_HANDLE ftHandle;char Buf[64];
ftStatus = FT_ListDevices(0, Buf, FT_LIST_BY_INDEX|FT_OPEN_BY_DESCRIPTION);
ftHandle = FT_W32_CreateFile(Buf,
                             GENERIC_READ|GENERIC_WRITE,
                             0,
                             0,
                             OPEN_EXISTING,
                             FILE_ATTRIBUTE_NORMAL | FT_OPEN_BY_DESCRIPTION,
                             0);if (ftHandle == INVALID_HANDLE_VALUE)
{
   // ошибка FT_W32_CreateDevice
}else
{
   // FT_W32_CreateFile OK, так что можно выполнить некую работу,
   // после чего можно закрыть устройство.
   ...
   FT_W32_CloseHandle(ftHandle);
}

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Читает данные из устройства.

BOOL FT_W32_ReadFile (FT_HANDLE ftHandle,
                      LPVOID lpBuffer,
                      DWORD dwBytesToRead,
                      LPDWORD lpdwBytesReturned,
                      LPOVERLAPPED lpOverlapped);

Параметры:

ftHandle хендл устройства.
lpBuffer указатель на буфер, куда поступят принятые данные из устройства.
dwBytesToRead количество байт, которое должно быть прочитано из устройства.
lpdwBytesReturned указатель на переменную, которая примет количество прочитанных из устройства байт.
lpOverlapped указатель на структуру "перекрытия".

Возвращаемое значение: если все прошло удачно, то будет возвращено ненулевое значение, иначе будет возвращен 0.

Эта функция поддерживает как non-overlapped, так и overlapped I/O, за исключением того, что Linux, Mac OS X и Windows CE поддерживают только non-overlapped I/O.

Non-overlapped I/O. Параметр lpOverlapped должен быть NULL.

Функция всегда вернет в lpdwBytesReturned количество прочитанных байт.

Функция не вернет управление, пока в буфер не будет прочитано dwBytesToRead байт. Количество байт в очереди приема может быть определено вызовом FT_GetStatus или FT_GetQueueStatus, и передачей этого количества как dwBytesToRead, чтобы функция прочитала устройство и сразу сделала возврат.

Когда был установлен таймаут чтения предыдущим вызовом FT_W32_SetCommTimeouts, эта функция вернет управление после того, как время таймера истечет, или после того, как будет прочитано dwBytesToRead байт, в зависимости от того, что произойдет раньше. Если произошел таймаут, то любые доступные данные будут прочитаны в lpBuffer, и функция вернет ненулевое значение.

При обработке буфера приложение должно использовать значение возврата функции и lpdwBytesReturned. Если возвращенное значение не 0 (успешный возврат), и lpdwBytesReturned равно dwBytesToRead, то было нормальное завершение. Если же возвращенное значение не 0 (успешный возврат), и lpdwBytesReturned меньше, чем dwBytesToRead, то это означает, что истек таймаут, и запрос чтения был выполнен только частично. Имейте в виду, что если произошел таймаут, и не было прочитано никаких данных, то возвращенное значение все равно будет ненулевым.

Возвращенное значение FT_IO_ERROR говорит об ошибке в параметрах функции, или фатальной ошибке наподобие отключения от USB.

Overlapped I/O. Когда устройство открыто для overlapped I/O, приложение может выставить запрос, и продолжать выполнять некую дополнительную работу, пока запрос выполняется. Это отличается от non-overlapped I/O, когда приложение выдает запрос, и возвратит управление только после того, как будет выполнен запрос.

В параметре lpOverlapped должен быть указатель на инициализированную структуру OVERLAPPED.

Если в очереди приема находится достаточное количество данных, удовлетворяющее запросу, то запрос завершится немедленно и код возврата будет ненулевым. Количество прочитанных байт будет возвращено в lpdwBytesReturned.

Если данных на приеме недостаточно для удовлетворения запросу, то запрос завершается немедленно, и код возврата будет 0, что сигнализирует об ошибке. Приложение должно вызвать FT_W32_GetLastError, чтобы разобраться в причине ошибки. Если код ошибки ERROR_IO_PENDING, то сейчас выполняется overlapped-операция, и приложение может пока заняться другой работой. Время от времени приложение должно проверять результат overlapped-запроса вызовом FT_W32_GetOverlappedResult.

В случае успеха количество прочитанных байт будет возвращено в lpdwBytesReturned.

Пример 1. Здесь показано, как прочитать 256 байт из устройства, используя non-overlapped I/O.

FT_HANDLE ftHandle;  // переменная настроена через FT_W32_CreateFile для non-overlapped I/O
char Buf[256];
DWORD dwToRead = 256;
DWORD dwRead;
 
if (FT_W32_ReadFile(ftHandle, Buf, dwToRead, &dwRead, &osRead))
{
   if (dwToRead == dwRead)
   {
      // FT_W32_ReadFile OK
   }
   else
   {
      // таймаут FT_W32_ReadFile
   }
}
else
{
   // ошибка FT_W32_ReadFile
}

Пример 2. Здесь показано, как прочитать 256 байт из устройства, используя overlapped I/O.

FT_HANDLE ftHandle;  // переменная настроена через FT_W32_CreateFile для overlapped I/Ochar Buf[256];
DWORD dwToRead = 256;
DWORD dwRead;
OVERLAPPED osRead = { 0 };
 
osRead.hEvent = CreateEvent (NULL, FALSE, FALSE, NULL);
if (!FT_W32_ReadFile(ftHandle, Buf, dwToRead, &dwRead, &osRead))
{
   if (FT_W32_GetLastError(ftHandle) == ERROR_IO_PENDING)
   {
      // чтение отложено, так что можно пока делать что-то еще
      ...
      if (!FT_W32_GetOverlappedResult(ftHandle, &osRead, &dwRead, FALSE))
      {
         // ошибка
      }
      else
      {
         if (dwToRead == dwRead)
         {
            // FT_W32_ReadFile OK
         }
         else
         {
            // таймаут FT_W32_ReadFile
         }
      }
   }
}
else
{
   // FT_W32_ReadFile OK
}
CloseHandle (osRead.hEvent);

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Записывает данные в устройство.

BOOL FT_W32_WriteFile (FT_HANDLE ftHandle,
                       LPVOID lpBuffer,
                       DWORD dwBytesToWrite,
                       LPDWORD lpdwBytesWritten,
                       LPOVERLAPPED lpOverlapped);

Параметры:

ftHandle хендл устройства.
lpBuffer указатель на буфер, где содержатся данные для записи в устройство.
dwBytesToWrite количество байт, которое нужно записать в устройство.
lpdwBytesWritten указатель на переменную, которая примет количество записанных байт в устройство.
lpOverlapped указатель на структуру перекрытия.

Возвращаемое значение: если все прошло удачно, то будет возвращено ненулевое значение, иначе будет возвращен 0.

Эта функция поддерживает как non-overlapped, так и overlapped I/O, за исключением того, что Linux, Mac OS X и Windows CE поддерживают только non-overlapped I/O.

Non-overlapped I/O. Параметр lpOverlapped должен быть NULL.

Функция всегда вернет в lpdwBytesWritten количество записанных байт.

Функция не вернет управление, пока в устройство не будет записано dwBytesToRead байт.

Когда был установлен таймаут записи предыдущим вызовом FT_W32_SetCommTimeouts, эта функция вернет управление после того, как время таймера истечет, или после того, как будет записано dwBytesToWrite байт, в зависимости от того, что произойдет раньше. Если произошел таймаут, то количество записанных байт будет помещено в lpdwBytesWritten, и функция вернет ненулевое значение.

Приложение должно всегда использовать значение возврата функции и lpdwBytesWritten. Если возвращенное значение не 0 (успешный возврат), и lpdwBytesWritten равно dwBytesToWrite, то было нормальное завершение. Если же возвращенное значение не 0 (успешный возврат), и lpdwBytesWritten меньше, чем dwBytesToWrite, то это означает, что истек таймаут, и запрос записи был выполнен только частично. Имейте в виду, что если произошел таймаут, и не было записано никаких данных, то возвращенное значение все равно будет ненулевым.

Overlapped I/O. Когда устройство открыто для overlapped I/O, приложение может выставить запрос, и продолжать выполнять некую дополнительную работу, пока запрос выполняется. Это отличается от non-overlapped I/O, когда приложение выдает запрос, и возвратит управление только после того, как будет выполнен запрос.

В параметре lpOverlapped должен быть указатель на инициализированную структуру OVERLAPPED.

Если в очереди приема находится достаточное количество данных, удовлетворяющее запросу, то запрос завершится немедленно и код возврата будет ненулевым. Количество прочитанных байт будет возвращено в lpdwBytesReturned.

Если функция завершается немедленно, и код возврата будет 0, что сигнализирует об ошибке. Приложение должно вызвать FT_W32_GetLastError, чтобы разобраться в причине ошибки. Если код ошибки ERROR_IO_PENDING, то сейчас выполняется overlapped-операция, и приложение может пока заняться другой работой. Время от времени приложение должно проверять результат overlapped-запроса вызовом FT_W32_GetOverlappedResult.

В случае успеха количество записанных байт будет возвращено в lpdwBytesWritten.

Пример 1. Здесь показано, как записать в устройство 128 байт, используя non-overlapped I/O.

FT_HANDLE ftHandle; // переменная настроена вызовом FT_W32_CreateFile для non-overlapped I/O
char Buf[128];      // содержит данные для записи в устройство
DWORD dwToWrite = 128;
DWORD dwWritten;
 
if (FT_W32_WriteFile(ftHandle, Buf, dwToWrite, &dwWritten, &osWrite))
{
   if (dwToWrite == dwWritten)
   {
      // FT_W32_WriteFile OK
   }
   else
   {
      // таймаут FT_W32_WriteFile
   }
}
else
{
   // ошибка FT_W32_WriteFile
}

Пример 2. Здесь показано, как записать в устройство 128 байт, используя overlapped I/O.

FT_HANDLE ftHandle; // переменная настроена вызовом FT_W32_CreateFile для overlapped I/O
char Buf[128];      // содержит данные для записи в устройство
DWORD dwToWrite = 128;
DWORD dwWritten;
OVERLAPPED osWrite = { 0 };
 
if (!FT_W32_WriteFile(ftHandle, Buf, dwToWrite, &dwWritten, &osWrite))
{
   if (FT_W32_GetLastError(ftHandle) == ERROR_IO_PENDING)
   {
      // запись отложена так что можно пока делать другую работу
      ...
      if (!FT_W32_GetOverlappedResult(ftHandle, &osWrite, &dwWritten, FALSE))
      {
         // ошибка
      }
      else
      {
         if (dwToWrite == dwWritten)
         {
            // FT_W32_WriteFile OK
         }
         else
         {
            // таймаут FT_W32_WriteFile
         }
      }
   }
}
else
{
   // FT_W32_WriteFIle OK
}

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Запрашивает результат overlapped-операции.

BOOL FT_W32_GetOverlappedResult (FT_HANDLE ftHandle,
                                 LPOVERLAPPED lpOverlapped,
                                 LPDWORD lpdwBytesTransferred,
                                 BOOL bWait);

Параметры:

ftHandle хендл к устройству.
lpOverlapped указатель на overlapped структуру.
lpdwBytesTransferred указатель на переменную, которая примет количество переданных байт за время overlapped-операции.
bWait устанавливается в TRUE, если функция не должна сделать возврат, пока не завершит работу.

Возвращаемое значение: если все прошло удачно, то будет возвращено ненулевое значение, иначе будет возвращен 0.

Эта функция используется для overlapped I/O, и она не поддерживается в Linux, Mac OS X или Windows CE. Примеры использования см. в описаниях функций FT_W32_ReadFile и FT_W32_WriteFile.

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Выполняет дополнительные функции на последовательном порте.

BOOL FT_W32_EscapeCommFunction (FT_HANDLE ftHandle, DWORD dwFunc);

Параметры:

ftHandle хендл устройства.
dwFunc расширенная функция, которая может принимать одно из следующих значений:

         CLRDTR – очистка сигнала DTR
         CLRRTS – очистка сигнала RTS
         SETDTR – установка сигнала DTR
         SETRTS – установка сигнала RTS
         SETBREAK – установка события BREAK
         CLRBREAK – очистка события BREAK

Возвращаемое значение: если все прошло удачно, то будет возвращено ненулевое значение, иначе будет возвращен 0.

Пример:

FT_HANDLE ftHandle; // настроено вызовом FT_W32_CreateFile
 
FT_W32_EscapeCommFunction(ftHandle, CLRDTS); // сброс DTR в лог. 0
FT_W32_EscapeCommFunction(ftHandle, SETRTS); // установка RTS в лог. 1

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Функция запрашивает текущее значения сигналов управления модема.

BOOL FT_W32_GetCommModemStatus (FT_HANDLE ftHandle, LPDWORD lpdwStat);

Параметры:

ftHandle хендл устройства.
lpdwStat указатель на переменную, которая примет значения сигналов управления модема (modem control. Значение modem control может быть комбинацией следующих сигналов:   

         MS_CTS_ON – Clear To Send (CTS) в лог. 1
         MS_DSR_ON – Data Set Ready (DSR) в лог. 1
         MS_RING_ON – Ring Indicator (RI) в лог. 1
         MS_RLSD_ON – Receive Line Signal Detect (RLSD) в лог. 1

Возвращаемое значение: если все прошло удачно, то будет возвращено ненулевое значение, иначе будет возвращен 0.

Пример:

FT_HANDLE ftHandle; // настроено вызовом FT_W32_CreateFile
DWORD dwStatus;
 
if (FT_W32_GetCommModemStatus(ftHandle, &dwStatus))
{
   // FT_W32_GetCommModemStatus ok
   if (dwStatus & MS_CTS_ON) 
      ; // CTS == 1
   if (dwStatus & MS_DSR_ON)
      ; // DSR == 1
   if (dwStatus & MS_RI_ON)
      ; // RI == 1
   if (dwStatus & MS_RLSD_ON)
      ; // RLSD == 1
}
else
   ; // ошибка FT_W32_GetCommModemStatus

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Функция устанавливает буферы чтения и записи.

BOOL FT_W32_SetupComm (FT_HANDLE ftHandle,
                       DWORD dwReadBufferSize,
                       DWORD dwWriteBufferSize);

Параметры:

ftHandle хендл устройства.
dwReadBufferSize длина буфера чтения в байтах.
dwWriteBufferSize длина буфера записи в байтах.

Возвращаемое значение: если все прошло удачно, то будет возвращено ненулевое значение, иначе будет возвращен 0.

Функция не дает никакого эффекта. В зоне ответственности драйвера выделить достаточно места для обслуживания запросов I/O.

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Эта функция устанавливает состояние устройства в соответствии с содержимым блока управления устройством (device control block, DCB).

BOOL FT_W32_SetCommState (FT_HANDLE ftHandle, LPFTDCB lpftDcb);

Параметры:

ftHandle хендл устройства.
lpftDcb указатель на структуру FTDCB.

Возвращаемое значение: если все прошло удачно, то будет возвращено ненулевое значение, иначе будет возвращен 0.

Пример изменения скорости устройства через DCB:

FT_HANDLE ftHandle; // настроено вызовом FT_W32_CreateFile
FTDCB ftDCB;
 
if (FT_W32_GetCommState(ftHandle, &ftDCB))
{
   // FT_W32_GetCommState ok, состояние устройства находится в ftDCB
   ftDCB.BaudRate = 921600; // изменение скорости
   if (FT_W32_SetCommState(ftHandle,&ftDCB))
      ; // FT_W32_SetCommState ok
   else
      ; // ошибка FT_W32_SetCommState
}
else
   ; // ошибка FT_W32_GetCommState

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Функция запрашивает текущее состояние устройства.

BOOL FT_W32_GetCommState (FT_HANDLE ftHandle, LPFTDCB lpftDcb);

Параметры:

ftHandle хендл устройства.
lpftDcb указатель на структуру FTDCB.

Возвращаемое значение: если все прошло удачно, то будет возвращено ненулевое значение, иначе будет возвращен 0.

Текущее состояние устройства (его настройки) будет возвращено в структуре device control block (DCB).

Пример использования см. в описании функции FT_W32_SetCommState.

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Функция устанавливает параметры таймаута для запросов ввода/вывода (I/O).

BOOL FT_W32_SetCommTimeouts (FT_HANDLE ftHandle, LPFTTIMEOUTS lpftTimeouts);

Параметры:

ftHandle хендл устройства.
lpftTimeouts указатель на структуру FTTIMEOUTS, где имеется информация таймаута.

Возвращаемое значение: если все прошло удачно, то будет возвращено ненулевое значение, иначе будет возвращен 0.

Таймауты вычисляются с использованием информации в структуре FTTIMEOUTS.

Для запросов чтения количество байт для чтения умножается на общий множитель таймаута, и к этому добавляется общая константа таймаута. Таким образом, если TS это структура FTTIMEOUTS, и количество байт для чтения это dwToRead, то таймаут чтения rdTO вычисляется по следующему выражению:

rdTO = (dwToRead * TS.ReadTotalTimeoutMultiplier) + TS.ReadTotalTimeoutConstant

Для запросов записи количество записываемых байт умножается на общий множитель таймаута, и к этому добавляется общая константа таймаута. Таким образом, если TS это структура FTTIMEOUTS, и количество байт для записи это dwToWrite, то таймаут записи wrTO вычисляется по следующему выражению:

wrTO = (dwToWrite * TS.WriteTotalTimeoutMultiplier) + TS.WriteTotalTimeoutConstant

Linux и Mac OS X в настоящее время игнорируют ReadIntervalTimeout, ReadTotalTimeoutMultiplier и WriteTotalTimeoutMultiplier.

Пример:

FT_HANDLE ftHandle; // настроено вызовом FT_W32_CreateFile
FTTIMEOUTS ftTS;
 
ftTS.ReadIntervalTimeout = 0;
ftTS.ReadTotalTimeoutMultiplier = 0;
ftTS.ReadTotalTimeoutConstant = 100;
ftTS.WriteTotalTimeoutMultiplier = 0;
ftTS.WriteTotalTimeoutConstant = 200;
 
if (FT_W32_SetCommTimeouts(ftHandle, &ftTS))
   ; // FT_W32_SetCommTimeouts OK
else
   ; // ошибка FT_W32_SetCommTimeouts

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Функция получает текущие таймауты запросов чтения и записи для указанного устройства.

BOOL FT_W32_GetCommTimeouts (FT_HANDLE ftHandle, LPFTTIMEOUTS lpftTimeouts);

Параметры:

ftHandle хендл устройства.
lpftTimeouts указатель на структуру FTTIMEOUTS, куда будет сохранена информация таймаута.

Возвращаемое значение: если все прошло удачно, то будет возвращено ненулевое значение, иначе будет возвращен 0.

Смысл этой функции будет понятен, если прочитать описание функции FT_W32_SetCommTimeouts.

Пример:

FT_HANDLE ftHandle; // настроено вызовом FT_W32_CreateFile
FTTIMEOUTS ftTS;
 
if (FT_W32_GetCommTimeouts(ftHandle, &ftTS))
   ; // FT_W32_GetCommTimeouts OK
else
   ; // ошибка FT_W32_GetCommTimeouts

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Переводит линию соединения в состояние BREAK.

BOOL FT_W32_SetCommBreak (FT_HANDLE ftHandle);

Параметры:

ftHandle хендл устройства.

Возвращаемое значение: если все прошло удачно, то будет возвращено ненулевое значение, иначе будет возвращен 0.

Пример:

FT_HANDLE ftHandle; // настроено вызовом FT_W32_CreateFile
 
if (!FT_W32_SetCommBreak(ftHandle))
   ; // ошибка FT_W32_SetCommBreak
else
   ; // FT_W32_SetCommBreak OK

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Переводит линию соединения в состояние non-BREAK.

BOOL FT_W32_ClearCommBreak (FT_HANDLE ftHandle);

Параметры:

ftHandle хендл устройства.

Возвращаемое значение: если все прошло удачно, то будет возвращено ненулевое значение, иначе будет возвращен 0.

Пример:

FT_HANDLE ftHandle; // настроено вызовом FT_W32_CreateFile
 
if (!FT_W32_ClearCommBreak(ftHandle))
   ; // ошибка FT_W32_ClearCommBreak
else
   ; // FT_W32_ClearCommBreak OK

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Функция задает события, на которые устройство должно реагировать.

BOOL FT_W32_SetCommMask (FT_HANDLE ftHandle, DWORD dwMask);

Параметры:

ftHandle хендл устройства.
dwMask маска, определяющая события, которые устройство должно мониторить. Здесь может быть ИЛИ-комбинация следующих констант:

         EV_BREAK – BREAK condition (событие останова потока на линии)
         EV_CTS – поменялся сигнал Clear To Send (CTS)
         EV_DSR – поменялся сигнал Data Set Ready (DSR)
         EV_ERR – ошибка в состоянии линии
         EV_RING – поменялся сигнал Ring Indicator (RI)
         EV_RLSD – поменялся сигнал Receive Line Signal Detect (RLSD)
         EV_RXCHAR – принят символ
         EV_RXFLAG – событие приема символа
         EV_TXEMPTY – передатчик пуст

Возвращаемое значение: если все прошло удачно, то будет возвращено ненулевое значение, иначе будет возвращен 0.

Функция настраивает события, которые должны отслеживаться устройством. Приложение может вызвать функцию FT_W32_WaitCommEvent, чтобы ждать наступление события.

Пример:

FT_HANDLE ftHandle; // настроено вызовом FT_W32_CreateFile
DWORD dwMask = EV_CTS | EV_DSR;
 
if (!FT_W32_SetCommMask(ftHandle, dwMask))
   ; // ошибка FT_W32_SetCommMask
else
   ; // FT_W32_SetCommMask OK

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Запрашивает события, которые в настоящий момент отслеживает устройство.

BOOL FT_W32_GetCommMask (FT_HANDLE ftHandle, LPDWORD lpdwEventMask);

Параметры:

ftHandle хендл устройства.
lpdwEventMask указатель на ячейку памяти DWORD, в которую будет записана маска, определяющая отслеживаемые события, которые в настоящий момент разрешены для мониторинга устройством. Маска может состоять из ИЛИ-комбинации одной или нескольких констант:

         EV_BREAK – BREAK condition (событие останова потока на линии)
         EV_CTS – поменялся сигнал Clear To Send (CTS)
         EV_DSR – поменялся сигнал Data Set Ready (DSR)
         EV_ERR – ошибка в состоянии линии
         EV_RING – поменялся сигнал Ring Indicator (RI)
         EV_RLSD – поменялся сигнал Receive Line Signal Detect (RLSD)
         EV_RXCHAR – принят символ
         EV_RXFLAG – событие приема символа
         EV_TXEMPTY – передатчик пуст

Возвращаемое значение: если все прошло удачно, то будет возвращено ненулевое значение, иначе будет возвращен 0.

Вызовом этой функции можно узнать, наступление каких событий отслеживает устройство. Мониторинг этих событий ранее был разрешен вызовом функции FT_W32_SetCommMask.

Пример:

FT_HANDLE ftHandle; // настроено вызовом FT_W32_CreateFile
DWORD dwMask;
 
if (!FT_W32_GetCommMask(ftHandle, &dwMask))
   ; // ошибка FT_W32_GetCommMask
else
   ; // FT_W32_GetCommMask OK

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Функция ждет наступления события.

BOOL FT_W32_WaitCommEvent (FT_HANDLE ftHandle,
                           LPDWORD lpdwEvent,
                           LPOVERLAPPED lpOverlapped);

Параметры:

ftHandle хендл устройства.
lpdwEvent указатель на ячейку памяти, содержащую маску случившихся событий.
lpOverlapped указатель на структуру overlapped.

Возвращаемое значение: если все прошло удачно, то будет возвращено ненулевое значение, иначе будет возвращен 0.

Функция поддерживает как non-overlapped, так и overlapped I/O, за исключением Windows CE и Linux, которые поддерживают только non-overlapped I/O.

Non-overlapped I/O. В этом случае параметр lpOverlapped должен быть равен NULL.

Функция не вернет управление, пока не произойдет событие, заданное предыдущим вызовом FT_W32_SetCommMask. События, которые произошли, будут возвращены этой функцией в ячейке, на которую указывает lpdwEvent.

Overlapped I/O. Когда устройство было открыто для overlapped I/O, приложение может выставить запрос и далее без остановки выполнять какую-то другую работу, пока запрос выполняется. Это отличается от случая non-overlapped I/O, когда приложение выставляет запрос, и возвращает управление в приложение только после завершения запроса (наступления события).

Параметр lpOverlapped должен указывать на инициализированную структуру OVERLAPPED.

Если событие, которое было ранее задано вызовом FT_W32_SetCommMask, уже произошло, то запрос будет выполнен немедленно, и код возврата будет ненулевым. Произошедшие события можно определить по значению, сохраненному в lpdwEvent.

Если событие пока еще не произошло, то запрос все равно завершится немедленно, к код возврата будет 0, что сигнализирует об ошибке. В этом случае приложение должно вызвать FT_W32_GetLastError, чтобы определить вид ошибки. Если код ошибки ERROR_IO_PENDING, то overlapped-операция все еще выполняется, и приложение может выполнять другую работу. Периодически приложение проверяет результат overlapped-запроса, вызывая FT_W32_GetOverlappedResult. События, которые произошли, в результате будут возвращены и сохранены в lpdwEvent.

Пример 1. Этот пример показывает, как записать 128 байт, используя non-overlapped I/O.

FT_HANDLE ftHandle; // настроено вызовом FT_W32_CreateFile для non-overlapped I/O
DWORD dwEvents;
 
if (FT_W32_WaitCommEvent(ftHandle, &dwEvents, NULL))
   ; // FT_W32_WaitCommEvents OK
else
   ; // ошибка FT_W32_WaitCommEvents

Пример 2. Этот пример показывает, как записать 128 байт, используя overlapped I/O.

FT_HANDLE ftHandle; // настроено вызовом FT_W32_CreateFile для overlapped I/O
DWORD dwEvents;
DWORD dwRes;
OVERLAPPED osWait = { 0 };
 
if (!FT_W32_WaitCommEvent(ftHandle, &dwEvents, &osWait))
{
   if (FT_W32_GetLastError(ftHandle == ERROR_IO_PENDING)
   {
      // запрос выставлен, но пока тне завершился, так что 
      // можно выполнять какую-то другую работу
      ...
      if (!FT_W32_GetOverlappedResult(ftHandle, &osWait, &dwRes, FALSE))
         ; // ошибка
      else
         ; // FT_W32_WaitCommEvent OK
      // События, которые произошли, сохранены как маска в dwEvents
   }
}
else
{
   // FT_W32_WaitCommEvent OK
   // События, которые произошли, сохранены как маска в dwEvents
}

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Функция очищает устройство.

BOOL FT_W32_PurgeComm (FT_HANDLE ftHandle, DWORD dwFlags);

Параметры:

ftHandle хендл устройства.
dwFlags указывает производимое действие. Может быть ИЛИ-комбинацией следующих констант:

      PURGE_TXABORT – оборвать текущие overlapped-записи
      PURGE_RXABORT – оборвать текущие overlapped-чтения
      PURGE_TXCLEAR – очистить буфер передачи
      PURGE_RXCLEAR – очистить буфер приема

Возвращаемое значение: если все прошло удачно, то будет возвращено ненулевое значение, иначе будет возвращен 0.

Пример:

FT_HANDLE ftHandle; // настроено вызовом FT_W32_CreateFile
 
if (FT_W32_PurgeComm(ftHandle, PURGE_TXCLEAR|PURGE_RXCLEAR))
   ; // FT_W32_PurgeComm OK
else
   ; // ошибка FT_W32_PurgeComm

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Получает информацию об ошибке, которая произошла с устройством.

DWORD FT_W32_GetLastError (FT_HANDLE ftHandle);

Параметры:

ftHandle хендл устройства.

Возвращаемое значение: если все прошло удачно, то будет возвращено ненулевое значение, иначе будет возвращен 0.

Это функция обычно используется для overlapped I/O, и не поддерживается в Windows CE. Как использовать функцию, см. примеры кода для FT_W32_ReadFile и FT_W32_WriteFile. В Linux и Mac OS X эта функция вернет DWORD, который напрямую привязан к FT Errors (например номер ошибки FT_INVALID_HANDLE).

Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).

Получает информацию об ошибке обмена и текущее состояние устройства.

BOOL FT_W32_ClearCommError (FT_HANDLE ftHandle,
                            LPDWORD lpdwErrors,
                            LPFTCOMSTAT lpftComstat);

Параметры:

ftHandle хендл устройства.
lpdwErrors указатель на переменную, которая содержит маску ошибки.
lpftComstat указатель на структуру FTCOMSTAT.

Возвращаемое значение: если все прошло удачно, то будет возвращено ненулевое значение, иначе будет возвращен 0.

Пример:

static COMSTAT oldCS = {0};
static DWORD dwOldErrors = 0;
FT_HANDLE ftHandle; // настроено вызовом FT_W32_CreateFile
COMSTAT newCS;
DWORD dwErrors;
BOOL bChanged = FALSE;
 
if (!FT_W32_ClearCommError(ftHandle, &dwErrors, (FTCOMSTAT *)&newCS))
   ; // ошибка FT_W32_ClearCommError
 
if (dwErrors != dwOldErrors)
{
   bChanged = TRUE;
   dwErrorsOld = dwErrors;
}
 
if (memcmp(&oldCS, &newCS, sizeof(FTCOMSTAT)))
{
   bChanged = TRUE;
   oldCS = newCS;
}
 
if (bChanged)
{
   if (dwErrors & CE_BREAK)
      ; // детектировано событие останова (BREAK condition)
   if (dwErrors & CE_FRAME)
      ; // детектирована ошибка фрейма
   if (dwErrors & CE_RXOVER)
      ; // переполнение буфера приема
   if (dwErrors & CE_TXFULL)
      ; // буфер передачи заполнен
   if (dwErrors & CE_OVERRUN)
      ; // переполнение буфера символа
   if (dwErrors & CE_RXPARITY)
      ; // детектирована ошибка четности
   if (newCS.fCtsHold)
      ; // передатчик ждет CTS
   if (newCS.fDsrHold)
      ; // передатчик ждет DSR
   if (newCS.fRlsdHold)
      ; // передатчик ждет RLSD
   if (newCS.fXoffHold)
      ; // передатчик ждет, потому что был принят XOFF
   if (newCS.fXoffSent)
      ; // был отправлен XOFF
   if (newCS.fEof)
      ; // принят символ конца файла (End of file, EOF)
   if (newCS.fTxim)
      ; // символ непосредственно поставлен в очередь передачи
   // newCS.cbInQue содержит количество байт в очереди приема
   // newCS.cbOutQue содержит количество байт в очереди передачи
}

[Appendix A – Type Definitions (определения типов)]

UCHAR unsigned char (1 байт)
PUCHAR указатель на unsigned char (4 байта)
PCHAR указатель на char (4 байта)
DWORD unsigned long (4 байта)
LPDWORD указатель на unsigned long (4 байта)
FT_HANDLE DWORD 

   FT_OK                            = 0
   FT_INVALID_HANDLE                = 1
   FT_DEVICE_NOT_FOUND              = 2
   FT_DEVICE_NOT_OPENED             = 3
   FT_IO_ERROR                      = 4
   FT_INSUFFICIENT_RESOURCES        = 5
   FT_INVALID_PARAMETER             = 6
   FT_INVALID_BAUD_RATE             = 7
   FT_DEVICE_NOT_OPENED_FOR_ERASE   = 8
   FT_DEVICE_NOT_OPENED_FOR_WRITE   = 9
   FT_FAILED_TO_WRITE_DEVICE        = 10
   FT_EEPROM_READ_FAILED            = 11
   FT_EEPROM_WRITE_FAILED           = 12
   FT_EEPROM_ERASE_FAILED           = 13
   FT_EEPROM_NOT_PRESENT            = 14
   FT_EEPROM_NOT_PROGRAMMED         = 15
   FT_INVALID_ARGS                  = 16
   FT_NOT_SUPPORTED                 = 17
   FT_OTHER_ERROR                   = 18

   FT_LIST_NUMBER_ONLY              = 0x80000000
   FT_LIST_BY_INDEX                 = 0x40000000
   FT_LIST_ALL                      = 0x20000000

   FT_OPEN_BY_SERIAL_NUMBER         = 1
   FT_OPEN_BY_DESCRIPTION           = 2
   FT_OPEN_BY_LOCATION              = 4

   FT_DEVICE_232BM      = 0
   FT_DEVICE_232AM      = 1
   FT_DEVICE_100AX      = 2
   FT_DEVICE_UNKNOWN    = 3
   FT_DEVICE_2232C      = 4
   FT_DEVICE_232R       = 5
   FT_DEVICE_2232H      = 6
   FT_DEVICE_4232H      = 7
   FT_DEVICE_232H       = 8
   FT_DEVICE_X_SERIES   = 9

   FT_DRIVER_TYPE_D2XX  = 0
   FT_DRIVER_TYPE_VCP   = 1

   FT_STOP_BITS_1 = 0
   FT_STOP_BITS_2 = 2

   FT_PARITY_NONE    = 0
   FT_PARITY_ODD     = 1
   FT_PARITY_EVEN    = 2
   FT_PARITY_MARK    = 3
   FT_PARITY_SPACE   = 4

   FT_FLOW_NONE      = 0x0000
   FT_FLOW_RTS_CTS   = 0x0100
   FT_FLOW_DTR_DSR   = 0x0200
   FT_FLOW_XON_XOFF  = 0x0400

   FT_EVENT_RXCHAR         = 1
   FT_EVENT_MODEM_STATUS   = 2
   FT_EVENT_LINE_STATUS    = 4

   FT_BITMODE_RESET           = 0x00
   FT_BITMODE_ASYNC_BITBANG   = 0x01
   FT_BITMODE_MPSSE           = 0x02
   FT_BITMODE_SYNC_BITBANG    = 0x04
   FT_BITMODE_MCU_HOST        = 0x08
   FT_BITMODE_FAST_SERIAL     = 0x10
   FT_BITMODE_CBUS_BITBANG    = 0x20
   FT_BITMODE_SYNC_FIFO       = 0x40

Эти опции игнорируются для FT245R.

   FT_232R_CBUS_TXDEN      = 0x00
   FT_232R_CBUS_PWRON      = 0x01
   FT_232R_CBUS_RXLED      = 0x02
   FT_232R_CBUS_TXLED      = 0x03
   FT_232R_CBUS_TXRXLED    = 0x04
   FT_232R_CBUS_SLEEP      = 0x05
   FT_232R_CBUS_CLK48      = 0x06
   FT_232R_CBUS_CLK24      = 0x07
   FT_232R_CBUS_CLK12      = 0x08
   FT_232R_CBUS_CLK6       = 0x09
   FT_232R_CBUS_IOMODE     = 0x0A
   FT_232R_CBUS_BITBANG_WR = 0x0B
   FT_232R_CBUS_BITBANG_RD = 0x0C

   FT_232H_CBUS_TRISTATE   = 0x00
   FT_232H_CBUS_RXLED      = 0x01
   FT_232H_CBUS_TXLED      = 0x02
   FT_232H_CBUS_TXRXLED    = 0x03
   FT_232H_CBUS_PWREN      = 0x04
   FT_232H_CBUS_SLEEP      = 0x05
   FT_232H_CBUS_DRIVE_0    = 0x06
   FT_232H_CBUS_DRIVE_1    = 0x07
   FT_232H_CBUS_IOMODE     = 0x08
   FT_232H_CBUS_TXDEN      = 0x09
   FT_232H_CBUS_CLK30      = 0x0A
   FT_232H_CBUS_CLK15      = 0x0B
   FT_232H_CBUS_CLK7_5     = 0x0C

   FT_X_SERIES_CBUS_TRISTATE        = 0x00
   FT_X_SERIES_CBUS_RXLED           = 0x01
   FT_X_SERIES_CBUS_TXLED           = 0x02
   FT_X_SERIES_CBUS_TXRXLED         = 0x03
   FT_X_SERIES_CBUS_PWREN           = 0x04
   FT_X_SERIES_CBUS_SLEEP           = 0x05
   FT_X_SERIES_CBUS_DRIVE_0         = 0x06
   FT_X_SERIES_CBUS_DRIVE_1         = 0x07
   FT_X_SERIES_CBUS_IOMODE          = 0x08
   FT_X_SERIES_CBUS_TXDEN           = 0x09
   FT_X_SERIES_CBUS_CLK24           = 0x0A
   FT_X_SERIES_CBUS_CLK12           = 0x0B
   FT_X_SERIES_CBUS_CLK6            = 0x0C
   FT_X_SERIES_CBUS_BCD_CHARGER     = 0x0D
   FT_X_SERIES_CBUS_BCD_CHARGER_N   = 0x0E
   FT_X_SERIES_CBUS_I2C_TXE         = 0x0F
   FT_X_SERIES_CBUS_I2C_RXF         = 0x10
   FT_X_SERIES_CBUS_VBUS_SENSE      = 0x11
   FT_X_SERIES_CBUS_BITBANG_WR      = 0x12
   FT_X_SERIES_CBUS_BITBANG_RD      = 0x13
   FT_X_SERIES_CBUS_TIMESTAMP       = 0x14
   FT_X_SERIES_CBUS_KEEP_AWAKE      = 0x15

typedef struct _ft_device_list_info_node
{
   DWORD Flags;
   DWORD Type;
   DWORD ID;
   DWORD LocId;
   char SerialNumber[16];
   char Description[64];
   FT_HANDLE ftHandle;
} FT_DEVICE_LIST_INFO_NODE;

   FT_FLAGS_OPENED = 0x00000001

typedef struct ft_program_data
{
   DWORD Signature1;    // заголовок - тут должно быть 0x0000000
   DWORD Signature2;    // заголовок - тут должно быть 0xffffffff
   DWORD Version;       // заголовок - версия FT_PROGRAM_DATA 
                        // 0 = оригинальная версия (FT232B)
                        // 1 = расширения FT2232
                        // 2 = расширения FT232R
                        // 3 = расширения FT2232H
                        // 4 = расширения FT4232H
                        // 5 = расширения FT232H
   WORD VendorId;       // 0x0403
   WORD ProductId;      // 0x6001
   char *Manufacturer;  // "FTDI"
   char *ManufacturerId; // "FT"
   char *Description;   // "USB HS Serial Converter"
   char *SerialNumber;  // "FT000001" если фиксировано, или NULL
   WORD MaxPower;       // 0 < MaxPower < = 500
   WORD PnP;            // 0 = запрещено, 1 = разрешено
   WORD SelfPowered;    // 0 = питание от шины USB, 1 = свой источник питания
   WORD RemoteWakeup;   // 0 = не применимо, 1 = применимо
   //
   // Расширения для Rev4 (FT232B)
   //
   UCHAR Rev4;          // не 0, если чип Rev4, иначе 0
   UCHAR IsoIn;         // не 0, если IN endpoint изохронная
   UCHAR IsoOut;        // не 0, если OUT endpoint изохронная
   UCHAR PullDownEnable;// не 0, если разрешен pull down
   UCHAR SerNumEnable;  // не 0, если используется серийный номер
   UCHAR USBVersionEnable; // не 0, если чип использует USBVersion
   WORD USBVersion;     // BCD (0x0200 => USB2)
   //
   // Расшинения для Rev 5 (FT2232)
   //
   UCHAR Rev5;          // не 0, если чип Rev5, иначе 0
   UCHAR IsoInA;        // не 0, если IN endpoint изохронная
   UCHAR IsoInB;        // не 0, если IN endpoint изохронная
   UCHAR IsoOutA;       // не 0, если OUT endpoint изохронная
   UCHAR IsoOutB;       // не 0, если OUT endpoint изохронная
   UCHAR PullDownEnable5; // не 0, если разрешен pull down
   UCHAR SerNumEnable5; // не 0, если используется серийный номер
   UCHAR USBVersionEnable5; // не 0, если чип использует USBVersion
   WORD USBVersion5;    // BCD (0x0200 => USB2)
   UCHAR AIsHighCurrent; // не 0, если интерфейс с высокой нагрузочной способностью (high current)
   UCHAR BIsHighCurrent; // не 0, если интерфейс с высокой нагрузочной способностью (high current)
   UCHAR IFAIsFifo;     // не 0, если интерфейс 245 FIFO
   UCHAR IFAIsFifoTar;  // не 0, если интерфейс 245 FIFO CPU target
   UCHAR IFAIsFastSer;  // не 0, если интерфейс Fast serial
   UCHAR AIsVCP;        // не 0, если интерфейс использует драйверы VCP
   UCHAR IFBIsFifo;     // не 0, если интерфейс 245 FIFO
   UCHAR IFBIsFifoTar;  // не 0, если интерфейс 245 FIFO CPU target
   UCHAR IFBIsFastSer;  // не 0, если интерфейс Fast serial
   UCHAR BIsVCP;        // не 0, если интерфейс использует драйверы VCP
   //
   // Расшинения для Rev 6 (FT232R)
   //
   UCHAR UseExtOsc;     // используется внешний генератор
   UCHAR HighDriveIOs;  // ввод/вывод с высокой нагрузочной способностью (High Drive I/O)
   UCHAR EndpointSize;  // размер буфера конечной точки (endpoint size)
   UCHAR PullDownEnableR; // не 0, если разрешен pull down
   UCHAR SerNumEnableR; // не 0, если используется серийный номер
   UCHAR InvertTXD;     // не 0, если инверсия TXD
   UCHAR InvertRXD;     // не 0, если инверсия RXD
   UCHAR InvertRTS;     // не 0, если инверсия RTS
   UCHAR InvertCTS;     // не 0, если инверсия CTS
   UCHAR InvertDTR;     // не 0, если инверсия DTR
   UCHAR InvertDSR;     // не 0, если инверсия DSR
   UCHAR InvertDCD;     // не 0, если инверсия DCD
   UCHAR InvertRI;      // не 0, если инверсия RI
   UCHAR Cbus0;         // управление мультиплексором CBUS (Cbus Mux control)
   UCHAR Cbus1;         // управление мультиплексором CBUS (Cbus Mux control)
   UCHAR Cbus2;         // управление мультиплексором CBUS (Cbus Mux control)
   UCHAR Cbus3;         // управление мультиплексором CBUS (Cbus Mux control)
   UCHAR Cbus4;         // управление мультиплексором CBUS (Cbus Mux control)
   UCHAR RIsD2XX;       // не 0, если используется драйвер D2XX
   //
   // Расширения для Rev 7 (FT2232H)
   //
   UCHAR PullDownEnable7; // не 0, если разрешен pull down
   UCHAR SerNumEnable7; // не 0, если используется серийный номер
   UCHAR ALSlowSlew;    // не 0, если AL выводы имеют низкую скорость переключения
   UCHAR ALSchmittInput;// не 0, если AL выводы имеют на входе триггер Шмитта
   UCHAR ALDriveCurrent;// допустимые значения 4 мА, 8 мА, 12 мА, 16 мА
   UCHAR AHSlowSlew;    // не 0, если AH выводы имеют низкую скорость переключения
   UCHAR AHSchmittInput;// не 0, если AH выводы имеют на входе триггер Шмитта
   UCHAR AHDriveCurrent;// допустимые значения 4 мА, 8 мА, 12 мА, 16 мА
   UCHAR BLSlowSlew;    // не 0, если BL выводы имеют низкую скорость переключения
   UCHAR BLSchmittInput;// не 0, если BL выводы имеют на входе триггер Шмитта
   UCHAR BLDriveCurrent;// допустимые значения 4 мА, 8 мА, 12 мА, 16 мА
   UCHAR BHSlowSlew;    // не 0, если BH выводы имеют низкую скорость переключения
   UCHAR BHSchmittInput;// не 0, если BH выводы имеют на входе триггер Шмитта
   UCHAR BHDriveCurrent;// допустимые значения 4 мА, 8 мА, 12 мА, 16 мА
   UCHAR IFAIsFifo7;    // не 0, если интерфейс 245 FIFO
   UCHAR IFAIsFifoTar7; // не 0, если интерфейс 245 FIFO CPU target
   UCHAR IFAIsFastSer7; // не 0, если интерфейс Fast serial
   UCHAR AIsVCP7;       // не 0, если интерфейс использует драйверы VCP
   UCHAR IFBIsFifo7;    // не 0, если интерфейс 245 FIFO
   UCHAR IFBIsFifoTar7; // не 0, если интерфейс 245 FIFO CPU target
   UCHAR IFBIsFastSer7; // не 0, если интерфейс Fast serial
   UCHAR BIsVCP7;       // не 0, если интерфейс использует драйверы VCP
   UCHAR PowerSaveEnable;  // не 0, если BCBUS7 используется для управления 
                           // энергопотреблением в случае своего питания
   //
   // Расширения для Rev 8 (FT4232H)
   //
   UCHAR PullDownEnable8; // не 0, если разрешен pull down
   UCHAR SerNumEnable8; // не 0, если используется серийный номер
   UCHAR ASlowSlew;     // не 0, если AL выводы имеют низкую скорость переключения
   UCHAR ASchmittInput; // не 0, если AL выводы имеют на входе триггер Шмитта
   UCHAR ADriveCurrent; // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА
   UCHAR BSlowSlew;     // не 0, если AH выводы имеют низкую скорость переключения
   UCHAR BSchmittInput; // не 0, если AH выводы имеют на входе триггер Шмитта
   UCHAR BDriveCurrent; // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА
   UCHAR CSlowSlew;     // не 0, если BL выводы имеют низкую скорость переключения
   UCHAR CSchmittInput; // не 0, если BL выводы имеют на входе триггер Шмитта
   UCHAR CDriveCurrent; // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА
   UCHAR DSlowSlew;     // не 0, если BH выводы имеют низкую скорость переключения
   UCHAR DSchmittInput; // не 0, если BH выводы имеют на входе триггер Шмитта
   UCHAR DDriveCurrent; // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА
   UCHAR ARIIsTXDEN;    // не 0, если port A использует RI как RS485 TXDEN
   UCHAR BRIIsTXDEN;    // не 0, если port B использует RI как RS485 TXDEN
   UCHAR CRIIsTXDEN;    // не 0, если port C использует RI как RS485 TXDEN
   UCHAR DRIIsTXDEN;    // не 0, если port D использует RI как RS485 TXDEN
   UCHAR AIsVCP8;       // не 0, если интерфейс использует драйверы VCP
   UCHAR BIsVCP8;       // не 0, если интерфейс использует драйверы VCP
   UCHAR CIsVCP8;       // не 0, если интерфейс использует драйверы VCP
   UCHAR DIsVCP8;       // не 0, если интерфейс использует драйверы VCP
   //
   // Расширения для Rev 9 (FT232H)
   //
   UCHAR PullDownEnableH; // не 0, если разрешен pull down
   UCHAR SerNumEnableH; // не 0, если используется серийный номер
   UCHAR ACSlowSlewH;   // не 0, если AC выводы имеют низкую скорость переключения
   UCHAR ACSchmittInputH; // не 0, если AC выводы имеют на входе триггер Шмитта
   UCHAR ACDriveCurrentH; // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА
   UCHAR ADSlowSlewH;   // не 0, если AD выводы имеют низкую скорость переключения
   UCHAR ADSchmittInputH; // не 0, если AD выводы имеют на входе триггер Шмитта
   UCHAR ADDriveCurrentH; // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА
   UCHAR Cbus0H;        // управление мультиплексором CBUS (Cbus Mux control)
   UCHAR Cbus1H;        // управление мультиплексором CBUS (Cbus Mux control)
   UCHAR Cbus2H;        // управление мультиплексором CBUS (Cbus Mux control)
   UCHAR Cbus3H;        // управление мультиплексором CBUS (Cbus Mux control)
   UCHAR Cbus4H;        // управление мультиплексором CBUS (Cbus Mux control)
   UCHAR Cbus5H;        // управление мультиплексором CBUS (Cbus Mux control)
   UCHAR Cbus6H;        // управление мультиплексором CBUS (Cbus Mux control)
   UCHAR Cbus7H;        // управление мультиплексором CBUS (Cbus Mux control)
   UCHAR Cbus8H;        // управление мультиплексором CBUS (Cbus Mux control)
   UCHAR Cbus9H;        // управление мультиплексором CBUS (Cbus Mux control)
   UCHAR IsFifoH;       // не 0, если интерфейс 245 FIFO
   UCHAR IsFifoTarH;    // не 0, если интерфейс 245 FIFO CPU target
   UCHAR IsFastSerH;    // не 0, если интерфейс Fast serial
   UCHAR IsFT1248H;     // не 0, если интерфейс FT1248
   UCHAR FT1248CpolH;   // FT1248 полярность тактов - clock idle лог. 1 (1) или лог. 0 (0)
   UCHAR FT1248LsbH;    // FT1248 порядок следования данных, сначала LSB (1) или MSB (0)
   UCHAR FT1248FlowControlH; // FT1248 разрешение управлением потоком (flow control)
   UCHAR IsVCPH;           // не 0, если интерфейс использует драйверы VCP
   UCHAR PowerSaveEnableH; // не 0, если ACBUS7 используется для управления 
                           // энергопотреблением в случае своего питания
} FT_PROGRAM_DATA, *PFT_PROGRAM_DATA;

typedef struct ft_eeprom_header
{
   FT_DEVICE deviceType;// тип устройства FTxxxx для программирования
   // Опции дескриптора устройства
   WORD VendorId;       // 0x0403
   WORD ProductId;      // 0x6001
   UCHAR SerNumEnable;  // не 0, если используется серийный номер
   // Опции дескриптора конфигурации
   WORD MaxPower;       // 0 < MaxPower < = 500
   UCHAR SelfPowered;   // 0 = питание от шины USB, 1 = свой источник питания
   UCHAR RemoteWakeup;  // 0 = не применимо, 1 = применимо
   // Опции аппаратуры
   UCHAR PullDownEnable;// не 0, если в suspend (приостановка) разрешен pull down
} FT_EEPROM_HEADER, *PFT_EEPROM_HEADER;

Эта структура нужна для использования вместе с FT_EEPROM_Read и FT_EEPROM_Program.

typedef struct ft_eeprom_232b
{
   // Общий заголовок
   FT_EEPROM_HEADER common; // общие элементы EEPROM для всех устройств
} FT_EEPROM_232B, *PFT_EEPROM_232B;

Эта структура нужна для использования вместе с FT_EEPROM_Read и FT_EEPROM_Program.

typedef struct ft_eeprom_2232
{
   // Общий заголовок
   FT_EEPROM_HEADER common;// общие элементы EEPROM для всех устройств
   // Опции нагрузочной способности
   UCHAR AIsHighCurrent;   // не 0, если интерфейс с высокой нагрузочной способностью (high current)
   UCHAR BIsHighCurrent;   // не 0, если интерфейс с высокой нагрузочной способностью (high current)
   // Опции аппаратуры
   UCHAR AIsFifo;          // не 0, если интерфейс 245 FIFO
   UCHAR AIsFifoTar;       // не 0, если интерфейс 245 FIFO CPU target
   UCHAR AIsFastSer;       // не 0, если интерфейс Fast serial
   UCHAR BIsFifo;          // не 0, если интерфейс 245 FIFO
   UCHAR BIsFifoTar;       // не 0, если интерфейс 245 FIFO CPU target
   UCHAR BIsFastSer;       // не 0, если интерфейс Fast serial
   // Опции драйвера
   UCHAR ADriverType;
   UCHAR BDriverType;
} FT_EEPROM_2232, *PFT_EEPROM_2232;

Эта структура нужна для использования вместе с FT_EEPROM_Read и FT_EEPROM_Program.

typedef struct ft_eeprom_232r
{
   // Общий заголовок
   FT_EEPROM_HEADER common;// общие элементы EEPROM для всех устройств
   // Опции нагрузочной способности
   UCHAR IsHighCurrent;    // не 0, если интерфейс с высокой нагрузочной способностью (high current)
   // Опции аппаратуры
   UCHAR UseExtOsc;        // используется внешний генератор
   UCHAR InvertTXD;        // не 0, если инверсия TXD
   UCHAR InvertRXD;        // не 0, если инверсия RXD
   UCHAR InvertRTS;        // не 0, если инверсия RTS
   UCHAR InvertCTS;        // не 0, если инверсия CTS
   UCHAR InvertDTR;        // не 0, если инверсия DTR
   UCHAR InvertDSR;        // не 0, если инверсия DSR
   UCHAR InvertDCD;        // не 0, если инверсия DCD
   UCHAR InvertRI;         // не 0, если инверсия RI
   UCHAR Cbus0;            // управление мультиплексором CBUS (Cbus Mux control)
   UCHAR Cbus1;            // управление мультиплексором CBUS (Cbus Mux control)
   UCHAR Cbus2;            // управление мультиплексором CBUS (Cbus Mux control)
   UCHAR Cbus3;            // управление мультиплексором CBUS (Cbus Mux control)
   UCHAR Cbus4;            // управление мультиплексором CBUS (Cbus Mux control)
   // Опции драйвера
   UCHAR DriverType;
} FT_EEPROM_232R, *PFT_EEPROM_232R;

Эта структура нужна для использования вместе с FT_EEPROM_Read и FT_EEPROM_Program.

typedef struct ft_eeprom_2232h
{
   // Общий заголовок
   FT_EEPROM_HEADER common;// общие элементы EEPROM для всех устройств
   // Опции нагрузочной способности
   UCHAR ALSlowSlew;       // не 0, если AL выводы имеют низкую скорость переключения
   UCHAR ALSchmittInput;   // не 0, если AL выводы имеют на входе триггер Шмитта
   UCHAR ALDriveCurrent;   // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА
   UCHAR AHSlowSlew;       // не 0, если AH выводы имеют низкую скорость переключения
   UCHAR AHSchmittInput;   // не 0, если AH выводы имеют на входе триггер Шмитта
   UCHAR AHDriveCurrent;   // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА
   UCHAR BLSlowSlew;       // не 0, если BL выводы имеют низкую скорость переключения
   UCHAR BLSchmittInput;   // не 0, если BL выводы имеют на входе триггер Шмитта
   UCHAR BLDriveCurrent;   // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА
   UCHAR BHSlowSlew;       // не 0, если BH выводы имеют низкую скорость переключения
   UCHAR BHSchmittInput;   // не 0, если BH выводы имеют на входе триггер Шмитта
   UCHAR BHDriveCurrent;   // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА
   // Опции аппаратуры
   UCHAR AIsFifo;          // не 0, если интерфейс 245 FIFO
   UCHAR AIsFifoTar;       // не 0, если интерфейс 245 FIFO CPU target
   UCHAR AIsFastSer;       // не 0, если интерфейс Fast serial
   UCHAR BIsFifo;          // не 0, если интерфейс 245 FIFO
   UCHAR BIsFifoTar;       // не 0, если интерфейс 245 FIFO CPU target
   UCHAR BIsFastSer;       // не 0, если интерфейс Fast serial
   UCHAR PowerSaveEnable;  // не 0, если BCBUS7 используется для управления 
                           // энергопотреблением в случае своего питания
   // Опции драйвера
   UCHAR ADriverType;
   UCHAR BDriverType;
} FT_EEPROM_2232H, *PFT_EEPROM_2232H;

Эта структура нужна для использования вместе с FT_EEPROM_Read и FT_EEPROM_Program.

typedef struct ft_eeprom_4232h
{
   // Общий заголовок
   FT_EEPROM_HEADER common;// общие элементы EEPROM для всех устройств
   // Опции нагрузочной способности
   UCHAR ASlowSlew;        // не 0, если A выводы имеют низкую скорость переключения
   UCHAR ASchmittInput;    // не 0, если A выводы имеют на входе триггер Шмитта
   UCHAR ADriveCurrent;    // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА
   UCHAR BSlowSlew;        // не 0, если B выводы имеют низкую скорость переключения
   UCHAR BSchmittInput;    // не 0, если B выводы имеют на входе триггер Шмитта
   UCHAR BDriveCurrent;    // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА
   UCHAR CSlowSlew;        // не 0, если C выводы имеют низкую скорость переключения
   UCHAR CSchmittInput;    // не 0, если C выводы имеют на входе триггер Шмитта
   UCHAR CDriveCurrent;    // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА
   UCHAR DSlowSlew;        // не 0, если D выводы имеют низкую скорость переключения
   UCHAR DSchmittInput;    // не 0, если D выводы имеют на входе триггер Шмитта
   UCHAR DDriveCurrent;    // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА
   // Опции аппаратуры
   UCHAR ARIIsTXDEN;       // не 0, если port A использует RI как RS485 TXDEN
   UCHAR BRIIsTXDEN;       // не 0, если port B использует RI как RS485 TXDEN
   UCHAR CRIIsTXDEN;       // не 0, если port C использует RI как RS485 TXDEN
   UCHAR DRIIsTXDEN;       // не 0, если port D использует RI как RS485 TXDEN
   // Опции драйвера
   UCHAR ADriverType;
   UCHAR BDriverType;
   UCHAR CDriverType;
   UCHAR DDriverType;
} FT_EEPROM_4232H, *PFT_EEPROM_4232H;

Эта структура нужна для использования вместе с FT_EEPROM_Read и FT_EEPROM_Program.

typedef struct ft_eeprom_232h
{
   // Общий заголовок
   FT_EEPROM_HEADER common;// общие элементы EEPROM для всех устройств
   // Опции нагрузочной способности
   UCHAR ACSlowSlew;       // не 0, если AC bus выводы имеют низкую скорость переключения
   UCHAR ACSchmittInput;   // не 0, если AC bus выводы имеют на входе триггер Шмитта
   UCHAR ACDriveCurrent;   // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА
   UCHAR ADSlowSlew;       // не 0, если AD bus выводы имеют низкую скорость переключения
   UCHAR ADSchmittInput;   // не 0, если AD bus выводы имеют на входе триггер Шмитта
   UCHAR ADDriveCurrent;   // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА
   // Опции CBUS
   UCHAR Cbus0;            // управление мультиплексором CBUS (Cbus Mux control)
   UCHAR Cbus1;            // управление мультиплексором CBUS (Cbus Mux control)
   UCHAR Cbus2;            // управление мультиплексором CBUS (Cbus Mux control)
   UCHAR Cbus3;            // управление мультиплексором CBUS (Cbus Mux control)
   UCHAR Cbus4;            // управление мультиплексором CBUS (Cbus Mux control)
   UCHAR Cbus5;            // управление мультиплексором CBUS (Cbus Mux control)
   UCHAR Cbus6;            // управление мультиплексором CBUS (Cbus Mux control)
   UCHAR Cbus7;            // управление мультиплексором CBUS (Cbus Mux control)
   UCHAR Cbus8;            // управление мультиплексором CBUS (Cbus Mux control)
   UCHAR Cbus9;            // управление мультиплексором CBUS (Cbus Mux control)
   // FT1248 options
   UCHAR FT1248Cpol;       // FT1248 полярность тактов - clock idle лог. 1 (1) или лог. 0 (0)
   UCHAR FT1248Lsb;        // FT1248 порядок следования данных, сначала LSB (1) или MSB (0)
   UCHAR FT1248FlowControl;// FT1248 разрешение управлением потоком (flow control)
   // Опции аппаратуры
   UCHAR IsFifo;           // не 0, если интерфейс 245 FIFO
   UCHAR IsFifoTar;        // не 0, если интерфейс 245 FIFO CPU target
   UCHAR IsFastSer;        // не 0, если интерфейс Fast serial
   UCHAR IsFT1248          // не 0, если интерфейс FT1248
   UCHAR PowerSaveEnable;
   // Опции драйвера
   UCHAR DriverType;
} FT_EEPROM_232H, *PFT_EEPROM_232H;

Эта структура нужна для использования вместе с FT_EEPROM_Read и FT_EEPROM_Program.

typedef struct ft_eeprom_x_series
{
   // Общий заголовок
   FT_EEPROM_HEADER common;// общие элементы EEPROM для всех устройств
   // Опции нагрузочной способности
   UCHAR ACSlowSlew;       // не 0, если AC bus выводы имеют низкую скорость переключения
   UCHAR ACSchmittInput;   // не 0, если AC bus выводы имеют на входе триггер Шмитта
   UCHAR ACDriveCurrent;   // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА
   UCHAR ADSlowSlew;       // не 0, если AD bus выводы имеют низкую скорость переключения
   UCHAR ADSchmittInput;   // не 0, если AD bus выводы имеют на входе триггер Шмитта
   UCHAR ADDriveCurrent;   // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА
   // Опции CBUS
   UCHAR Cbus0;            // управление мультиплексором CBUS (Cbus Mux control)
   UCHAR Cbus1;            // управление мультиплексором CBUS (Cbus Mux control)
   UCHAR Cbus2;            // управление мультиплексором CBUS (Cbus Mux control)
   UCHAR Cbus3;            // управление мультиплексором CBUS (Cbus Mux control)
   UCHAR Cbus4;            // управление мультиплексором CBUS (Cbus Mux control)
   UCHAR Cbus5;            // управление мультиплексором CBUS (Cbus Mux control)
   UCHAR Cbus6;            // управление мультиплексором CBUS (Cbus Mux control)
   // Опции сигналов UART
   UCHAR InvertTXD;        // не 0, если инверсия TXD
   UCHAR InvertRXD;        // не 0, если инверсия RXD
   UCHAR InvertRTS;        // не 0, если инверсия RTS
   UCHAR InvertCTS;        // не 0, если инверсия CTS
   UCHAR InvertDTR;        // не 0, если инверсия DTR
   UCHAR InvertDSR;        // не 0, если инверсия DSR
   UCHAR InvertDCD;        // не 0, если инверсия DCD
   UCHAR InvertRI;         // не 0, если инверсия RI
   // Опции детектирования заряда батареи (Battery Charge Detect)
   UCHAR BCDEnable;        // разрешить Battery Charger Detection
   UCHAR BCDForceCbusPWREN;// выставляет сигнал power enable на CBUS, когда
                           // был детектирован порт зарядки
   UCHAR BCDDisableSleep;  // принудительно запрещает устройству переходить в sleep mode
   // Опции I2C
   WORD I2CSlaveAddress;   // Адрес подчиненного устройства на шине I2C (I2C slave device address)
   DWORD I2CDeviceId;      // Идентификатор устройства на шине I2C (I2C device ID)
   UCHAR I2CDisableSchmitt;// Запрет триггера Шмитта на шине I2C
   // FT1248 options
   UCHAR FT1248Cpol;       // FT1248 полярность тактов - clock idle лог. 1 (1),
                           // или лог. 0 (0)
   UCHAR FT1248Lsb;        // FT1248 порядок следования данных, сначала LSB (1) или MSB (0)
   UCHAR FT1248FlowControl;// FT1248 разрешение управлением потоком (flow control)
   // Опции аппаратуры
   UCHAR RS485EchoSuppress;
   UCHAR PowerSaveEnable;
   // Опции драйвера
   UCHAR DriverType;
} FT_EEPROM_X_SERIES, *PFT_EEPROM_X_SERIES;

OPEN_EXISTING = 3
FILE_ATTRIBUTE_NORMAL   = 0x00000080
FILE_FLAG_OVERLAPPED    = 0x40000000
GENERIC_READ            = 0x80000000
GENERIC_WRITE           = 0x40000000

typedef struct _OVERLAPPED
{
   ULONG_PTR Internal;
   ULONG_PTR InternalHigh;
   union
   {
      struct
      {
         DWORD Offset;
         DWORD OffsetHigh;
      };
      PVOID Pointer;
   };
   HANDLE hEvent;
} OVERLAPPED, *LPOVERLAPPED;

CLRDTR = 6           // Сброс сигнала DTR
CLRRTS = 4           // Сброс сигнала RTS
SETDTR = 5           // Установка сигнала DTR
SETRTS = 3           // Установка сигнала RTS
SETBREAK = 8         // Установка состояния останова (BREAK condition)
CLRBREAK = 9         // Сброс состояния останова (non-BREAK condition)
MS_CTS_ON   = 0x0010 // Сигнал Clear To Send (CTS) в лог. 1
MS_DSR_ON   = 0x0020 // Сигнал Data Set Ready (DSR) в лог. 1
MS_RING_ON  = 0x0040 // Сигнал Ring Indicator (RI) в лог. 1
MS_RLSD_ON  = 0x0080 // Receive Line Signal Detect (RLSD) в лог. 1

typedef struct _FTDCB
{
   DWORD DCBlength;     // sizeof(FTDCB)
   DWORD BaudRate;      // Скорость
   DWORD fBinary: 1;    // Binary Mode (пропуск проверки EOF)
   DWORD fParity: 1;    // Разрешение проверки на четность
   DWORD fOutxCtsFlow:1;// Управление выходом CTS handshaking
   DWORD fOutxDsrFlow:1;// Управление выходом DSR handshaking
   DWORD fDtrControl:2; // Управление потоком DTR
   DWORD fDsrSensitivity:1;   // Чувствительность DSR
   DWORD fTXContinueOnXoff: 1;// Продолжение TX, когда отправлен Xoff
   DWORD fOutX: 1;      // Разрешить на выходе X-ON/X-OFF
   DWORD fInX: 1;       // Разрешить на входе X-ON/X-OFF
   DWORD fErrorChar: 1; // Разрешить замену при ошибке (Err Replacement)
   DWORD fNull: 1;      // Разрешить Null stripping
   DWORD fRtsControl:2; // Управление потоком RTS
   DWORD fAbortOnError:1; // Оборвать все чтения и записи при ошибке
   DWORD fDummy2:17;    // Зарезервировано
   WORD wReserved;      // Пока не используется
   WORD XonLim;         // Порог передачи X-ON
   WORD XoffLim;        // Порог передачи X-OFF
   BYTE ByteSize;       // Размер фрейма (количество бит в байте), 7-8
   BYTE Parity;         // 0..4: None, Odd, Even, Mark, Space
   BYTE StopBits;       // 0, 2: 1, 2
   char XonChar;        // Символ X-ON для Tx и Rx 
   char XoffChar;       // Символ X-OFF для Tx и Rx 
   char ErrorChar;      // Символ замены при ошибке (Error replacement char)
   char EofChar;        // Символ окончания ввода (End of Input character)
   char EvtChar;        // Символ приема события (Received Event character)
   WORD wReserved1;     // Зарезервировано
} FTDCB, *LPFTDCB;

typedef struct _FTTIMEOUTS
{
   DWORD ReadIntervalTimeout;         // max время между читаемыми символами
   DWORD ReadTotalTimeoutMultiplier;  // множитель для символов
   DWORD ReadTotalTimeoutConstant;    // константа в миллисекундах
   DWORD WriteTotalTimeoutMultiplier; // множитель для символов
   DWORD WriteTotalTimeoutConstant;   // константа в миллисекундах
} FTTIMEOUTS, *LPFTTIMEOUTS;

EV_BREAK       = 0x0040 // детектировано BREAK condition
EV_CTS         = 0x0008 // изменился Clear To Send (CTS)
EV_DSR         = 0x0010 // изменился Data Set Ready (DSR)
EV_ERR         = 0x0080 // ошибка в состоянии линии
EV_RING        = 0x0100 // изменился Ring Indicator (RI)
EV_RLSD        = 0x0020 // изменился Receive Line Signal Detect (RLSD)
EV_RXCHAR      = 0x0001 // принят символ
EV_RXFLAG      = 0x0002 // событие приема символа
EV_TXEMPTY     = 0x0004 // передатчик пуст
PURGE_TXABORT  = 0x0001 // оборвать текущие overlapped-записи
PURGE_RXABORT  = 0x0002 // оборвать текущие overlapped-чтения
PURGE_TXCLEAR  = 0x0004 // очистка буфера передачи
PURGE_RXCLEAR  = 0x0008 // очистка буфера приема

typedef struct _FTCOMSTAT
{
   DWORD fCtsHold: 1;
   DWORD fDsrHold: 1;
   DWORD fRlsdHold: 1;
   DWORD fXoffHold: 1;
   DWORD fXoffSent: 1;
   DWORD fEof: 1;
   DWORD fTxim: 1;
   DWORD fReserved: 25;
   DWORD cbInQue;
   DWORD cbOutQue;
} FTCOMSTAT, *LPFTCOMSTAT;

[Ссылки]

1. D2XX Direct Drivers site:ftdichip.com.
2. Code Examples site:ftdichip.com.
3. FT2232H: двухканальная высокоскоростная USB микросхема для I/O.
4. Режимы BitBang для микросхем FT232R и FT245R.

 

Комментарии  

 
0 #2 Юрий 06.04.2021 12:42
Что-нибудь известно про реентерабельнос ть FTD2XX.dll? Работать с разными устройствами в отдельных потоках можно?
Цитировать
 
 
0 #1 Александр 11.03.2017 21:22
У меня адаптер на FTDI 232R Vag k+can commander 1,4. Чип полностью пустой, перепаял новый, а он тоже не определяется ни по производителю, ни по ID, VID_0000&PID_0000. Из командной строки не хватает образования прописать. Пробовал подставлять ваши команды, пишет что не является командой для записи. Установлен Windows 7, 32-bit. Можно что либо сделать или купить новый адаптер?

microsin: можно конечно что-то сделать. Но сначала надо понять, в чем причина. Скорее всего, просто плохо чип запаяли, и где-то непропай или замыкание.
Цитировать
 

Добавить комментарий


Защитный код
Обновить

Top of Page