• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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 понятия не имеет о такой возможности. И библиотека реализует очень скудный набор функционала. А так как она иногда обновляется, в исходники лезть не хочется, да и не уверен что осилю.
 
Сверху Снизу