USB-концентратор сбрасывает данные с USB-последовательных адаптеров
В настоящее время я разрабатываю систему, которая должна получать данные от последовательных устройств (в основном, плат ARM). Для этого я использую некоторые адаптеры USB-to-Serial (FTDI232). Я запрограммировал простую петлевую программу (9600 бод), чтобы протестировать настройку, прошил плату ARM и смог успешно принимать все, что я отправлял, без потери данных.
Однако эта система в конечном итоге потребует связи со многими досками. Поэтому я подключил USB-концентратор к USB-порту и использовал его для подключения большего количества плат. Однако через несколько дней мы заметили некоторые проблемы. Сначала казалось, что у нас было несколько бит-флипов. Потом оказалось, что даже целые байты сбрасываются, когда мы получаем сообщения с форумов. Когда мы подключили эти адаптеры к обычным USB-портам (без промежуточного концентратора), проблема исчезла.
Мы предположили, что это проблема буферизации. Возможно, последовательный контроллер или устройство отправляют свои данные слишком быстро. Поэтому мы установили управление потоком RTS/CTS на последовательной стороне. Опять же, байты были сброшены USB-концентраторами, а не тогда, когда последовательный адаптер подключен напрямую к ПК.
Мы переключили USB-концентратор на более дорогой, но это ничего не изменило. Мы поменяли ПК, но это тоже не решило проблему. Кроме того, сбивает с толку тот факт, что концентратор не отбрасывает пакеты, которые мы отправляем последовательному адаптеру, а только пакеты, которые отправляются последовательным адаптером.
Кто-нибудь знает, как я мог решить эту проблему, или чем вызвана проблема? Мы думаем, что USB Hub вызывает это. Однако мы зависим от этого, так как нам придется подключать множество устройств. Поэтому, прежде чем мы создадим наше собственное решение для последовательной обработки (на базе FPGA или Pi), я хотел спросить, может ли кто-нибудь здесь знать, что случилось? Существуют ли файлы конфигурации Linux, которые могут позволить более быстрый опрос (если это проблема опроса)? Я думаю, что последовательный адаптер не проблема здесь.
2 ответа
Для этого я использую некоторые адаптеры USB-to-Serial (FTDI232)
Получите лучшие адаптеры, которые используют протокол USB 2.0 HS. Одна вещь с устройствами FS через концентраторы HS состоит в том, что хост должен использовать протокол разделения транзакций, который известен трудностями реализации из-за ужасной сложности. Я бы не стал делать ставки на то, что механизм разделения транзакций когда-либо тестировался на большом количестве дрянных мостов FS UART.
Другое дело, что многие концентраторы USB 2.0 имеют один TT, поэтому общая производительность отстой, и буферизация / планирование должны быть очень осторожными. Опять же, при сумасшедшем протоколе опроса CDC все ставки должны быть отключены. Получите лучший мост USB-UART, основанный на FT232H.
Разница между прямым подключением к хосту и подключением через USB-концентратор заключается в том, что в случае хоста транзакции выполняются непосредственно в собственном протоколе FS, тогда как для подключения через концентраторы требуется специальный драйвер, который работает с разделенными транзакциями. Возможно, у вас слабый драйвер транзакции с разделением.
Будьте осторожны при смешивании USB2 и USB3 устройств и интерфейсов. Некоторые проблемы могут возникнуть из-за такого перемешивания. Кроме того, помните, что некоторые USB-концентраторы просто дерьмо.