3

私は、いくつかの XBee を使用した私の小さなプロジェクトにかなり長い間取り組んできました。これまで、すべてのコードがテストされ、UBUNTU-SERVER 10.04 LTS で動作しており、シリアル USB シミュレーション/変換にlibftdiライブラリを使用しています。

今週の初めに、同じライブラリ バージョンのlibftdiを使用して、kubuntu 12.04 make を使用してラップトップでまったく同じコードを使用しようとしました。

問題は、Satellite L755 - 18K ラップトップで、 /dev/ttyUSB0にあるXBee デバイスを開こうとするたびに、「Bad file descriptor」が表示されることです。からのログメッセージからdmesg、デバイスはまったく正常に登録されており、指を置くことができないようです。

これは、デバイスを開くために使用されるコードの一部です。

cfmakeraw(&tio);
cfsetospeed(&tio,B9600);            // 9600 baud
cfsetispeed(&tio,B9600);            // 9600 baud
tio.c_cc[VMIN]=0;
tio.c_cc[VTIME]=10;

serial_fd=open("/dev/ttyUSB0", O_RDWR);

tcsetattr(serial_fd,TCSANOW,&tio);


if (serial_fd < 0){

    cout << "Error while opening device... " << "errno = " << errno << endl;

    printf("Something went wrong with open()! %s\n", strerror(errno));
    exit(1);
}

この件に関するご意見は大歓迎です。

よろしく

4

2 に答える 2

5

問題は、呼び出して順番に実行していてopen()tcsetattr()後でファイルのエラー状態を確認するだけであるということです。

open()何らかの理由で失敗したと考えてください。その理由に戻っ-1て設定します。ただし、それにもかかわらず、errno質問のコードは呼び出しに進みますが、これ失敗します。これは私たちの場合であり、理由で上書きされます ( ,は有効なファイル記述子ではありません)。tcsetattr()serial_fd-1errnoEBADF-1

代わりに、ファイルを開いた直後にエラー状態を確認する必要があります。

serial_fd = open("/dev/ttyUSB0", O_RDWR);
if (serial_fd < 0) {
    cout << "Error while opening device... " << "errno = " << errno << endl;
    perror("Something went wrong with open()");
    exit(1);
}

そして、次のように発行します。

tcsetattr(serial_fd, TCSANOW, &tio);
于 2012-07-10T22:11:16.870 に答える
3

回答を見てFrédéric's、デバイスを開く権限があることを確認してください。システムにアクセスするには (おそらく書き込み権限を取得するためだけに) root になる必要があります/dev/ttyUSB0。Debianでは通常のユーザーとして開くことができたので、ディストリビューションに依存していると思いますが、Archディストリビューションでルートになる必要があります。/dev/ttyUSBx のグループとパーミッションを調べることで修正できる可能性があります。

EDIT:実際には、簡単なテストプログラムでファイル記述子を取得できるため、私の場合は説教固有の問題である可能性があります。

簡単な解決策は、プログラムをルートとして実行することです。

于 2012-07-10T22:36:10.190 に答える