UART测试程序,写入和读取:资源暂时不可用

时间:2016-09-19 15:13:42

标签: serial-port raspberry-pi3

我正在尝试在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;
}

1 个答案:

答案 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);