无法读取串行数据:read()无限期地等待

时间:2016-10-22 20:59:14

标签: c linux serial-port

我正在尝试使用c编程在linux上读/写串行数据。我可以成功打开端口并设置属性。但是当我尝试读取串行数据时,read()系统调用无限期地等待。无法理解为什么会这样。

为了测试串行通信,我使用的是具有9600波特和8N1配置的arduino。

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#include <errno.h>

int init(char *port);
void reads(int fd);

int main(int argc, char *argv[]){
    int fd;

    fd = init(argv[1]);

    fprintf(stdout, "\n\n####### DATA ########\n\n");
    reads(fd);

    close(fd);

    return EXIT_SUCCESS;
}

int init(char *port){
    int fd;
    struct termios topt;

    fd = open(port, O_RDWR | O_NONBLOCK);
    if(fd < 0){
        fprintf(stderr, "init error: can't open port %s\n!", port);
        exit(1);
    }

    if(tcgetattr(fd, &topt) < 0){
        fprintf(stderr, "init error: can't get terios attributes!\n");
        exit(1);
    }

    topt.c_cflag &= ~CRTSCTS;
    topt.c_cflag |= CREAD | CLOCAL;
    topt.c_cflag &= ~(IXON | IXOFF | IXANY);
    topt.c_cflag &= ~(ICANON | ECHO | ECHOE | ISIG);
    topt.c_cflag &= ~OPOST;

    cfsetispeed(&topt, B9600);
    cfsetospeed(&topt, B9600);

    topt.c_cflag &= ~PARENB;
    topt.c_cflag &= ~CSTOPB;
    topt.c_cflag &= ~CSIZE;
    topt.c_cflag |= CS8;

    topt.c_cc[VMIN] = 1;
    topt.c_cc[VTIME] = 0;

    tcsetattr(fd, TCSANOW, &topt);
    if(tcsetattr(fd, TCSAFLUSH, &topt) < 0){
        fprintf(stderr, "init error: can't set attributes!\n");
        exit(1);
    }
}

void reads(int fd){
    char rdbuff[1];

    while(read(fd, rdbuff, 1) > 0){
        fprintf(stdout, "%c", rdbuff[0]);
    }
}

谢谢!

0 个答案:

没有答案