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

 
 
> Кому-нибудь приходилось писать в Builder C++ программу для работы с FTDI?
zheka
сообщение Feb 7 2012, 17:07
Сообщение #1


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Кому-нибудь приходилось писать в Builder C++ программу для работы с FTDI?

Господа, я застрял...
По нажатию кнопки я должен дождаться прихода символа и ответить на него в течение не более 70 мсек.
Стандартная конструкция типа терминала не подходит.

Я отправляю символ и пытаюсь читать ответ:
Код
USBStat=FT_Write(hUSB,TxBuffer,dwBytesToWrite,&dwBytesWritten);

if (!USBStat==FT_OK)
{
USBErr(USBStat);
return;
};

        USBStat=FT_GetStatus(hUSB,&RxBytes,&TxBytes,&EventDWord);



Естественно, читаю ноль байт, так как комп переходит к чтению мгновенно, а ответ не успевает прийти.

Если же ставлю
Код
while(RxBytes==0)
{
Application->ProcessMessages();
USBStat=FT_GetStatus(hUSB,&RxBytes,&TxBytes,&EventDWord);
}

ShowMessage(RxBytes);


То получаю гигантское число. ПРочие манипуляции приводят к зависанию программы.

Как подружить контроллер, FT232RL и этот долбаный Builder C++ ?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Силаев
сообщение Feb 8 2012, 17:44
Сообщение #2





Группа: Участник
Сообщений: 12
Регистрация: 25-11-10
Из: Москва
Пользователь №: 61 185



Делать такое надо строго в отдельном потоке. В билдере это два нажатия мышкой и немного кода:

File->New->Other->Thread Object
Далее задать имя класса потока (Class Name)

В функции Execute потока

Код
void __fastcall fx2thread::Execute()
{//---- Place thread code here ----
while (Form_Main->Start_reg)
  { UCHAR buf[512];
     long bufsize = 512;//функция XferData меняет значение, она возвращает в эту переменную число принятых байт
     Form_Main->FX2Device->EndPoints[2]->XferData(buf, bufsize, NULL);
       for (int x=0; x<bufsize; x=x++)
        {    //разбор данных буфера buf
         }
  }//while
}


Start_reg - пересменная типа bool управляемая из основной программы
В потоке это все

В основной программе:
TForm_Main *Form_Main;
fx2thread *fx2thr = new fx2thread(true); //указатель на поток

Чтобы запустить поток по кнопке:
Код
void __fastcall TForm_Main::Button_StartClick(TObject *Sender)
{//Пуск
  if (Start_reg == false)
   {Start_reg = true; //переключил триггер
      if (fx2thr->Suspended == true)  fx2thr->Resume(); //запустил поток
   }
}


Чтобы остановить поток по кнопке:
Код
void __fastcall TForm_Main::Button_StopClick(TObject *Sender)
{//Стоп
if (Start_reg == true)
{  Start_reg = false; //переключил триггер остановил чтение в цикле потока
     if (fx2thr->Suspended == false)  fx2thr->Suspend(); //остановил поток
  }
}


В примере функции от Cypress, но думаю понятно.

Сообщение отредактировал Силаев - Feb 8 2012, 17:47
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 30th June 2025 - 17:45
Рейтинг@Mail.ru


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