4.6.4. Автовосстановление USB соединения

Данный блок предназначен для перезагрузки USB шины в случае потери связи (к примеру, это может возникнуть в случае удара статическим разрядом или отключения шины USB без отключения питания). Включение/выключение данного блока определяется флагом USB_BREAK_RECONNECT (см. Критические параметры). Если блок включен, то он отслеживает потерю связи по шине USB. В случае потери связи по шине USB через 500 мс выполняется программное переподключение к шине USB со стороны контроллера, после чего выполняется проверка состояния шины USB. Если в течение определенного времени не происходит восстановление связи (т.е. обмена даными), то выполняется повторное переподключение. Таким образом в случае не восстановления связи по USB, контроллер будет постоянно переподключаться к шине USB до тех пор, пока не произойдет восстановления связи по USB или время между переподключениями не превысит 1 минуты. В итоге в случае отключения шины USB без отключения питания контроллера (к примеру, в случае управления двигателем от джойстика или кнопок) в течение примерно 5 минут контроллер будет находиться в режиме переподключения шины USB.

Примечание

Режим переподключения шины USB никаким образом не влияет на основные характеристики контроллера (к примеру, движение или удержание необходимого тока в обмотках).

Чтобы избежать синхронного переподключения к шине USB как со стороны контроллера, так и со стороны компьютера, время между переподключениями меняется по экспоненциальному закону (см. Задержка между переподключениями USB).

Задержка между переподключениями USB
Номер перезагрузки время ожидания, мс
0 (после потери связи) 500
1 483
2 622
3 802
4 1034
5 1333
6 1718

Визуально определить состояние блока перезагрузки USB можно по частоте мигания светодиода. В случае перехода в режим перезагрузки светодиод начнет мигать с частотой 10Гц (см. Индикация режима работы).

Предупреждение

В силу особенностей строения данного программного блока, а также спецификации шины USB, блок не гарантирует \(100\%\) восстановление связи с компьютером после удара статическим разрядом.

Со стороны компьютера Xilab также производит попытки восстановления соединения с контроллером, если оно по каким-либо причинам было потеряно. При потере соединения, то есть если библиотека libximc вернула кода ошибки «result_nodevice», сначала происходит ожидание 1000мc. Затем, если платформа на которой запущен Xilab принадлежит семейству Windows, средствами WINAPI опрашивается наличие устройства с соответствующим именем COM-порта в системе. Если такой порт присутствует, но библиотека libximc не может открыть его более двух раз, то вызывается функция ximc_fix_usbser_sys, которая производит ресет драйвера usbser.sys (исправление ошибки драйвера). На платформе Linux или MacOS Xilab просто пытается повторно открыть устройство каждые 1000 мс. После успешного открытия в устройство посылаются команды чтения серийного номера, версии прошивки и некоторых настроек, необходимых для отображения интерфейса.

Библиотека libximc считает устройство потерянным (result_nodevice) когда системные функции ReadFile/WriteFile (на Windows) или read/write (на Linux/Mac) возвращают ошибку при чтении или записи данных в соответствующий USB-COM порт.