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

Serial port Raspberry Pi UART程序在C中使用termios接收垃圾(Rx和Tx直接连接),serial-port,raspberry-pi,garbage,uart,termios,Serial Port,Raspberry Pi,Garbage,Uart,Termios,我有一个用C编写的简单程序,它使用termios向Raspberry Pi UART发送一个基本字符串,并尝试读取和输出响应。Raspberry Pi上的Rx和Tx引脚通过跳线连接,因此无论发送什么,都应立即接收 尽管程序输出成功地发送和接收了所选字符串(“Hello”)的5个字符,但尝试打印缓冲区的内容只会产生一个或两个垃圾字符 该方案: #include <stdio.h> #include <stdlib.h> #include <string.h> #

我有一个用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);
}
我自己看不出代码有什么大问题,但我可能错了。我可以使用相同设置的PuTTY连接成功地发送和接收字符,所以这不会真的是一个硬件问题。虽然我还没有在PuTTY中尝试过,但是尝试用这个程序连接任何低于115200波特的数据都不会收到任何结果

我哪里做错了

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

除了@parkydr给出的适用答案外,如果没有环回并连接到真实设备,您可能会遇到问题。将termios成员归零是糟糕的编码实践。正确的方法是逐位清除或设置每个必要的标志,而不修改任何其他位或结构成员。在代码中,
tcgetattr()
调用本质上是多余的。您应该检查
tcsetattr()
中的返回代码,就像
tcgetattr()
@sawdust一样。这通常只是为了确保在正确编写程序之前我的基础工作正常,但我会考虑您的建议。我知道我会在某个地方犯一个愚蠢的错误,工作正常,谢谢!
int wcount = write(fd, str, strlen(str));
int rcount = read(fd, buffer, sizeof(buffer));