Как стать автором
Обновить

Комментарии 18

void detectUartSpeed(&uart)
{
  do
  {
    uart.begin(...);
    bool success = checkData(uart);
    if (success) return;
    uart.end();
    switchToNextBaudRate;
  }
  while(true);
}

И рекурсия не нужна.

Спасибо, подтолкнули меня в правильную сторону. Действительно работает стабильнее. Поправил статью

нам понадобится функция софтварного перезапуска Ардуинки, так как в процессе тестирования оказалось, что Ардуинка имеет свойство "зависать" в процессе рекурсии.

В этой вашей рекурсии вы стек не переполняете? Микроконтроллеры надо программировать немножко не так, как большие компьютеры, где мегабайтом больше, мегабайтом меньше...

Вполне вероятно. У меня есть предположение, что возможно сам вызов рекурсии переполняет стек... Мол, каждый вызов функции добавляет запись в стек, и когда функция выполняется множество раз, то стек переполняется. Буду рад если проконсультируете, насколько реально такое поведение?

Ну да, каждый вызов любой подпрограммы записывает в стек как минимум адрес возврата из этой подпрограммы. То есть если рекурсировать слишком глубоко, стек рано или поздно переполнится и затрет полезные данные.

В некоторых мелких микроконтроллерах стек вообще не находится в общей памяти, а имеет фиксированный и очень маленький размер - например, 16 или даже 8 уровней. Там за вложенностью вызовов нужно следить особенно тщательно.

UPD: Спасибо за подсказку, да, действительно было переполнение стека. Исправил на цикл while, дополнил статью.

<данные удалены>.

Вот что мне в микроконтроллерах нравится - никто никогда не узнает, какой г-код обеспечивает мигание лампочки:)

Вот что мне в микроконтроллерах нравится - никто никогда не узнает, какой г-код обеспечивает мигание лампочки:)

Ну, в микроконтроллерах есть встроенная защита от г-кода. Плохой код просто не поместится в память. Или моментально упадет, потому что в контроллере нет гигабайтов памяти, которая может часами и сутками незаметно утекать. Или взорвет мощные транзисторы (10 долларов за штуку, доставка через 5-8 недель).

Г-код не обязательно неработающий;) Лампочка мигает же, а если что утечет - есть watchdog. ;)

Лампочка мигает же, а если что утечет - есть watchdog. ;)

Если watchdog срабатывает от утечек в коде, а не от внешних помех - то это все-таки неработающий код. По-моему так.

Вспомнил, кстати, я два года назад сделал себе прототип фонарика на PIC10. Watchdog ему не включил, отложил на "когда-нибудь потом". Так два года и таскаю его в кармане, пока что не зависал. :-)

По всякому бывает ;) Читал где-то, что у Боинга какой то из контроллеров питания перегружался на 49 сутки. Счётчик миллисекунд, ага :). Летают с этим.

Я думал, тут будет замерять минимальное время импульса, а тут.......

Надо будет попробовать. При этом единственное требование к потоку данных - чтобы в нем присутствовала последовательность битов "1-0-1" или "1-0-stop".

В модемах была такая функция, но работала совсем по-другому, я смотрел код прошивок и делал так же.

Там вначале МК просто смотрит на ножку, ловит старт-бит, измеряет его длительность, далее в режиме программного UART с вычисленной скоростью принимает первый символ, затем включает аппаратный порт на нужной скорости и принимает остаток команды. При этом команда начинается с гарантированного префикса "AT" или "at" и все получается хорошо.

Забавно, что эта процедура повторяется для каждой ожидаемой команды и Вы можете передавать их на разной скорости, хотя не очень понятно, зачем.

А передаваемые/принимаемые данные дополнительно могут передаваться на скорости установленного сеанса связи.

Мне попадалось несколько готовых библиотек на эту тему. Зачем было изобретать велосипед?

Значит автору они не попались.Ну и совершенно не факт что в тех либах сильно лучше.

Не проще ли было в режиме GPIO замерять минимальную длительность импульса, а уже на основании её вычислять скорость?

На арудуино под esp8266 и edp32 точно стандартные методы автоматическое определение скорости UART.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации