2012-03-10 5 views
2

Я использую программу C с терминами для обмена информацией и командами между моим компьютером с Ubuntu и контроллером двигателя USB.Как отключить USB-устройство под Ubuntu и C/C++ без перезагрузки

Он отлично работает, и я могу успешно отправлять сообщения через последовательный порт; однако иногда бывает так, что если я закрываю программу неправильно или что-то еще происходит, я больше не могу подключаться к своему 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; 

    } 
+0

+1. Это часто случается с моим портом USART Arduino. –

+0

Что произойдет, если вы физически отключите/подключите устройство? Я ожидаю, что устройство будет зарегистрировано на новом '/ dev/xyz', но вы должны иметь возможность подключиться к этому устройству. –

+0

было бы неплохо избежать перезагрузки каждый раз! :( –

ответ

3

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

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^