gpt4 book ai didi

serial-port - UART测试程序,读写: resource temporarily unavailable

转载 作者:行者123 更新时间:2023-12-05 04:12:47 32 4
gpt4 key购买 nike

我正在尝试在 Raspberry Pi 3 中通过 UART 发送和接收字符串。我已经连接了 Pi 的 TX 和 RX 引脚,但是当程序运行时出现错误:

Read failed: Resource temporarily unavailable

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>

int main(int argc, char ** argv) {
int fd;
// Open the Port. We want read/write, no "controlling tty" status, and open it no matter what state DCD is in
//fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
fd = open("/dev/ttyS0", O_RDWR);
if (fd == -1) {
perror("open_port: Unable to open /dev/ttyS0 - ");
return(-1);
}

// Turn off blocking for reads, use (fd, F_SETFL, FNDELAY) if you want that
fcntl(fd, F_SETFL, 0);
while(1){
//for(int k=0; k<10; k++){
// Write to the port
int n = write(fd,"hello",6);
if (n < 0) {
perror("Write failed - ");
return -1;
}
// Read up to 255 characters from the port if they are there
char buf[256];
n = read(fd, &buf, 255);
if (n < 0) {
perror("Read failed - ");
return -1;
}
else if (n == 0) {
printf("No data on port\n");
}
else {
buf[n] = '\0';
printf("%i bytes read : %s", n, buf);
}
}
close(fd);
return 0;
}

最佳答案

EAGAIN 错误只应在非阻塞读取时发生。
当错误发生时,您需要添加代码来检查文件状态标志:

val = fcntl(fd, F_GETFL, 0);
printf("file status = 0x%x\n", val);

the flag status returned "0x802"

对于阻塞模式,您会期望文件状态为 0x002。
该文件状态值中的 0x800(O_NONBLOCK 的值)表示非阻塞模式处于事件状态。

这证明您发布的代码(显示阻塞读取)与您正在测试的可执行文件不匹配。

fd = open("/dev/ttyS0", O_RDWR);
...
fcntl(fd, F_SETFL, 0);

如果您确实像上面发布的代码所表示的那样进行了阻塞读取,那么您的程序将不会出现 EAGAIN 错误。
但是由于您的程序正在执行非阻塞读取(由文件状态证明)(并且数据当前不可用),您的程序确实会收到 EAGAIN 错误。


您应该可以通过检查您的代码来解决这个问题。
否则用更多的检查来检测你的代码:

fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY);     /* suspect line */
val = fcntl(fd, F_GETFL, 0);
printf("post-open file status = 0x%x\n", val);
...
fcntl(fd, F_SETFL, 0); /* suspect line */
val = fcntl(fd, F_GETFL, 0);
printf("post-fcntl file status = 0x%x\n", val);

关于serial-port - UART测试程序,读写: resource temporarily unavailable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39576575/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com