0

デバイスと通信するための Linux プログラムを作成しました。Windows用のプログラムは「同じ」です(ロジックが同じであるため「同じ」です)。ソフトウェア (XOn/XOff) もハードウェア (RTS/CTS) フロー制御もなしで、9600 bps の 8N2 データ フレーム フォーマットを使用しています。RS-232 9 ピン D-sub の DTR、DCD、RI、DSR ピンは使用しません。デバイスとの通信には RX および TX ピンのみを使用します。Linux では、コードの次の部分があります。

 struct termios PortOpts, result;
 int fd; /* File descriptor for the port */

/* Configure Port */
 tcgetattr(fd, &PortOpts);
 // BaudRate - 9600
 cfsetispeed(&PortOpts, B9600);
 cfsetospeed(&PortOpts, B9600);
 // enable reciever and set local mode, frame format - 8N2, no H/W flow control
 PortOpts.c_cflag &= (~(CLOCAL | CREAD | CSIZE | CSTOPB));
 PortOpts.c_cflag |= ((CLOCAL | CREAD | CS8 | CSTOPB) & (~PARENB));
 PortOpts.c_cflag &= (~CRTSCTS);
// PortOpts.c_cflag &= ~PARENB
// PortOpts.c_cflag |= CSTOPB
// PortOpts.c_cflag &= ~CSIZE;
// PortOpts.c_cflag |= CS8;
 // no parity check, no software flow control on input
 PortOpts.c_iflag |= IGNPAR;
 PortOpts.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON | IXOFF | IXANY | INPCK);
 // raw data input mode
 PortOpts.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
 // raw data output
 PortOpts.c_oflag &= ~OPOST;
 // setting timeouts
 PortOpts.c_cc[VMIN] = 1; // minimum number of chars to read in noncanonical (raw mode)
 PortOpts.c_cc[VTIME] = 5; // time in deciseconds to wait for data in noncanonical mode (raw mode)

 if (tcsetattr(fd, TCSANOW, &PortOpts) ==  0) {
    tcgetattr(fd, &result);
    if ( (result.c_cflag != PortOpts.c_cflag) ||
         (result.c_oflag != PortOpts.c_oflag) ||
         (result.c_iflag != PortOpts.c_iflag) ||
         (result.c_cc[VMIN] != PortOpts.c_cc[VMIN]) ||
         (result.c_cc[VTIME] != PortOpts.c_cc[VTIME]) ) {
        perror("While configuring port1");
        close(fd);
        return 1;
    }
 } else {
    perror("While configuring port2");
    close(fd);
    return 1;
 };

ファイル記述子「fd」は「/dev/ttyS0」デバイス用です。次のメッセージが表示されます:ポート 2 の構成中に: 入力/出力エラー ラップトップを使用していますが、USB 以外のシリアル ポートはありません。これは理由ですか?プログラムを「ルート」として実行します。

壊れた英語で申し訳ありません。

4

1 に答える 1

1

プログラムで strace を実行できますか。これにより、IO エラーが発生している場所の詳細が得られます。

心に留めておくべきことの 1 つ - errno はリセットされないため、実際のエラーは、perror の前のシステム コールからのものである可能性があります。

于 2013-08-26T20:49:09.440 に答える