Как отключить USB-устройство под Ubuntu и C / C ++ без перезагрузки - PullRequest
2 голосов
/ 10 марта 2012

Я использую программу на C с помощью termios для обмена информацией и командами между моим компьютером с Ubuntu и контроллером мотора USB.

Он отлично работает, и я могу успешно отправлять сообщения через последовательный порт;однако иногда случается, что, если я неправильно закрываю программу или что-то еще происходит, я больше не могу повторно подключиться к своему USB-устройству.

Чтобы снова подключиться к устройству,Мне нужно перезагрузить компьютер и снова запустить Ubuntu.

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

В первый раз я попытался убить все процессы (sudo killall -9 program_name), которые использовали порт usb, но порт все еще остается заблокированным, и мне нужно перезагрузить его.

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

Я подключаюсь к USB-порту (/ dev / ttyACM0) следующим образом:

handle = open(port.c_str(), O_RDWR |O_NOCTTY | O_NDELAY);

    if(handle == RQ_INVALID_HANDLE)

    {

        cout<<"failed."<<endl;

        return RQ_ERR_OPEN_PORT;

    }

1 Ответ

3 голосов
/ 17 марта 2012

Чтобы избежать использования вашего USB-контроллера, вы можете усилить свою программу, чтобы лучше справляться с ее завершением.

Создайте процедуру, которая будет выполнять очистку, т. Е. Закрытие USB-соединения. Давайте назовем это void cleanup(void) {}

Вы можете использовать функцию atexit из stdlib.h для регистрации функции, которая будет вызываться при завершении программы , обычно . Это означает, что через exit или return в основном. Смотрите atexit man page Например: int res = atexit(cleanup);

В случаях, когда ваша программа прерывается нерегулярно, например, через сигнал (например, SIGINT, когда вы нажимаете Ctrl + c), вы должны реализовать обработчики сигналов, чтобы справиться с этим. По сути, вы можете создать одну функцию-обработчик сигналов, которая будет вызывать только вашу процедуру очистки и регистрировать ее для всех сигналов, с которыми вы хотите иметь дело. Подробнее о том, как это сделать: учебник по обработке сигналов

Если ваша программа была прервана таким образом, который не может быть обработан, например, с помощью SIGKILL, вам придется либо перезагрузиться, либо посмотреть методы в посте, на который pmg ссылается в своем комментарии - они выглядят многообещающими .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...