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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#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