シリアル通信で取りこぼしてみる

前回の記事で、ちょっと気になったので、
取りこぼしが発生させてみた。

#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