2013-06-22 8 views
0

У меня есть простая программа, написанная на 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 бод с этой программой, не приведет к тому, что ничего не получит.

Куда я иду не так?

+0

Кроме того, применимого ответа по @parkydr, вы можете иметь проблемы, когда не возвращаются назад и подключение к реальному устройству. Извлечение членов * termios * - неправильная практика кодирования. Правильный [метод POSIX] (http://www.cmrr.umn.edu/~strupp/serial.html), чтобы по-битски очистить или установить каждый необходимый флаг без изменения каких-либо других битов или элементов структуры. В вашем коде вызов 'tcgetattr()' Essentaillyly лишний. Вы должны проверить код возврата из 'tcsetattr()' точно так же, как 'tcgetattr()'. – sawdust

+0

@sawdust Это было просто для того, чтобы убедиться, что у меня были основы, работающие до написания программы, но я буду учитывать ваши советы. – kourosh

ответ

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

В этих строках буфер/str уже указываются. Вы передаете указатель на указатель.

Линия должна быть:

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

Я знал, что где-то ошибся глупо, отлично работает, спасибо! – kourosh

 Смежные вопросы

  • Нет связанных вопросов^_^