Как (почти) предотвратить потерю данных при приеме FT232R (uart)?

Мне нужно передать данные с микроконтроллерной системы с голым железом на ПК с Linux со скоростью 2 МБод. В настоящее время на компьютере с Linux установлена ​​32-битная версия Kubuntu14.04.

Чтобы заархивировать это, я попытался использовать адаптер USB-UART на базе FT232R, но иногда наблюдал потерю данных.

Пока компьютер с Linux в основном простаивает, кажется, что он работает большую часть времени; однако я вижу редкую потерю данных.

Но когда я принудительно загружаю процессор (например, перестраиваю свой проект), потеря данных значительно увеличивается.

После некоторого исследования я прочитал здесь, что FT232R состоит из приемный буфер объемом всего 384 байта. Это означает, что FT232R должен считываться (USB-опрос) как минимум каждые 1,9 мс. Что ж, FTDI рекомендует использовать управление потоком, но из-за используемой системы микроконтроллера я не могу использовать какое-либо управление потоком.

Я могу смириться с тем фактом, что нет абсолютной гарантии отсутствия потери данных. Но наблюдаемый объем потери данных слишком велик для моих нужд.

Поэтому я попытался найти способ повысить приоритет «драйвера FT232» в моем Linux, но не могу найти, как это сделать. Это не описано в Руководстве по установке драйверов AN220 FTDI для Linux и в документе AN107 FTDI Advanced Driver Options есть заголовок «Смена драйвера Приоритет », но только для windows.

Итак, кто-нибудь знает, как повысить приоритет драйвера FT232R в Linux?

Есть ли другие идеи для решения этой проблемы?

Кстати: когда я читал таблицу данных FT232H, мне показалось, что это поставляется с буфером приема 1 КБ. Я бы заказал его прямо сейчас и посмотрел, как он себя ведет. Изменить: без значительных улучшений.


person Joe    schedule 09.11.2015    source источник
comment
Вы можете посмотреть drivers/usb/serial/ftdi_sio.c и связаться с автором этого драйвера по поводу вашей проблемы.   -  person fghj    schedule 09.11.2015
comment
Джо, просто подумайте, не думали ли вы обернуть свое UART-соединение какой-нибудь урезанной версией протокола TCP?   -  person Borgboy    schedule 09.11.2015
comment
@Borgboy: Вы имели в виду, что я должен использовать модуль Tcp-Uart вместо Usb-Uart? Не могли бы вы порекомендовать тот, который рассчитан на 2 Мбод?   -  person Joe    schedule 09.11.2015
comment
@Joe: Нет, я имею в виду, что вы, возможно, захотите рассмотреть программный механизм установления связи между Usb-UART и вашим микроконтроллером. Я действительно думаю, что увеличение буфера приема значительно поможет. Из любопытства, у вашего микроконтроллера есть внешняя оперативная память? Вот мой EvK, который предоставляет MCU, SRAM и UART2USB на одной плате: ссылка. Он разработан специально для сбора и передачи больших объемов данных.   -  person Borgboy    schedule 10.11.2015
comment
Ладно, понял. Но, к сожалению, у меня нет абсолютно никакого контроля над данными, которые будут записаны микроконтроллером. Микроконтроллер просто перекачивает данные на вывод TX UART, и я должен (попытаться) все это поймать.   -  person Joe    schedule 11.11.2015
comment
как насчет реализации управления потоком RTS / CTS?   -  person Luka Rahne    schedule 11.11.2015
comment
Конечно, обычно это предпочтительный способ. Но в этом случае мне не разрешено останавливать выходной поток микроконтроллера.   -  person Joe    schedule 11.11.2015
comment
Мне не разрешено останавливать выходной поток микроконтроллера. Кто этого не позволяет? В этом нет никакого смысла. Вы не можете реализовать надежную связь без контроля потока, и точка. Вы буквально отправляете данные в полный буфер на стороне FTDI. Это приведет к повреждению ваших данных, если вы не используете фреймовый протокол связи с проверкой ошибок и восстановлением (или, по крайней мере, устойчивостью). Каждая реализация FTDI, которая хотя бы не направляет вывод RTS # на MCU, в корне ломается, и это не может быть исправлено.   -  person Kuba hasn't forgotten Monica    schedule 13.11.2015
comment
Устройство без покрытия отправляет данные отладки / записи в журнал через этот uart, и это не находится под моим контролем. На данный момент я стараюсь установить дополнительный микроконтроллер между этим устройством и FT232R с достаточно большими буферами (например, 64 КБ), а затем я могу использовать rts / cts между этим устройством и FT323R.   -  person Joe    schedule 15.11.2015
comment
Скорость FT232R в Windows ограничена 0,9 Мбод. CP2104 должен делать 1,8 Мбод.   -  person MadeInTheUSB    schedule 06.02.2017
comment
Я использую FT232R со скоростью до 3 Мбод в Linux / FreeBSD / macOS и FT232H со скоростью до 12 Мбод.   -  person Joe    schedule 07.02.2017


Ответы (1)


Если вам нужна надежная передача данных, нет абсолютно никакого способа правильно использовать любой мост USB-последовательный порт без аппаратного управления потоком данных и без выделения по крайней мере всей оставшейся оперативной памяти в микроконтроллере в качестве последовательного буфера ( или, по крайней мере, до тех пор, пока вы не сможете хранить данные на ~ 1 с).

Я использую устройства FTDI с тех пор, как FT232AM был модной новинкой, и вот как я их реализую:

  1. (По крайней мере) четыре линии проходят между мостом и MCU: RXD, TXD, RTS #, CTS #.

  2. Управление потоком включено на стороне ПК.

  3. Управление потоком включено на стороне MCU.

  4. Код MCU отправляет сообщения только тогда, когда он может вместить полный ответный пакет в буфер. В противном случае он дает возможность ПК по тайм-ауту и ​​повторяет запрос. Для запросов, передающих данные обратно, весь кадр отбрасывается, если он не может поместиться в буфере передачи в то время, когда кадр готов.

  5. Если вы хотите, чтобы ПК надежно уведомлялся о новых данных, скажем, о каждом количестве полных выборок / кадров, вы должны использовать символы событий для сброса буферов FTDI в hist и кодирования ваших данных. HDLC отлично подходит для этой цели и документирован в бесплатных стандартах (RFC и серии ITU X и Q - все бесплатно!).

  6. Драйвер VCP или запуск порта D2XX настроен так, чтобы размеры передачи и задержки были установлены в соответствии с потребностями приложения.

  7. Протокол связи оформлен с помощью CRC. Я обычно использую урезанную версию, если X.25 / Q.921 / HDLC, ограниченный режимом SNRM (E) для простых «глупых» устройств команд и ответов, и SABM (E) для устройств, которые передают данные.

Размер буферов FTDI не имеет значения, ваш MCU должен иметь как минимум на порядок больше памяти, доступной для буферизации вещей.

Если вы работаете с кодом реального времени, например, с обработкой сигналов, убедитесь, что вы учитываете накладные расходы, связанные с множеством прерываний передачи, выполняемых «спина к спине». Как только устройство FTDI очищает свои буферы после передачи USB и указывает, что оно готово к приему дополнительных данных от вашего MCU, ваш код потенциально может передать данные всего буфера FTDI за один раз.

Если у вас почти закончились циклы в вашем коде реального времени, вы можете использовать таймер в качестве источника прерываний передачи вместо прерывания UART. Затем вы можете установить частоту таймера намного ниже, чем скорость UART. Это позволяет замедлить темп передачи без снижения скорости передачи. Если вы работаете в режиме настройки / подготовки к работе или с более низкой нагрузкой на задачи в реальном времени, вы можете тривиально увеличить скорость передачи без изменения скорости передачи. Вы можете использовать аналогичный трюк для ускорения приема, переключая выход RTS # на MCU под управлением таймера. Конечно, это не проблема, если вы используете DMA или достаточно быстрый MCU.

Если у вас закончились таймеры, обратите внимание, что многие другие периферийные устройства также можно использовать в качестве источников прерываний таймера.

Этот совет применим независимо от того, что является хостом USB.

Боковая панель: По общему признанию, "архитектура" последовательного USB-драйвера Linux находится в состоянии приостановленной анимации, насколько я могу судить, поэтому для получения разумных результатов может потребоваться много работы. Боюсь, дело не в простом изменении приоритета потока ядра. Частично причина в том, что финансирование многих работ по Linux сосредоточено на серверных / корпоративных приложениях, и там производительность USB в лучшем случае является второстепенным вопросом. Он работает достаточно хорошо для USB-накопителя, но последовательный USB-порт - это беспорядок, на который никто не обращает внимания, и на то, чтобы это исправить. Вы только посмотрите, сколько копи-макарон в этом отделе ...

person Kuba hasn't forgotten Monica    schedule 13.11.2015