ARDUINO Странная работа Serial.available()...

SoftFelix

✩✩✩✩✩✩✩
16 Фев 2020
1
0
Пишу процедуру начальной синхронизации с микроконтроллером (МК). Обмен по uart на скорости 9600. Ардуино UNO R3 (на CH340G) + LCD Keypad Shield.

По даташиту на МК нужно выдать ему в порт (от Ардуино) 512 байт 0х00 и тут же проверить от него (МК) отклик из трёх байт - 0x0d, 0x0a, 0x3e (именно в такой последовательности). Получение этих трёх байт - удачная синхронизация.

Получился вот такой код. Тут даже не проверяю пришедшие байты на правильность, а просто проверяю на количество принятых байт.

C++:
void SYNC_1986() { //функция синхронизации с 1986ВЕ91

  Serial.end(); //для смены скорости сперва нужно закрыть...
  Serial.begin(9600); //...а потом открыть. настроили скорость UART на 9600

  lcd.clear();
  lcd.setCursor(1, 0);
  lcd.print("Try to Sync...");
  lcd.setCursor(5, 1); //подготовим позицию для печати результата ("Failed!" / "Success!")

  while (Serial.available()) Serial.read(); //очищает Rx-буфер UART'а перед работой

  for (int i = 0; i < 512; i++) {
    Serial.write(0); //выдали в порт 512 байт 0х00
  }
  Serial.flush(); //ждём окончания передачи из буфера

  int n = Serial.available();
  if (n == 3) {
    lcd.print("Success!");
  } else {
    lcd.print("Failed!");
  }
  }
Не заработало. :) Начал разбираться. Вставил отладку - печать переменной "n" (возврат количества байт в Rx-буфере). Так оно там скачет 3, 5, 7, 9, 11 (эти наиболее частые значения (dec)). Попадаются даже 17 и более.

Подключил МК к терминалке на ПЦ. Настроил скорость 9600. Скриптом выдаю в порт 512 нулей. В окне приёма даже до окончания цикла (это правильно) появляются заветные ТРИ байта - 0x0d, 0x0a, 0x3e. Только три и ничего более! Т.е. МК выдаёт всё правильно - только три байта.

Добавил ещё отладку в код - печать всех байтов (что вернула Serial.available()) в Rx-буфере. Так вот первые три байта там всегда правильные - 0x0d, 0x0a, 0x3e, а потом идут какие-то повторяющиеся байты (к сожалению забыл их записать). И это точно не ответ от МК.

В общем, непонятки какие-то. Может разъясните?