3

私は現在、UARTインターフェイスを介してATインターフェイスと通信する必要があるプログラムを作成しています(オペレーティングシステムはLinuxです)。select()しかし、ファイル記述子での使用に問題があります。何らかの理由で、selectはファイル記述子を読み取る準備ができているとは見なしませんが、問題を絞り込むために、次のプログラムを使用しました。

int main()
{
    char buffer[BSIZE];
    fd_set rfds;
    int ret;
    struct termios cnf;
    struct timeval tv;

    fd = open("/dev/ttyO1", O_RDWR);
    // Have also tried to set fd = 0 for stdin, as a reference
    signal(SIGINT, sig_handler);
    tcgetattr(fd, &cnf);
    old = cnf;
    cfmakeraw(&cnf);
    tcsetattr(fd, TCSANOW, &cnf);
    while (1) {
        tv.tv_sec = 5;
        tv.tv_usec = 0;
        FD_ZERO(&rfds);
        FD_SET(0, &rfds);
        write(fd, "AT\r", 3);
        ret = select(fd+1, &rfds, NULL, NULL, &tv);
        printf("ret = %d\n", ret);
        if (ret < 0) {
            perror("select()");
        }
        else {
            ret = read(fd, buffer, BSIZE-1);
            buffer[ret] = '\0';
            printf("read: \"%s\"\n", buffer);
        }
    }
    return 0;
}

実行は次のようになります

    root@linux:~# ./stuff
    ret = 0
    read: "AT
    OK
    "

これは、selectがデータがないと考えているが、読み取ろうとするとデータがあることを示しています。これは私には非常に奇妙に思えます。また、ttyをstdinと交換しようとしましたが、これは問題なく機能します。

コードはTexasInstrumentsEZSDK PSPカーネルで実行されていますが、それは問題ではないはずです。また、stty設定は以下のようになります

    root@linux:~# stty -aF /dev/ttyO1
    speed 9600 baud; rows 24; columns 80;
    intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
    eol2 = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;
    lnext = ^V; flush = ^O; min = 1; time = 0;
    -parenb -parodd cs8 hupcl -cstopb cread clocal -crtscts
    -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
    -iuclc -ixany -imaxbel
    opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
    isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
    echoctl echoke

私はいくつかの重要な旗を逃したことがありopen()ますか?または、?を使用して設定する必要がありtermiosますか?この方法には特別なハードウェアが必要ですか?

編集:プログラムを実行しようとすると同じ問題/dev/ttyUSB0が発生します。これもATインターフェイスです。それはtty関連しているように私には思えます。

fdを実際に使用して疑問に思ったものに変更しました。

4

2 に答える 2

4

シリアルポートのファイル記述子をfdセットに追加しません。

行を変更します。

FD_SET(0, &rfds);

に:

FD_SET(fd, &rfds);

または、セットにfdゼロが必要な場合は、次の行を追加します。

FD_SET(fd, &rfds);
于 2012-08-16T13:14:04.687 に答える
0

/ dev/tty01ではなく/dev/ttyS1である必要があると思います。組み込みボードのUARTに接続されているVT(仮想端末)を選択しようとしていますが、これは同じことではありません。

于 2012-08-16T12:27:57.323 に答える