如何从串口读取数据?
How read data from serialport?
我写了一个简单的程序来发送我从串口读取的数据。我能够正确发送消息(并且我在另一台设备上正确地收到了它),但是当我尝试读取从另一台设备发送的消息时出现错误:
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, '[=11=]', 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
打开了设备,这将描述符置于非阻塞模式。如果没有可读取的内容,则从 read
返回 EWOULDBLOCK
。例如,您可以:
- 从那里删除
O_NDELAY
这个简单的程序
- 使用
poll
/select
等等待描述符变得可读。
我写了一个简单的程序来发送我从串口读取的数据。我能够正确发送消息(并且我在另一台设备上正确地收到了它),但是当我尝试读取从另一台设备发送的消息时出现错误:
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, '[=11=]', 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
打开了设备,这将描述符置于非阻塞模式。如果没有可读取的内容,则从 read
返回 EWOULDBLOCK
。例如,您可以:
- 从那里删除
O_NDELAY
这个简单的程序 - 使用
poll
/select
等等待描述符变得可读。