2016-06-21 3 views
0

Я работаю с Arduino Uno с микроконтроллером Atmega328p, используя загрузчик AVR с Atmel Studio.Printf с redefined stdio не форматирование правильно с использованием usart

Я установил связь USART и успешно отправил данные, которые считывает терминал на моем компьютере, но при использовании printf неправильное форматирование.

/* 
* USART_HelloWorld.c 
* 
* Created: 6/20/2016 4:17:16 PM 
* Author : Kevin 
*/ 

#define F_CPU 16000000 
#define BAUD 9600 
#define MYUBRR F_CPU/16/BAUD-1 
#include <avr/io.h> 
#include <stdio.h> 

static int USART_Transmit(char, FILE*); 
static FILE mystdout = FDEV_SETUP_STREAM(USART_Transmit, NULL, _FDEV_SETUP_WRITE); 

USART_Init(unsigned int ubrr){ 
    UCSR0B |= (1<<TXEN0)|(RXEN0);//enables transmitting and receiving 
    UCSR0C |= 3<UCSZ00; //8 bit data, 1 stop bit 
    UBRR0H |= (unsigned char)(ubrr>>8); //sets baud rate 
    UBRR0L |= (unsigned char)ubrr;//sets baud rate 

} 
static int USART_Transmit(char data, FILE *stream){ 
    if(data=='\n') 
     USART_Transmit('\r',stream); 
    while(!((UCSR0A)&(1<<UDRE0))); 
    UDR0 = data; 
    return 0; 
} 
int main(void) 
{ 
    USART_Init(MYUBRR); 
    stdout = &mystdout; 
    printf("Server name= 0x%X\nMy name is %s\nThis number is %d!\n", 0xDEADBEEF, "Kevin", 5); 
    while (1); 
} 

Я ссылаюсь на this при создании этого.

я должен получить выход как:

Server name=0xDEADBEEF 
My name is Kevin 
This number is 5! 

Но я получаю:

Server name= 0xBEEF 
My name is 
This number is 270! 

Любые предложения

+0

Если скорость в бодах была неправильной, вы не получили бы никакого выхода или, может быть, полного мусора. Это не будет испортить только значения, которые подставляются в строку формата. – Barmar

+0

Хорошо, спасибо. Я новичок в USART. – Khaines0625

+0

Получаете ли вы ожидаемый результат, если программа записывает обычный терминал или файл? – Barmar

ответ

1

Как Joachim Pileborg и Barmar отметил, что мне нужно, чтобы изменить% X в a% lx и изменить шестнадцатеричное число как длинное. Как только это было сделано, выход был в основном правильным, но некоторые биты вывода были опущены.

Получается, что все передачи '\ n' были преобразованы в '\ r', как показано в примере источника. Оказывается, в моем случае это не то, что я хочу. После того как я удалил:

if(data=='\n') 
     USART_Transmit('\r',stream); 

Из функции Usart_Transmit выход был отформатирован правильно.

Спасибо всем за помощь.

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