3

Ubuntu12システムでCを使用してシリアルポートからデータを取得する際に問題が発生します。

私はopen()とread()を使用しています、そしてここに私のコードがあります:

Fd = open("/dev/ttyUSB0", O_RDONLY | O_NOCTTY);
if (Fd == -1) {
    printf("Could not open serial port: %s\n", strerror(errno));
    return 1;
}

fcntl(Fd, F_SETFL, 0);

char buf;
while (1) {
    read(Fd, &buf, 1);
    printf("%c", buf);
}

ただし、シリアルデバイスは「Boot。\ r \ n」に続いて「Tosend:」を送信するように設定されていますが、デバイスを接続してプログラムを起動すると、最初の行(「Boot。」)のみが表示され、次にもういや。gtkterm / picocomを起動すると、すぐに両方の行が表示されます。

また、以下を使用して、ポートを適切に閉じるためにSIGTERMのシグナルハンドラーを追加しようとしました。

void signal_callback_handler(int signum) {
    printf("Caught SIGTERM\n");
    close(Fd);
    exit(signum);
}

signal(SIGINT, signal_callback_handler);

これを使用すると、CTRL-Cを押すと次のようになります。

Boot.
^CTo send: Caught SIGTERM

また、最初に次を使用してポートを設定してみました。

struct termios port_settings;          // structure to store the port settings in
cfsetispeed(&port_settings, B115200);  // set baud rates
cfsetospeed(&port_settings, B115200);
port_settings.c_cflag &= ~PARENB;      // set no parity, stop bits, data bits
port_settings.c_cflag &= ~CSTOPB;
port_settings.c_cflag &= ~CSIZE;
port_settings.c_cflag |= CS8;
tcsetattr(Fd, TCSANOW, &port_settings);// apply the settings to the port

これは状況を悪化させるだけです-私は�:(でスパムされます

よろしくお願いします。

4

1 に答える 1

5

printf改行に達するまでフラッシュされていないようです。そのため、出力の最初の部分は取得されますが、2番目の部分は取得されません。fflush(stdout)の後に追加しprintfて、出力をすぐに確認できます。

于 2012-10-01T18:12:39.443 に答える