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