2012-03-10 37 views
2

我使用termios的C程序在我的電腦與Ubuntu和USB電機控制器之間交換信息和命令。如何在Ubuntu和C/C++下拔出USB設備而不重新啓動

它工作的很好,我能夠通過串口成功發送消息;但是,有時會發生如果我以錯誤的方式關閉程序或發生其他事情,我無法再重新連接到我的USB設備。

爲了能夠再次連接到設備,我必須重新啓動我的電腦,並重新啓動Ubuntu的。

我想避免這個問題,並找到一個解決方案,以再次啓用USB端口,而無需每次都重新啓動我的系統。

在第一次,我試圖殺死所有使用USB端口的進程(sudo killall -9 program_name),但端口仍然被阻塞,我必須重新啓動它。

你能否建議我一些避免重啓的解決方案? 爲什麼會發生?

我以這種方式連接到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。它經常發生在我的Arduino USART端口上。 – 2012-03-10 10:29:57

+0

如果您物理拔下/插入設備會發生什麼?我希望,該設備將被註冊在一個新的'/ dev/xyz'上,但你應該能夠連接到該設備。 – 2012-03-10 10:33:56

+0

這將是很好,避免每次重新啓動! :( – 2012-03-10 10:34:03

回答

3

爲了避免讓您的USB控制器無法使用,則可以強化你的程序,以更好地處理程序終止。

創建一個例程,即清理,即關閉USB連接。 我們稱之爲void cleanup(void) {}

可以使用atexit功能stdlib.h中註冊一個功能,當程序終止通常將被調用。這意味着主要通過exitreturn。見atexit man page 例如爲:int res = atexit(cleanup);

對於情況下,如果你的程序是通過信號不規則終止,像(例如,SIGINT當你按下CTRL + C),您必須實現信號處理程序來處理這個問題。基本上你可以創建一個信號處理函數,它只調用你的清理程序並註冊到你想要處理的所有信號。 有關如何執行此操作的更多詳細信息:signal handler tutorial

如果您的程序以某種方式終止,例如使用SIGKILL無法處理,您必須重新啓動或查看發佈中的方法pmg與他的評論有關 - 他們看起來很有前途。

相關問題