• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

ESP не контролирует поток UART

Алексей.

Active member
Значит веб сервер получает запрос на выполнение обновления прошивки, стартует отдельную задачу (в которой и выполняется mcuProg()) и сразу возвращает результат типа задача обновления прошивки запущена с идентификатором id, для проверки выполнения можно отправить запрос статуса выполнения этой задачи указав ее id.
В mcuProg вызов delay Вас не устраивает, но ведь в delay вызывается yield, кто будет "уступать" процессорное время в системе с псевдо многозадачностью?
 

mcmega

Member
В общем попробовал я использовать micros(), но что то не пойму что происходит.

Код:
bool uartFlowCtrl =       false;
unsigned long startTimeFlow = 0;

// ПРОГРАММИРОВАНИЕ MCU С КОНТРОЛЕМ ПОТОКА
void handlerUARTProg() {
  if (micros() >= (startTimeFlow + 46080000 / 115200)) {
    if (mcuHex.available()) {
      if (Serial.available()) {
        curChar = (char)Serial.read();  // Читаем очередной байт из UART
        switch (curChar) {              // Сравниваем
          case BOOT_MCU_START:          // ">"
          case BOOT_MCU_XON:            // xOn
            uartFlowCtrl = true;        // Разрешаем передачу по UART
            break;
          case BOOT_MCU_XOFF:           // xOff
            uartFlowCtrl = false;       // Запрещаем передачу по UART
            break;
          case BOOT_MCU_END:            // "<"
            updateMCUEnd();             // Завершаем прошивку MCU
            break;
        }
      }
    }
    if (uartFlowCtrl) {
      Serial.write(mcuHex.read());      // Передаем очередной байт из файла в UART
      startTimeFlow = micros();
    }
  }
}
Не шьется и в ответе я не вижу управляющих символов вообще, скорость UART 115200, загрузчик отвечает практически мгновенно (написан на асме).
Напомню в 2-х словах:
- передача осуществляется посимвольно и стартует по приходу символа ">"
- далее должны отслеживаться символы xOn, xOff:
- -xOff приходит после заполнения буфера MCU и с этого момента начинается запись Flash MCU, передача по UART останавливается
- -xOn приходит после успешной записи Flash MCU и передача по UART возобновляется
- символ "<" приходит после завершения программирования MCU
 
Последнее редактирование:

CodeNameHawk

Moderator
Команда форума
загрузчик отвечает практически мгновенно
мгновенно - это меньше одного такта процессора, а в реале надо учитывать это время.
авр рабоает медленнее есп, есп успеет напихать лишних данных в свой буфер, пока авр успеет отправить ей стоп.
 

mcmega

Member
мгновенно - это меньше одного такта процессора, а в реале надо учитывать это время.
авр рабоает медленнее есп, есп успеет напихать лишних данных в свой буфер, пока авр успеет отправить ей стоп.
Согласен, MCU работает на 16MHz и поэтому я учитываю время передачи байта, и время ожидания ответа
Код:
if (micros() >= (startTimeFlow + 46080000 / 115200)) {
//...
}
Это основано на 4 и 9 посте.
 

CodeNameHawk

Moderator
Команда форума
Обоснуйте эти цифры 46080000 / 115200, я как то не вижу где затраты времени авр.
Приоритеты выполнения операций знаете?
имхо (startTimeFlow + 46080000 / 115200) == (startTimeFlow + 400)
 
Последнее редактирование:

mcmega

Member
Обоснуйте эти цифры 46080000 / 115200, я как то не вижу где затраты времени авр.
Это "Прием и передача символа по UART = минимум 10/baud", так как у нас передача + прием + немного ожидания = имеем 40/baud (взял с запасом),
так как используем micros(), то имеем 46080000 / 115200 (именно 46080000 чтоб при делении было целое число)
Это если я правильно понял подсказки выше.

Все верно (startTimeFlow + 400), я хочу проверить наличие символа через 400 мкс от последнего переданного символа в UART
 
Последнее редактирование:

CodeNameHawk

Moderator
Команда форума
Я бы считал так : время передачи символа + время обработки в авр + время передачи символа.
 

CodeNameHawk

Moderator
Команда форума
Проверить, хватает ли времени просто, увеличьте задержку, да хоть до 1 сек и проверьте работает ли.
 

mcmega

Member
а вы символы xOn, xOff в потоке заменяете?
#define BOOT_MCU_XON 0x11 // Управление потоком, передача разрешена
#define BOOT_MCU_XOFF 0x13 // Управление потоком, передача запрещена
Я передаю коды символов, фактически это и есть xOn, xOff
Они идут только от MCU к ESP.
 

nikolz

Well-known member
#define BOOT_MCU_XON 0x11 // Управление потоком, передача разрешена
#define BOOT_MCU_XOFF 0x13 // Управление потоком, передача запрещена
Я передаю коды символов, фактически это и есть xOn, xOff
Они идут только от MCU к ESP.
Если Вы передаете бинарные данные то в них могут быть эти же коды тогда надо их обнаруживать и заменять обычно двумя байтами
Но возможно у Вас ASCII код тогда зачем символы управления.
 

mcmega

Member
Если Вы передаете бинарные данные то в них могут быть эти же коды тогда надо их обнаруживать и заменять обычно двумя байтами
Но возможно у Вас ASCII код тогда зачем символы управления.
Я передаю HEX как символы ASCII, поэтому управляющие символы не попадают в диапазон значений "0" до "F" и ":".

Контроль потока нужен для повышения скорости прошивки, сейчас после каждого символа я делаю паузу 2 мс, а это слишком много.., такая пауза нужна только в момент записи Flash MCU.
 

CodeNameHawk

Moderator
Команда форума
Если Вы передаете бинарные данные то в них могут быть эти же коды тогда надо их обнаруживать и заменять обычно двумя байтами
Байты прошивки идут от есп к авр, а стоп старт байты только от авр к есп.

Хотя при чем тут это
Я передаю HEX как символы ASCII, поэтому управляющие символы не попадают в диапазон значений "0" до "F" и ":".
 

nikolz

Well-known member
Я передаю HEX как символы ASCII, поэтому управляющие символы не попадают в диапазон значений "0" до "F" и ":".

Контроль потока нужен для повышения скорости прошивки, сейчас после каждого символа я делаю паузу 2 мс, а это слишком много.., такая пауза нужна только в момент записи Flash MCU.
Можно конечно и так. Но в HEX у вас скорость падает в два раза по сравнению с двоичным форматом. Почему не используете двоичный
 

mcmega

Member
Байты прошивки идут от есп к авр, а стоп старт байты только от авр к есп.

Хотя при чем тут это
Можно конечно и так. Но в HEX у вас скорость падает в два раза по сравнению с двоичным форматом. Почему не используете двоичный
Я перейду на двоичный (позже), мне нужно для начала наладить контроль потока, а потом можно слать все что угодно.
 

mcmega

Member
а аппаратно контроль почему не используете?
Потому что тот, кто писал либу для UART ESP понятия не имеет о такой возможности. И библиотека реализует очень скудный набор функционала. А так как она иногда обновляется, в исходники лезть не хочется, да и не уверен что осилю.
 
Сверху Снизу