2012-03-10 23 views
2

私は、termiosでCプログラムを使って、私のPCとUbuntuとUSBモータコントローラとの間で情報やコマンドを交換しています。リブートせずにUbuntuとC/C++でUSBデバイスを取り外す方法

これはうまく動作し、シリアルポート経由で正常にメッセージを送信できます。しかし、時々、間違った方法でプログラムを閉じたり、何か他のことが起こった場合、私はもうusbデバイスに再接続できません。

デバイスに再度接続できるようにするには、私のPCを再起動して、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ポートで頻繁に起こります。 –

+0

物理的にデバイスのプラグを抜く/プラグを差し込むとどうなりますか?デバイスは新しい '/ dev/xyz'に登録されますが、そのデバイスに接続できるはずです。 –

+0

毎回再起動するのを避けるのが良いでしょう! : –

答えて

3

あなたのUSB-コントローラが使用不能にすることを避けるために、あなたがプログラム終了とのより良い対処するためのプログラムを強化することができます。

クリーンアップ、つまりUSB接続を閉じるルーチンを作成します。 は、あなたがプログラムが正常にを終了したときに呼び出される関数を登録するSTDLIB.Hからatexit機能を使用することができますvoid cleanup(void) {}

それを呼ぶことにしましょう。これは、メインのexitまたはreturnのいずれかを意味します。 atexit man page 例えばを参照してください:あなたのプログラムが不規則に終了した場合については、int res = atexit(cleanup);

、などの信号を通じて(例えば、SIGINTにCtrl + cを打ったとき)、あなたはこれに対処するためにシグナルハンドラを実装する必要があります。基本的には、クリーンアップルーチンを呼び出すだけのシグナルハンドラ関数を作成し、それを処理したいすべてのシグナルに登録することができます。 これを行う方法の詳細:signal handler tutorial

プログラムがSIGKILLなどで処理できない方法で終了した場合は、再起動するか、ポストのメソッドを調べる必要がありますpmgは彼のコメントでリンクしている - 彼らは有望に見える。

関連する問題