c - 如何从串口读取数据?
问题描述
我写了一个简单的程序来发送我从串口读取的数据。我能够正确发送消息(并且我在另一台设备上正确接收到它),但是当我尝试阅读从另一台设备发送的消息时,它会出现错误:
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);
我怎么能解决这个问题?
解决方案
您使用 来打开设备O_NDELAY
,这会将描述符置于非阻塞模式。如果没有要读取EWOULDBLOCK
的内容,则从read
. 例如,您可以:
- 从那里删除
O_NDELAY
这个简单的程序 - 使用
poll
/select
etc 等待描述符变得可读。
推荐阅读
- flutter - 标签栏颤动错误在页面之间切换
- jpa - 通过 JPA 存储库在运行时通过 And 或 Or 创建条件
- regex - 如何修改此正则表达式以允许在电子邮件的用户名中使用点 (.)
- python - 你如何用一组子集的平均值填充 NaN?
- python - 如何测试包含不同日期的 datetime.now() 的 python 方法?
- time-complexity - 在某些位置应用 if 语句生成所有可能序列的复杂性是什么
- c# - 尝试使用 autofac 在测试类中注入模拟实例,但容器在其他测试类中注入相同的实例
- xml - 使用 xslt 编码查找具有值的所有元素名称
- c# - 如何从特征提取中找到匹配的数量?
- ios - Swift 4 - NSURLComponents 使用正斜杠设置密码