为什么rx不接收来自UART上的环回tx的数据?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么rx不接收来自UART上的环回tx的数据?相关的知识,希望对你有一定的参考价值。

我有a system运行Linux,将rx连接到来自UART1的tx(环回)并执行此代码:

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

int main(void) {
    int iFd = open("/dev/ttyTHS0", O_RDWR);
    if (iFd < 0) {
        fprintf(stdout, "Error when opening file.
");
        return -1;
    }

    while (1) {
        if (write(iFd, "A", strlen("A")) == -1) {
            fprintf(stdout, "Failed to write
");
            return -1;
        }

        char buff[10] = {
            0
        };

        if (read(iFd, buff, sizeof(buff)) < 0) {
            fprintf(stdout, "Failed to read.
");
            return -1;
        }

        fprintf(stdout, "read: %s
", buff);

    }
    close(iFd);

    return 0;
}

事情是它似乎没有收到任何数据。代码只是阻塞在read。当用示波器观察时,我可以看到在tx线上传输的数据,但是rx没有收到任何信息。我也尝试在2个进程中拆分此代码,一个进程用于传输,另一个用于接收,但这也不起作用。

答案

这是合乎逻辑的。您可能不会发送任何内容,因为它位于发送缓冲区中。其他问题是您尝试接收10个字节,但只发送一个。在许多系统上,串行超时设置为不定时,您将永远等待接下来的9个字节。

怎么做(第2点有一些变种):

  1. 刷新UART文件

2A。只读取发送ioctl(ifd, FIONREAD, &bytes_ready_to_read);的字节数,然后只读取可用的数字。

2C。更改超时。

以上是关于为什么rx不接收来自UART上的环回tx的数据?的主要内容,如果未能解决你的问题,请参考以下文章

Raspberry Pi UART 程序在 C 中使用 termios 接收垃圾(Rx 和 Tx 直接连接)

单片机可以将UART的Tx与Rx直接相连吗

STM32串口

linux上的环回接口地址是多少?

Uart,IIC和SPI的区别

STM32F0 DMA“输入溢出”