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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单片机可以将UART的Tx与Rx直接相连吗相关的知识,希望对你有一定的参考价值。

单片机完全可以将UART的Tx与Rx直接相连,这是一种简洁的串口调试方法,为大多数开发人员所采用。由于这就是自己发自己收,所以不需要联机就可以调试。 参考技术A 可以,这样是串口发送的数据芯片自身又会收到的模式,也叫回环模式

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

【中文标题】Raspberry Pi UART 程序在 C 中使用 termios 接收垃圾(Rx 和 Tx 直接连接)【英文标题】:Raspberry Pi UART program in C using termios receives garbage (Rx and Tx are connected directly) 【发布时间】:2013-06-19 17:55:15 【问题描述】:

我有一个用 C 语言编写的简单程序,它使用 termios 将基本字符串发送到 Raspberry Pi UART 并尝试读取和输出响应。 Raspberry Pi 上的 Rx 和 Tx 引脚通过跳线连接,因此无论发送什么都应该立即接收。

尽管程序输出它已成功发送和接收所选字符串 ('Hello') 的 5 个字符,但尝试打印缓冲区的内容只会产生一两个垃圾字符。

程序:

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

int main(int argc, char* argv[]) 

    struct termios serial;
    char* str = "Hello";
    char buffer[10];

    if (argc == 1) 
        printf("Usage: %s [device]\n\n", argv[0]);
        return -1;
    

    printf("Opening %s\n", argv[1]);

    int fd = open(argv[1], O_RDWR | O_NOCTTY | O_NDELAY);

    if (fd == -1) 
        perror(argv[1]);
        return -1;
    

    if (tcgetattr(fd, &serial) < 0) 
        perror("Getting configuration");
        return -1;
    

    // Set up Serial Configuration
    serial.c_iflag = 0;
    serial.c_oflag = 0;
    serial.c_lflag = 0;
    serial.c_cflag = 0;

    serial.c_cc[VMIN] = 0;
    serial.c_cc[VTIME] = 0;

    serial.c_cflag = B115200 | CS8 | CREAD;

    tcsetattr(fd, TCSANOW, &serial); // Apply configuration

    // Attempt to send and receive
    printf("Sending: %s\n", str);

    int wcount = write(fd, &str, strlen(str));
    if (wcount < 0) 
        perror("Write");
        return -1;
    
    else 
        printf("Sent %d characters\n", wcount);
    

    int rcount = read(fd, &buffer, sizeof(buffer));
    if (rcount < 0) 
        perror("Read");
        return -1;
    
    else 
        printf("Received %d characters\n", rcount);
    

    buffer[rcount] = '\0';

    printf("Received: %s\n", buffer);

    close(fd);

输出:

Opening /dev/ttyAMA0
Sending: Hello
Sent 5 characters
Received 5 characters
Received: [garbage]

我自己看不出代码有什么大问题,但我可能错了。我可以使用连接相同设置的 PuTTY 成功发送和接收字符,所以这不是硬件问题。虽然我没有在 PuTTY 中尝试过,但尝试使用该程序连接任何低于 115200 波特的东西都将导致收不到任何内容。

我哪里错了?

【问题讨论】:

除了@parkydr 提供的适用答案之外,当您没有环回并连接到真实设备时,您可能会遇到问题。将 termios 成员清零是不好的编码习惯。正确的POSIX method 它可以按位清除或设置每个必要的标志,而无需修改任何其他位或结构成员。在您的代码中,tcgetattr() 调用本质上是多余的。您应该检查来自tcsetattr() 的返回码,就像tcgetattr() 一样。 @sawdust 这通常只是为了确保我在正确编写程序之前具备基础知识,不过我会考虑您的建议。 【参考方案1】:
int wcount = write(fd, &str, strlen(str));
int rcount = read(fd, &buffer, sizeof(buffer));

在这些行中,buffer/str 已经是指针。您正在传递一个指向指针的指针。

这些行应该是:

int wcount = write(fd, str, strlen(str));
int rcount = read(fd, buffer, sizeof(buffer));

【讨论】:

我知道我会在某个地方犯了一个愚蠢的错误,完美运行,谢谢!

以上是关于单片机可以将UART的Tx与Rx直接相连吗的主要内容,如果未能解决你的问题,请参考以下文章

单片机下载端口RX与TX接哪个端口,谢谢!!

如何实现模块与单片机的RX和TX连接并让它与PC机连接,就是实现TX和RX的分时复用功能

单片机的问题

单片机芯片上的引脚的Rx与Tx端是通信的端口,请问这个口是RS232口吗?

STM32F407单片机UART串口gpio口复用功能配置问题

MM32单片机UART不能使用问题