задержка при использовании аппаратного сериал
- Войдите на сайт для отправки комментариев
Сб, 27/07/2019 - 19:28
здравствуйте.
обьясните, пожалуйста, почему при аппаратном сериал задержка нужна (в моем случае 0,5мс), а при програмном нет.
пример кода 1:
Moderator : пожалуйста, вставьте код правильно - http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
задача стоит такая, при получении определенной строки - моргнуть светодиодом.
думал что с аппаратныс ЮАРТом будет надежнее, но без паузы не работает запись строки.
а при програмном ЮАРТе работает без задержек.
при скорости 19200, ждать по 500мкс не очень подходит
Вообще-то код полагается вставлять по правилам - иначе его нрикто читать не будет.
Я, например, не читал, но, если отвечать на Ваш вопрос, то, вероятнее всего, Вы неправильноработаете с портом, а именно - не выясняете, пришли ли данные, прежде, чем их читать.
Ну а вообще - при скорости 19200 передача одного байта занимает никак не меньше 520 мкс, так что ждать в любом случае придется, вне зависимости от того, подходит это или нет.
PS. Да, при программном - точно такие же задержки, только если при аппаратном процессор курит, то при программном - пыхтит, не переставая. Т.е. в первом варианте - 520 мкс ожидания, а во втором - 520 мкс судорожной работы.
Знаю что неправильно вставил код. Не могу отредактировать первый пост.
Подскажите как правильно собрать строку, чтоб не использовать принудительные остановки цикла?
Везде в примерах так:
while (Serial.available() > 0) {
bt = Serial.read();
btSTR += bt;
}
Вот я и подумал, что оно автоматом дожидается следующий байт. А если задуматься, то и правда, цикл проходит быстрее чем прийдет следующий байт.
Я так понимаю в данном примере без delay тут никак
если данные будут приходить быстрей, чем вы собираете строку, то вы никогда её не соберёте, а с задержкой подавно.
Так вообще не делается.
Или проще, если данные будут постоянно поступать, то цикл превращается в бесконечный.
Как раз с задержкой и работает.
Цикл заканчивается быстрее чем приходит следующий байт. Поэтому и приходится делать паузы.
Евгений, я сейчас пишу с телефона.
Цикл заканчивается быстрее чем приходит следующий байт. Поэтому и приходится делать паузы.
С задержкой работает потому, что вы прекращаете слать данные. Запустите бесконечную отправку данных на com-порт и увидите результат.
Правильно. У меня данные идут пакетами.
Тогда определите размер пакета в цикле чтения и выходите когда размер пакета достигнут.
Спасибо, Andriano.
пишу на спине убитого товарища - извините за неровный почерк.(с) о_О
Большинство людей не читают код, вставленный как попало, а потому просто не могут Вам помочь.
А так - Вы свободный человек и вольны писать хоть с телефона, хоть с пылесоса - дело Ваше.
Большинство людей не читают код, вставленный как попало, а потому просто не могут Вам помочь.
А так - Вы свободный человек и вольны писать хоть с телефона, хоть с пылесоса - дело Ваше.
проехали с неправиль вставленным кодом, я уже понял свою ошибку.
вы можете подсказать как записать строку из байтов получаемых через сериал? не применяя делей.
данные передаются пакетами разного объема
вы можете подсказать как записать строку из байтов получаемых через сериал? не применяя делей.
посмотри здесь #76 пример, как - там в коде DigiUSB, считай, что то Serial.
проехали с неправиль вставленным кодом, я уже понял свою ошибку.
вы можете подсказать как записать строку из байтов получаемых через сериал? не применяя делей.
данные передаются пакетами разного объема
Данная конструкция предназначена для того, чтобы за несколько (сколько потребуется) проходов цикла смогла собрать строку и при этом не тратилось бы время на ожидание. Т.е. пока принимается строка, можно делать еще какую-нибудь полезную работу.
Плюс в том, что мы ничего не ждем, а минус - что за один раз строка, как правило, просто не успеет собраться.
Контрукция - правильная, только ее нужно так же правильно использовать. Т.е. не пытаться выудить из нее после первого же прохода строку целиком, а по окончанию цикле while проверять, закончена ли строка или еще нет. И предпринимать необходимые действия только в том случае, когда строка закончена.
вы можете подсказать как записать строку из байтов получаемых через сериал? не применяя делей.
Не могу. Нельзя получить данные, которые ещё не пришли. А дождаться их прихода без делей или его заменителей нельзя.
Данные надо собирать не за раз, а за несоклько (сколько пторебуется) проходов функции loop.
ясно.
всем спасибо. буду думать))
А дождаться их прихода без делей или его заменителей нельзя.
зачем ждать данные - пусть данные сам ждут в приёмном буфере
по нормальному у пакетов данных должны быть заголовки (в которых, например, длина пакета указана) или может маркеры какие, например, начала или конца пакета, ну и совсем хорошр если ещё контрольная сумма присутствует.
Всё это облегчает приём таких пакетов не за один проход луп, а за много (что позволяет спокойно выполнять остальной код).