C:read()挂起而没有从unix上的串口输入

时间:2012-10-01 18:05:37

标签: c unix serial-port

我在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);
}

但是 - 我的串行设备设置为发送"启动。\ r \ n"然后是"发送:",但是当我连接设备并启动程序时,我只得到第一行(" 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

这只会使情况变得更糟 - 我收到了�:(

我非常感谢任何帮助,提前谢谢!

1 个答案:

答案 0 :(得分:5)

看起来你的printf只是在它遇到换行符之前没有被刷新。这就是为什么你得到输出的第一部分,而不是第二部分。您可以在fflush(stdout)之后添加printf以立即查看输出。