работа с FT232, через библиотеку FTD2XX.dll
Добавлено: Вт апр 26, 2011 14:44:09
Второй день воюю над автоматическим определением своего девайса программой под винду.. Пришел к выводу, что либо я либо лыжи.. Вобщем есть устройство, состоящее из FT232R и МК. Программа под винду которую пишу в теневом режиме каждые 5 секунд проверяет подключен ли девайс к компу. Алгоритм определения именно моего устройства следующий: с помощью функций библиотеки ftd2xx.dll я определяю сколько FT устройств подключено, затем по их порядковым индексам получаю серийные номера всех этих устройств и начинаю поочереди их открывать с заданными параметрами обмена (скорость, стопы, четность, управление), при каждом открытии FT устройства я отправляю 2 байта 0x58, чтобы вывести МК моего устройства на рабочий режим, затем передергиваю вывод RTS ("1" -> "0" -> "1"), при этом передергивании МК отвечает 1 байтом 0x3E (МК переходит в режим настройки извне), затем снова отправляю 2 байта 0x58, чтобы вывести МК снова в рбочий режим. В итоге если после всех этих операций в приемном буфере остается принятый 0x3E, то я считаю что именно мое устройство подключено к компу и прерываю цикл проверки подключенных FT устройств и возвращаю в программу серийный номер FT устройства, определенного как мое устройство. Привожу ниже фрагмент кода функции, проделывающей эти операции с уже открытым FT устройством (после выполнения этой функции устройство закрывается в месте откуда эта функция была вызвана).
строки помеченные как delay 1 и delay 2 добавлены вынуждено как раз по причине "меня или лыж". Эти две строки являются своеобразными точками останова временно пока не разберусь, только так мое устройство определяется программой (т.е. байт 0x3E выуживается успешно). Попытки заменить эти диалоговые окошки на пассивные задержки (т.е. пустые циклы) только затормаживают работу программы и при этом все равно не получается отловить нужный байт. Главные вопросы и непонятки на данный момент: НА КОЙ ЧЕРТ в библиотеке ftd2xx.dll нужна функция установки таймаутов по приему и передачи? К примеру, я увеличиваю задержку по приему до 5000мс, чтобы избавиться от строки delay 2, но это не спасает и после вызова функции FT_Read и отработки интервала 5000 мне возвращается значение кол-ва принятых байт = 0! Я думал этот таймаут как раз и нужен для того чтобы допустим вызвать FT_Read с кол-вом байт которые должны быть приняты например 256 и ждать свой 1 байтик все 5 секунд пока он появится, на практике так не получается. Таймаут для передачи тож непонятно как работает, но я пока с ним особо не игрался.. Также есть еще установка времени запаздывания FT_SetLatencyTimer (от 2 до 255мс), это чиво еще такое? С библиотекой работаю через написанный свой ActiveX враппер, поэтому поясню приведенный код:
SetTimeouts(FTHandle,50,50) - эт я устанавливаю таймауты для RX и TX
SetLTimer(FTHandle,10) - эт равносильно FT_SetLatencyTimer
SetRTS(FTHandle, false), SetRTS(FTHandle, true) - сброс/установка сигнала RTS
WriteFrame(FTHandle,{88,88},2) - посылка массива из двух элементов
FTReset(FTHandle,false,false,true,true) - универсальная функция сброса, сброс: порта, устройства, RX буффера, TX буффера (в данном случае 2 последних сбрасываю)
ReadFrame(FTHandle,1) - функция чтения из буффера, возвращает массив, 1й элемент - код ошибки (если были), 2й - кол-во принятых байт, 3й - содержит массив, собственно полученные данные
Я конечно догадываюсь, что мой выход из ситуации - это работать по таймерам внутри своей программы под винду, НО. ЗАЧЕМ ВСЕ ЭТИ ТАЙМАУТЫ предоставляемые библиотекой ftd2xx.dll? Может я неправильно понимаю логику их работы?
Код: Выделить всё
function getModemAnswer(FTHandle)
--clear scanning flag
RFMfound = false;
--setting RX and TX timeouts, set latency timer
result1 = modem:SetTimeouts(FTHandle,50,50);
result2 = modem:SetLTimer(FTHandle,10);
result3 = modem:SetRTS(FTHandle, false);
if (result1 == 0 and result2 == 0 and result3 == 0) then
--transmit 2 bytes (0x58,0x58) mean EXIT
result1 = modem:WriteFrame(FTHandle,{88,88},2);
if (result1 == 2) then
Dialog.Message("Notice", FTLibraryVer, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1); -- delay 1
--reset RX,TX buffers
temptable3 = modem:FTReset(FTHandle,false,false,true,true);
if (temptable3[3] == 0 and temptable3[4] == 0) then
--enter RFM configure mode
result1 = modem:SetRTS(FTHandle, true);
result2 = modem:SetRTS(FTHandle, false);
if (result1 == 0 and result2 == 0) then
--transmit 2 bytes (0x58,0x58) mean EXIT
result1 = modem:WriteFrame(FTHandle,{88,88},2);
if (result1 == 2) then
Dialog.Message("Notice", FTLibraryVer, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1); -- delay 2
--reading answer (0x3E), if possible
temptable3 = modem:ReadFrame(FTHandle,1);
temptable4 = temptable3[3];
if (temptable3[1] == 0 and temptable3[2] > 0 and temptable4[1] == 62) then
RFMfound = true;
end
end
end
end
end
end
return RFMfound
end
SetTimeouts(FTHandle,50,50) - эт я устанавливаю таймауты для RX и TX
SetLTimer(FTHandle,10) - эт равносильно FT_SetLatencyTimer
SetRTS(FTHandle, false), SetRTS(FTHandle, true) - сброс/установка сигнала RTS
WriteFrame(FTHandle,{88,88},2) - посылка массива из двух элементов
FTReset(FTHandle,false,false,true,true) - универсальная функция сброса, сброс: порта, устройства, RX буффера, TX буффера (в данном случае 2 последних сбрасываю)
ReadFrame(FTHandle,1) - функция чтения из буффера, возвращает массив, 1й элемент - код ошибки (если были), 2й - кол-во принятых байт, 3й - содержит массив, собственно полученные данные
Я конечно догадываюсь, что мой выход из ситуации - это работать по таймерам внутри своей программы под винду, НО. ЗАЧЕМ ВСЕ ЭТИ ТАЙМАУТЫ предоставляемые библиотекой ftd2xx.dll? Может я неправильно понимаю логику их работы?