シリアル通信で取りこぼしてみる
前回の記事で、ちょっと気になったので、
取りこぼしが発生させてみた。
#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