Raspberry Pi UART-Programm in C mit Termios empfängt Müll (Rx und Tx sind direkt verbunden)

Ich habe ein einfaches Programm in C geschrieben, das Termios verwendet, um eine grundlegende Zeichenfolge an den Raspberry Pi-UART zu senden, und versucht, die Antwort zu lesen und auszugeben. Die Rx- und Tx-Pins des Raspberry Pi sind mit einem Jumper verbunden, sodass alles, was gesendet wird, sofort empfangen werden muss.

Obwohl das Programm ausgibt, dass es erfolgreich 5 Zeichen für die ausgewählte Zeichenfolge gesendet und empfangen hat ('Hallo'), werden beim Versuch, den Inhalt des Puffers zu drucken, nur ein oder zwei Müllzeichen erzeugt.

Das Programm:

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

Ausgänge:

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

Ich sehe selbst keine größeren Probleme mit dem Code, aber ich könnte mich irren. Ich kann mit PuTTY, das mit denselben Einstellungen verbunden ist, erfolgreich Zeichen senden und empfangen, daher kann es sich nicht wirklich um ein Hardwareproblem handeln. Obwohl ich es in PuTTY nicht ausprobiert habe, führt der Versuch, mit diesem Programm eine Verbindung mit weniger als 115200 Baud herzustellen, dazu, dass nichts empfangen wird.

Wo gehe ich falsch?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage