У FTDI есть несколько приколов, например иногда может прийти лишний нулевой байт. Эту ситуацию мы когда-то решили костылём. Сейчас проблема оказалась в другом.
Стали возникать ошибки передачи. Пока идёт измерение, я сыплю данные в компьютер. На коротких замерах всё работало нормально. Но потом я стал долбить данные часами. И вот проходит полчаса, час -- не совпадает контрольная сумма пакета!
Сначала надо было выяснить, что конкретно происходит. Из-за шумов портится один байт? Или часть пакета просто пропадает? Или заменяется мусором?
Я сделал логирование ошибочных пакетов.
ОКАЗАЛОСЬ
1. Внутри пакета у меня есть определённая циклическая структура, и её видно в шестнадцатеричных кодах невооружённым глазом. Эта структура нарушалась в середине пакета -- и продолжалась дальше со смещением. Иногда смещение возникало ближе к началу пакета, а иногда ближе к концу. Это означало, что у меня не просто идёт порча данных, у меня выпадает несколько байт.
2. В хвосте пакета я обнаружил начало следующего (там сигнатура). Это позволило определить, что выпадает от 5 до 15 байт, каждый раз случайное число.
До того, как я выяснил эти два пункта, я размышлял над различными методами компенсации. Может, можно просто выпустить ошибочную часть данных? (в длинном замере это не страшно, главное восстановить синхронизацию) Может, запросить копию пакета? (но это долго, там уже следующие данные подпирают)
После диагностики я отказался от этих идей и решил, что надо устранять причину.
1. Заменил USB-кабель на тот, что мы ставим везде. Не помогло.
2. Отказался от сохранения данных "на лету", поскольку подозревал, что при выделении большого числа памяти могут возникать задержки. Стал полученные данные просто выбрасывать. Не помогло.
3. Отключил отладчик и дополнительную утилиту, которая постоянно дёргала ту программу, которая принимает данные. Не помогло.
Создавалось впечатление, что ошибка возникает несмотря ни на что. Но у наших пользователей это было бы заметно раньше. А у них ошибки не было.
Я взял свою программу и запустил на другом компьютере. Таком же, какой мы ставим пользователям. Спустя шесть часов передачи я был вынужден констатировать: ошибок нет.
Это наводило меня на подозрение, что дело в моей устаревшей операционной системе, т.к. пользователям мы ставим вин10, а на рабочем месте у меня вин7. Но это было странно, т.к. несколько лет назад, когда мы только вводили FTDI в эксплуатацию, ситуация была противоположная. Ошибки передачи возникали на вин8/вин10 при слишком большой скорости. А на вин7 при такой же скорости всё работало. В тот раз мы снизили скорость.
Но ладно. Главное, что у пользователей проблем не будет, а я свои тесты могут делать и короткими. Я перешёл к другим задачам, и всё же...
Через некоторое время я понял, что есть неучтённые факторы. Дело в том, что тот USB-кабель, который я заменил, был не единственным. Он втыкался не в компьютер, а в USB-хаб. Хаб был подключён к компьютеру через ещё один USB-кабель. То есть, в системе было ещё два звена, которые я не проверял.
Я подключил FTDI к компьютеру напрямую, в передний USB-порт.
И все ошибки передачи исчезли.