Столкнулся с весьма необычным поведением FTDI под Linux.
При частом обращении к FTDI иногда не срабатывает функция FT_Write.
Функция для настройки FTDI:
CODE
bool MainWindow::OpenPort(int nPort, bool msgbox)
{
if(ftPort != 0)
{
FT_Purge(ftPort, FT_PURGE_RX | FT_PURGE_TX);
FT_Close(ftPort);
ftPort = 0;
}
if(FT_Open(nDevIndex[nPort], &ftPort) != FT_OK)
{
ftPort = 0;
if(msgbox)
QMessageBox::critical(0, "Ошибка!", "Ошибка при открытии USB порта.");
return false;
}
FT_ResetDevice(ftPort);
FT_SetBitMode(ftPort, 0, FT_BITMODE_RESET);
FT_SetDtr(ftPort);
FT_SetRts(ftPort);
FT_Purge(ftPort, FT_PURGE_RX | FT_PURGE_TX);
FT_SetUSBParameters(ftPort, 65535, 0);
FT_SetTimeouts(ftPort, TIMEOUT + 10, TIMEOUT + 10);
FT_SetLatencyTimer(ftPort, 1);
FT_SetDivisor(ftPort, FTDIVISOR);
FT_SetDataCharacteristics(ftPort, FT_BITS_8, FT_STOP_BITS_1, FT_PARITY_NONE);
FT_SetFlowControl(ftPort, FT_FLOW_NONE, NULL, NULL);
FT_Purge(ftPort, FT_PURGE_RX | FT_PURGE_TX);
return true;
}
{
if(ftPort != 0)
{
FT_Purge(ftPort, FT_PURGE_RX | FT_PURGE_TX);
FT_Close(ftPort);
ftPort = 0;
}
if(FT_Open(nDevIndex[nPort], &ftPort) != FT_OK)
{
ftPort = 0;
if(msgbox)
QMessageBox::critical(0, "Ошибка!", "Ошибка при открытии USB порта.");
return false;
}
FT_ResetDevice(ftPort);
FT_SetBitMode(ftPort, 0, FT_BITMODE_RESET);
FT_SetDtr(ftPort);
FT_SetRts(ftPort);
FT_Purge(ftPort, FT_PURGE_RX | FT_PURGE_TX);
FT_SetUSBParameters(ftPort, 65535, 0);
FT_SetTimeouts(ftPort, TIMEOUT + 10, TIMEOUT + 10);
FT_SetLatencyTimer(ftPort, 1);
FT_SetDivisor(ftPort, FTDIVISOR);
FT_SetDataCharacteristics(ftPort, FT_BITS_8, FT_STOP_BITS_1, FT_PARITY_NONE);
FT_SetFlowControl(ftPort, FT_FLOW_NONE, NULL, NULL);
FT_Purge(ftPort, FT_PURGE_RX | FT_PURGE_TX);
return true;
}
Код для записи в FTDI:
Код
nb = 0;
ftStatus = FT_Write(*ftPort, ft_data, i, &nb);
if(ftStatus != FT_OK)
{
emit ft_msg("ftStatus FT_Write() != FT_OK");
continue;
}
if(i != ((uint32_t)nb))
{
char st[256];
sprintf(st, "Ошибка при записи данных.\nЗаписано %u bytes, передано %u bytes.", i, ((uint32_t)nb));
emit ft_msg(st);
continue;
}
ftStatus = FT_Write(*ftPort, ft_data, i, &nb);
if(ftStatus != FT_OK)
{
emit ft_msg("ftStatus FT_Write() != FT_OK");
continue;
}
if(i != ((uint32_t)nb))
{
char st[256];
sprintf(st, "Ошибка при записи данных.\nЗаписано %u bytes, передано %u bytes.", i, ((uint32_t)nb));
emit ft_msg(st);
continue;
}
Причём при возникновении ошибки функция всегда возвращает ftStatus == FT_OK и nb == 0.
На Windows (XP x32, Win7 x64) такая ошибка не возникает никогда.
Пробовал разные версии Linux.
На Red Hat вываливается раз в пол минуты.
На Gentoo почти сразу.
На Debian запись работает нормально, а вот чтение всегда возвращает неправильные данные.
Драйвер самый последний с ftdichip.com.
Кто-нибудь сталкивался с подобной проблемой?