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

SoftFelix
Offline
Зарегистрирован: 12.01.2020

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

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

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

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, а потом идут какие-то повторяющиеся байты (к сожалению забыл их записать). И это точно не ответ от МК.

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

rkit
Offline
Зарегистрирован: 23.11.2016

Надо чуть-чуть подождать, прежде чем проверять наличие ответа.

SoftFelix
Offline
Зарегистрирован: 12.01.2020

rkit пишет:

Надо чуть-чуть подождать, прежде чем проверять наличие ответа.

Вот тут вставить задержку?

Serial.flush(); //ждём окончания передачи из буфера

delay(10); //тут задержка?

  int n = Serial.available();

delay(10); //или тут ждём?

  if (n == 3) {

Где и сколько именно? От заданной скорости uart эта задержка тоже будет меняться?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

SoftFelix пишет:
Вставил отладку - печать переменной "n"
Где? Не вижу.

И вообще, лучше бы код целиком видеть.

SoftFelix
Offline
Зарегистрирован: 12.01.2020

ЕвгенийП пишет:

SoftFelix пишет:
Вставил отладку - печать переменной "n"
Где? Не вижу.

Так это ж была отладка...

Вот тут выводил на печать.

int n = Serial.available();

lcd.print(n); //печать сколько байт доступно для чтения

  if (n == 3) {

 

Feofan
Offline
Зарегистрирован: 28.05.2017

Попробуйте завершить отправку строкой: Serial.write("\r\n");

SoftFelix
Offline
Зарегистрирован: 12.01.2020

Feofan пишет:

Попробуйте завершить отправку строкой: Serial.write("\r\n");

Этого делать нельзя. МК ожидает байты синхронизации только 0х00.

Feofan
Offline
Зарегистрирован: 28.05.2017

Ну, значит нельзя.