首页 > 解决方案 > 如何从串口读取数据?

问题描述

我写了一个简单的程序来发送我从串口读取的数据。我能够正确发送消息(并且我在另一台设备上正确接收到它),但是当我尝试阅读从另一台设备发送的消息时,它会出现错误:

Error reading: Resource temporarily unavailable

这是我的代码:

char port_name[] = "/dev/ttyACM0";

    int port = open(port_name, O_RDWR | O_NOCTTY | O_NDELAY);
    if(port < 0){
        fprintf(stderr, "Error opening: %s\n", strerror(errno));
    }
    struct termios settings;
    memset(&settings, 0, sizeof(settings));

    tcgetattr(port, &settings);

    cfsetispeed(&settings, B9600);
    cfsetospeed(&settings, B9600);
    settings.c_cflag &= ~PARENB;
    settings.c_cflag &= ~CSTOPB;
    settings.c_cflag &= ~CSIZE;
    settings.c_cflag |= CS8;
    settings.c_lflag &= ~(ECHO | ECHONL | ICANON | IEXTEN | ISIG);
    settings.c_cflag &= ~CRTSCTS;
    settings.c_cflag |= (CLOCAL | CREAD);
    settings.c_cc[VMIN] = 0;
    settings.c_cc[VTIME] = 10;

    tcflush(port, TCIFLUSH);
    int er = tcsetattr(port, TCSANOW, &settings);
    if(er < 0){
        fprintf(stderr, "Error set: %s\n", strerror(errno));
    }

    char* str = "ABCD";

    int res = write(port, str, strlen(str));
    if(res < 0){
        return;
    }

    char buffer[1000];
    memset(&buffer, '\0', sizeof(buffer));

    int n = read(port, &buffer, sizeof(buffer));
    if(n < 0){
        fprintf(stderr, "Error reading: %s\n", strerror(errno));
        return;
    }

    printf("Read %i bytes. Reseived message: %s", n, buffer);

    close(port);

我怎么能解决这个问题?

标签: clinuxlinux-kernelserial-portembedded

解决方案


您使用 来打开设备O_NDELAY,这会将描述符置于非阻塞模式。如果没有要读取EWOULDBLOCK的内容,则从read. 例如,您可以:

  • 从那里删除O_NDELAY这个简单的程序
  • 使用poll/ selectetc 等待描述符变得可读。

推荐阅读