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