Приветствую коллеги по цеху!
Такая задача у меня: Имеется некий софт для ПК, который принимает данные от «железки», последняя отправляет данные в ПК через 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;
}
Спасибо!