2

私はtermiosを備えたCプログラムを使用して、Ubuntuを搭載したPCと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;

    }
4

1 に答える 1

3

USBコントローラが使用できなくなるのを防ぐために、プログラムを強化して、プログラムの終了をより適切に処理することができます。

クリーンアップ、つまりUSB接続を閉じるルーチンを作成します。それを呼びましょうvoid cleanup(void) {}

stdlib.hの関数を使用して、プログラムが正常atexitに終了したときに呼び出される関数を登録できます。つまり、どちらかまたはメインを介して。atexitのマニュアルページを参照してください。 例:exitreturnint res = atexit(cleanup);

シグナル(たとえば、Ctrl + cを押したときのSIGINT)など、プログラムが不規則に終了する場合は、これに対処するためにシグナルハンドラーを実装する必要があります。基本的に、クリーンアップルーチンを呼び出して処理するすべてのシグナルに登録するだけのシグナルハンドラー関数を1つ作成できます。その方法の詳細:シグナルハンドラチュートリアル

プログラムが処理できない方法で終了した場合、たとえばSIGKILLを使用した場合は、再起動するか、pmgがコメントでリンクしている投稿のメソッドを確認する必要があります。これらは有望に見えます。

于 2012-03-16T23:37:06.693 に答える