3

我在 Ubuntu 12 系统上使用 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”后跟“To send:”,但是当我连接设备并启动程序时,我只得到第一行(“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的只是没有被刷新,直到它碰到换行符。这就是为什么你得到输出的第一部分,而不是第二部分的原因。您可以fflush(stdout)在您之后添加printf以立即查看输出。

于 2012-10-01T18:12:39.443 回答