我正在尝试在Raspberry Pi 3中通过UART发送和接收字符串。我已经连接了Pi的TX和RX引脚,但是当程序运行时我收到错误:
读取失败:资源暂时不可用
#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;
}
答案 0 :(得分:2)
只有在非阻塞读取时才会出现EAGAIN错误 发生错误时,您需要添加代码来检查文件状态标志:
val = fcntl(fd, F_GETFL, 0);
printf("file status = 0x%x\n", val);
标志状态返回“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);