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