如何从串口读取数据?

问题描述

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

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,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);

我该如何解决

解决方法

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

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