реклама на сайте
подробности

 
 
> d2xx и FT245R, не генерируется событие
Denis Kuptsov
сообщение Jul 9 2007, 10:49
Сообщение #1





Группа: Новичок
Сообщений: 1
Регистрация: 9-07-07
Пользователь №: 28 987



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

Вот код (из процедур, завернутых в функции Дельфи, модуль находится на сайте FTDI http://www.ftdichip.com/Projects/CodeExamp...hi/D2XXUnit.zip

Код
FT_Event_Handle := CreateEvent(nil, false, True, 'FDTIEvent');
Set_USB_Device_Event_Notification(FT_EVENT_RXCHAR);


Затем в отдельном потоке ожидание
Код
repeat
  if WaitForSingleObject(FT_Event_Handle,1000)=WAIT_OBJECT_0 then
  begin
    Get_USB_Device_Status;
    if FT_Event_Status=FT_EVENT_RXCHAR then
    begin
      //чтение данных
    end;
  end;
until False;

WaitForSingleObject всегда возвращает WAIT_TIMEOUT, если поставить INFINITE - просто начинается бесконечное ожидание.

Может быть, кто-то сталкивался со схожей проблемой? Почему может не генерироваться событие?

p.s. В режиме VCP работает нормально.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 1)
jartsev
сообщение Aug 5 2009, 04:32
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 578
Регистрация: 7-03-09
Из: Новосибирск
Пользователь №: 45 805



Поднимаю тему.

Проблема оказалась в том что программисты из FTDI написали косячную функцию Set_USB_Device_Event_Notification. Если в исходники вглядеться, то можно увидеть что в FT_SetEventNotification пихают неверные параметры.

Поэтому вместо Set_USB_Device_Event_Notification пишем:
PortStatus:=FT_SetEventNotification(FT_Handle,FT_EVENT_RXCHAR or FT_EVENT_MODEM_STATUS,hEvent);

Но это еще не всё, похоже что при обработке процедуры потока сбрасывается указатель на событие hEvent. Вследствие этого процедура обработки потока выполняется один раз (правда бывает о раза к разу и несколько раз).
Для лечения этого глюка в конце процедуры потока пишем еще раз:
PortStatus:=FT_SetEventNotification(FT_Handle,FT_EVENT_RXCHAR or FT_EVENT_MODEM_STATUS,hEvent);


Порнография конечно, но вроде работает.

Успехов!
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 09:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.01338 секунд с 7
ELECTRONIX ©2004-2016