2016-06-21 2 views
0

저는 Atmel Studio가있는 AVR 부트 로더를 사용하는 Atmega328p 마이크로 컨트롤러가있는 Arduino Uno와 함께 작업하고 있습니다.다시 정의 된 표준이있는 printf가 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! 

을하지만 난 얻을 : 요아킴 Pileborg 및 Barmar는 지적

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

어떤 제안

+0

전송 속도가 잘못되면 출력이 나오지 않거나 총 가비지가 발생하지 않습니다. 형식 문자열로 대체되는 값만 엉망으로 만들지는 않습니다. – Barmar

+0

감사합니다. 나는 USART를 처음 사용합니다. – Khaines0625

+0

프로그램이 정상적인 터미널이나 파일에 쓰는 경우 예상되는 출력을 얻습니까? – Barmar

답변

1

, 나는에 %의 X를 변경해야 % lx를 입력하고 16 진수를 long으로 변경하십시오. 일단이 작업이 완료되면 출력은 대부분 올바르지 만 출력의 일부 비트는 생략됩니다.

'\ n'의 모든 전송이 소스 예제에서 제안한대로 '\ r'로 변환 되었기 때문에 이것이 나타납니다. 내 경우에는 이것이 내가 원하는 것이 아니라는 것이 밝혀졌습니다. 내가 제거한 후 :

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

Usart_Transmit 기능에서 출력의 형식이 올바르게 지정되었습니다.

도움을 주셔서 감사합니다.

관련 문제