Arduinoで遊ぶページ

Arduinoで遊んだ結果を残すページです。
garretlab
store_char()

store_char()

概要

store_char()は、シリアル通信で受信した文字をリングバッファに格納します。

ソースコード

store_char()は、hardware/arduino/cores/arduino/HardwareSerial.cppに定義されています。以下に全ソースコードを示します。

inline void store_char(unsigned char c, ring_buffer *buffer)
{
  int i = (unsigned int)(buffer->head + 1) % SERIAL_BUFFER_SIZE;

  // if we should be storing the received character into the location
  // just before the tail (meaning that the head would advance to the
  // current location of the tail), we're about to overflow the buffer
  // and so we don't write the character or advance the head.
  if (i != buffer->tail) {
    buffer->buffer[buffer->head] = c;
    buffer->head = i;
  }
}

入力はcとbufferで、それぞれ、unsigned char型とring_bufferへのポインタ型です。

inline void store_char(unsigned char c, ring_buffer *buffer)
{

次の文字を格納するバッファ内の位置を計算します(現在の文字を格納する位置ではありません)。

  int i = (unsigned int)(buffer->head + 1) % SERIAL_BUFFER_SIZE;

シリアル通信で利用するバッファはリングバッファです。tailは最も古いデータで、次にデータを格納するのがheadです。配列を最後まで使い切ると先頭に戻ります。このため、headに1を足した後、SERIAL_BUFFER_SIZEで割った余りを求めています。これにより、SERIAL_BUFFER_SIZEに到達すると、0に戻ります。また、headとtailが同じ場合はバッファは空です。

iがtailと同じでない場合は、バッファに現在の文字を格納し、headを更新します。

  if (i != buffer->tail) {
    buffer->buffer[buffer->head] = c;
    buffer->head = i;
  }
}

iとtailが同じであれば、何もせずに戻ります。すなわち、文字は捨てられます。

headとtailが同じときは、バッファ内に文字列がないことを意味しています。このため、最後の1文字分は文字を格納できません。

バージョン

Arduino 1.0.5



メニューを表示するためにJavaScriptを有効にしてください。

Arduinoで遊ぶページ
Copyright © 2012 garretlab all rights reserved.
inserted by FC2 system