シリアル通信で取りこぼしてみる
前回の記事で、ちょっと気になったので、
取りこぼしが発生させてみた。
#define LED_PIN (13) ISR ( TIMER0_COMPA_vect ) { digitalWrite( LED_PIN, HIGH ); if ( UCSR0A & 0b10000000 ) { byte x = UDR0; while ( !(UCSR0A & 0b00100000) ); UDR0 = x; } } void setup() { pinMode( LED_PIN, OUTPUT ); digitalWrite( LED_PIN, LOW ); // Serial UBRR0 = 103; // boudrate: 9600 = 16MHz / (16 * (1+103)) UCSR0B = 0b00011000; UCSR0C = 0b00000110; // 16MHz / (1024 * 156) = 100.16Hz TCCR0A = 0b00000010; // CTC TCCR0B = 0b00000101; // 1/1024 OCR0A = 156; TIMSK0 = 0b00000010; TCNT0 = 0; sei(); } void loop() { digitalWrite( LED_PIN, LOW ); }
LEDの処理はおまけみたいなもの。
わずかに点灯させてる。
やってることは、
1秒間あたり100回の頻度でエコーバックしている。
本来は、9600bpsなので、8で割った1200回のペースで参照しないと、
次から次へと受信したデータで上書きされてしまう。
これで、なんとなく方針は立てられる。
とりあえず、現時点の方針として、
MIDIの31.25kbpsの場合は、これより多い頻度で参照して、
受信データをバッファリングすれば、取りこぼさないと思われる。
次のデータが少しでも到着するとダメなのかな???
それを確認するのは、ちょっとめんどいなー。
おしまい。
Leave a Comment