Чтение из UART

Пример скетча, читающего строку из UART. Скетч сравнивает её с образцовыми строками "on" или "off", соответственно включая или выключая светодиод L.

#define LED_PIN 13
#define BUFFER0_MAX_SIZE 80 // максимальная длина строки
char buffer0[BUFFER0_MAX_SIZE]; // строка
unsigned int buffer0_size = 0; //текущий размер строки
boolean buffer0_complete = false; //строка в буфере получена полностью

void setup() {
  pinMode(LED_PIN, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  if (buffer0_complete) {
    //Serial.println(buffer0);
    //обрабатываем команду:
    if (strcmp(buffer0, "off") == 0) {//команда выключить светодиод
        digitalWrite(LED_PIN, LOW);
        Serial.println("led is off");
    } else if (strcmp(buffer0, "on") == 0) {//команда - включить!
        digitalWrite(LED_PIN, HIGH);
        Serial.println("led is on");
    } else {
      Serial.print("Error: unknown command: ");
      Serial.print(buffer0);
      Serial.println(" (available commands: \"off\", \"on\")");
    }
    clean_buffer0();//очищаем строку с командой, т.к. она уже обработана
  }
}

void serialEvent() {
  while (Serial.available()) {//пока в порту есть символы
    char ch = Serial.read(); // читаем один из порта
    switch (ch){
      case '\n'://перевод строки игнорируем
      break;
      case '\r'://возврат каретки - окончание строки
        buffer0[buffer0_size] = 0; // добавляем ноль в конец строки (признак её окончания)
        buffer0_complete = true; // признак получения полной строки для гл. цикла
      break;
      default:
        buffer0[buffer0_size] = ch; // если символ - не конец строки - добавляем символ в буфер
        buffer0_size++;
      break;
    }
    if (buffer0_size == BUFFER0_MAX_SIZE) {//если строки размер - максимальный
        buffer0[buffer0_size] = 0; // добавляем ноль в конец строки (признак её окончания)
        buffer0_complete = true; // признак получения полной строки для гл. цикла
    }
  }
}

void clean_buffer0 () {
  buffer0[0] = 0; buffer0_size = 0; buffer0_complete = false; // очистка буфера  
}

Залишити відповідь