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!
任意の提案
ボーレートが間違っていた場合は、出力が得られないか、またはゴミが出ることがあります。これは、フォーマット文字列に代入される値だけを壊すことはありません。 – Barmar
よろしくお願いいたします。私はUSARTを初めて使っています。 – Khaines0625
プログラムが通常の端末またはファイルに書き込んでいる場合、期待される出力を得ていますか? – Barmar