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

 
 
> FTDI 232, Уменьшить время отклика
Danis
сообщение Jul 5 2011, 09:08
Сообщение #1


Twilight Zone
***

Группа: Свой
Сообщений: 454
Регистрация: 17-02-09
Из: Челябинск
Пользователь №: 44 990



Приветствую коллеги по цеху!

Такая задача у меня: Имеется некий софт для ПК, который принимает данные от «железки», последняя отправляет данные в ПК через FTDI(FT232). Между ПК и железкой есть свой простой протокол обмена. Вопрос в том, что после посылки сообщения железка ждет подтверждения от ПК, которое приходит с задержкой 5-25 ms, что сильно напрягает и делает пропускную способность канала 25% при скорости 115200 (сообщения короткие 24-50 байт). Предполагаю что это связанно с задержками самого драйвера FTDI. Для работы с FTDI со стороны ПК пользовался D2XX Programmer's Guide.

клик

Данные с FTDI вычитываю каждую 1 ms с использованием мультимедийного таймера (разрешение - 1ms точно). Передаю также с разрешением 1ms, но увы, идут задержки. Прошу совета как выйти из положения. Писать свой драйвер под Windows могу но нет желания. Отказаться от FTDI нет возможности.

Прилагаю листинг инициализации FTDI.

Заголовок для класса FTDI

Код
#ifndef __FTDI_H
#define __FTDI_H

  #include "ftd2xx.h"
  #include <Mmsystem.h>

  class My_FTDI
  {
  public:  My_FTDI(void);
  public: ~My_FTDI(void);

  int Multimedia_Timer_Init(void);
  static int Get_number_D2XX_devices(void);
  static int Write_FTDI(BYTE *sours, WORD len);
  static int Read_FTDI(BYTE *RxBuffer);
  static int Find_FTDI_Connect(void);
  void static __stdcall TimeProc(UINT wTimerID, UINT msg, DWORD dwUser, DWORD dw1, DWORD dw2);

  FT_HANDLE ftHandle;
  DWORD NumDevs;
  DWORD Monitor_Timer;
  int Timer_Resolution;  

  };

  extern My_FTDI My_FTDI_Dev;

#endif


Вырезка из метода поиска/инициализации/подключения к FTDI

Код
Метод  инициализации FTDI
int My_FTDI::Find_FTDI_Connect(void)    // Пробую подлючиться к железке
{
    FT_STATUS ftStatus;
    BYTE sours[2]      = {0x01, 0x03};    // START, STOP
    static BYTE Rx_Buff[1024] = {0};
    WORD BytesWritten =  0;


   cout << " Connect to FTDI " << endl;

  for ( int i = 0; i < (int)My_FTDI_Dev.NumDevs; i++ )
  {

   ftStatus = FT_Open (i, &My_FTDI_Dev.ftHandle );
   if (ftStatus != FT_OK)
   FT_Close(My_FTDI_Dev.ftHandle); // Закрыть в случае ошибки;

   ftStatus = FT_SetTimeouts( My_FTDI_Dev.ftHandle, 1, 1 );  //  Timeout
   if (ftStatus != FT_OK)
   {
    cout << " Fail timeout " << i << endl;
    FT_Close(My_FTDI_Dev.ftHandle); // Закрыть в случае ошибки
   }


   ftStatus = FT_SetBaudRate(My_FTDI_Dev.ftHandle, 115200); // Set baud rate to 115200
   if (ftStatus != FT_OK)
   FT_Close(My_FTDI_Dev.ftHandle); // Закрыть в случае ошибки

   // Set 8 data bits, 1 stop bit and no parity
   ftStatus = FT_SetDataCharacteristics(My_FTDI_Dev.ftHandle, FT_BITS_8, FT_STOP_BITS_1, FT_PARITY_NONE);
   if (ftStatus != FT_OK)
   FT_Close(My_FTDI_Dev.ftHandle); // Закрыть в случае ошибки

  } //  for ( int i = 0; i < (int)My_FTDI_Dev.NumDevs; i++ )


   return 0;

}



Спасибо!


--------------------
Magic Friend
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 22:10
Рейтинг@Mail.ru


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