问题描述
我编写了一个简单的程序来发送我从串行端口读取的数据。我能够正确发送消息(并且我在另一台设备上正确接收了它),但是当我尝试读取从另一台设备发送的消息时,它收到错误:
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
等来等待描述符变得可读。