ArduinoでUSARTを使う

Cの文字列リテラルがchar型配列の最後にヌルターミネータ'\0'を挿入してくれてるおかげで
putStringの実装が楽だった。(配列ループの終了条件にarray[i]を入れられるので)

#include <avr/io.h>
#include <util/delay.h>

#define FOSC 16000000UL
#define BAUD 9600
#define MYUBRR ((FOSC/(16UL*BAUD))-1)

void USART_init(unsigned int ubrr){
  UBRR0H = (ubrr>>8);
  UBRR0L = ubrr;
  UCSR0B = _BV(RXEN0)|_BV(TXEN0); //RX-TX enable
  UCSR0C = (3<<UCSZ00);//define data frame: CSZ = CharacterSiZe
}

void USART_Transmit(unsigned char data){
  loop_until_bit_is_set(UCSR0A,UDRE0);
  UDR0 = data;
}

char USART_recv(void)
{
  while(!(UCSR0A & (1<<RXC0)));
  return UDR0;
}

char *putString(char msg[])
{
  int i;
  for(i=0;msg[i];i++){
    USART_Transmit(msg[i]);
  }
}

int main(void){
  DDRB |= _BV(PORTB5);
  USART_init(MYUBRR); 

  char data;
  putString("Hello\n");

  while(1){
      data = USART_recv();
      USART_Transmit(data);
  }
  return 0;  
}