Arduinoでシリアル通信

ずーっと、シリアル通信どうしよーって考えてて、
タイマーとか別の用途で使っちゃったら、
アレなんだろうなーって思ってたら、そんなことなかった。

void setup() {
  UBRR0 = 103; // boudrate: 9600 = 16MHz / (16 * (1+103))
  UCSR0B = 0b00011000;
  UCSR0C = 0b00000110;

  pinMode( 13, OUTPUT );
  digitalWrite( 13, LOW );
}

void loop() {
  while ( !(UCSR0A & 0b10000000) );
  
  byte x = UDR0;
  if ( x == '0' ) {
    digitalWrite( 13, LOW );
  }
  else if ( x == '\n' ) { /* nop */ }
  else {
    digitalWrite( 13, HIGH );
  }
  
  while ( !(UCSR0A & 0b00100000) );
  
  UDR0 = x;
}

2019/06/23 追記
17行目にelse ifを追加しました。
これやらないと、送信時の改行コードでLOWにならないです。
必要ならLFのほか他に、CRも無視してください。
— ここまで —

ちなみに、このコードの出元はこちら。

今のところ、この本が分かりやすいんだけど、
こないだ、初めて誤字というかバグを見つけた。

こないだ書いた記事で、
タイマー割り込みを使ってLEDをチカチカさせたんだけど、
61ページのサンプルコードの、

TIMSK0 = 0b00000001;

は、

TIMSK0 = 0b00000010;

と思われる。

じゃないと、TIMER0_COMPA_vectが発生しない。
間違ってたら、ゴメンなさい!

という訳で、今回書いたコードの説明。
9600bpsでシリアル通信を有効にして、エコーバックしてるだけなんだけど、
受信したデータ(8bit)が、’0’か否かでLEDを操作している。
それだけなんだけど、’0’を送ってLEDを消したり、
それ以外を送って点灯させるのは地味に楽しい。

次は、これをバッファリングして何かしてみたいと思う。
たとえば、”on”とか”off”とか、文字列でLEDを操作したりとか。

おしまい。

Leave a Comment