2016-06-21 19 views
0

私はAtmel StudioのAVRブートローダを使ってAtmega328pマイクロコントローラを持つArduino Unoと作業しています。再定義された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

ヨアヒムPileborgとBarmarは、私は%Xを変更する必要が指摘したように、 %lxと16進数をlongとして変更します。これが行われた後、出力はほとんど正しいが、出力のいくつかのビットは省略される。

「\ n」の送信は送信元の例のように「\ r」に変換されているためです。私の場合、これは私が望むものではないことが分かります。削除した後:

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

Usart_Transmit関数から出力が正しくフォーマットされました。

ありがとうございました。

関連する問題