У меня есть простая программа, написанная на C, которая использует термины для отправки базовой строки в PAP UART малины и пытается прочитать и вывести ответ , Штыри Rx и Tx на малине Pi связаны с перемычкой, поэтому все, что отправлено, должно быть немедленно получено.Программа малины Pi UART в C с использованием termios получает мусор (Rx и Tx подключены напрямую)
Несмотря на то, что программа выдала, что она успешно отправила и получила 5 символов для выбранной строки («Hello»), попытка распечатать содержимое буфера создает только один или два символа-мусора.
Программа:
#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] (http://www.cmrr.umn.edu/~strupp/serial.html), чтобы по-битски очистить или установить каждый необходимый флаг без изменения каких-либо других битов или элементов структуры. В вашем коде вызов 'tcgetattr()' Essentaillyly лишний. Вы должны проверить код возврата из 'tcsetattr()' точно так же, как 'tcgetattr()'. – sawdust
@sawdust Это было просто для того, чтобы убедиться, что у меня были основы, работающие до написания программы, но я буду учитывать ваши советы. – kourosh