USB-концентратор теряет данные с адаптеров USB-Serial

USB-концентратор теряет данные с адаптеров USB-Serial

В настоящее время я проектирую систему, которая должна получать данные с последовательных устройств (в основном с плат ARM). Для этого я использую несколько адаптеров USB-to-Serial (FTDI232). Я написал простую программу обратной связи (9600 бод) для проверки настройки, прошил плату ARM и успешно смог получить все, что я отправил, без потери данных.

Однако эта система в конечном итоге потребует взаимодействия со многими платами. Поэтому я подключил USB-концентратор к порту USB и использовал его для подключения большего количества плат. Однако через несколько дней мы заметили некоторые проблемы. Сначала казалось, что у нас было несколько битфлипов. Затем оказалось, что даже целые байты теряются, когда мы получаем сообщения от плат. Когда мы подключили эти адаптеры к обычным USB-портам (без промежуточного концентратора), проблема исчезла.

Мы предположили, что это проблема буферизации. Возможно, последовательный контроллер или устройство отправляют свои данные слишком быстро. Поэтому мы установили управление потоком RTS/CTS на последовательной стороне. Опять же, байты были потеряны USB-концентраторами, а не когда последовательный адаптер подключен напрямую к ПК.

Мы поменяли USB-хаб на более дорогой, но это ничего не изменило. Мы поменяли ПК, но это тоже не решило проблему. Кроме того, сбивает с толку то, что хаб не отбрасывает пакеты, которые мы отправляем на последовательный адаптер, а только те пакеты, которые отправляет последовательный адаптер.

Кто-нибудь знает, как решить эту проблему или в чем ее причина? Мы думаем, что причиной является USB-концентратор. Однако мы зависим от него, так как нам придется подключать много устройств. Поэтому, прежде чем мы создадим собственное решение для последовательной обработки (на основе выделенной FPGA или Pi), я хотел бы спросить, может ли кто-нибудь здесь знать, в чем дело? Существуют ли файлы конфигурации Linux, которые, возможно, позволяют ускорить опрос (если это проблема опроса)? Я думаю, что проблема не в последовательном адаптере.

решение1

Для этого я использую несколько адаптеров USB-to-Serial (FTDI232).

Приобретите лучшие адаптеры, которые используют протокол USB 2.0 HS. Одна из проблем с устройствами FS через концентраторы HS заключается в том, что хост должен использовать протокол разделенных транзакций, который известен трудностями реализации из-за ужасной сложности. Я бы не стал делать никаких ставок на то, что механизм разделенных транзакций когда-либо тестировался на большом количестве паршивых мостов FS UART.

Другое дело, что многие концентраторы USB 2.0 имеют один TT, поэтому общая производительность отстой, а буферизация/планирование должны быть очень осторожны. Опять же, с безумным протоколом опроса CDC все ставки должны быть отменены. Купите лучший мост USB-UART, что-то на основе FT232H.

Разница между прямым подключением к хосту и подключением через USB-концентратор заключается в том, что в случае хоста транзакции выполняются напрямую в собственном протоколе FS, тогда как для подключения через концентраторы требуется специальный драйвер, который работает с разделенными транзакциями. У вас может быть слабый драйвер разделенной транзакции.

решение2

Будьте осторожны при смешивании USB2 и USB3 устройств и интерфейсов. Из-за такого смешивания могут возникнуть некоторые проблемы. Кроме того, помните, что некоторые USB-хабы просто дерьмо.

Связанный контент