задержка при использовании аппаратного сериал
- Войдите на сайт для отправки комментариев
Сб, 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.
пишу на спине убитого товарища - извините за неровный почерк.(с) о_О
Большинство людей не читают код, вставленный как попало, а потому просто не могут Вам помочь.
А так - Вы свободный человек и вольны писать хоть с телефона, хоть с пылесоса - дело Ваше.
Большинство людей не читают код, вставленный как попало, а потому просто не могут Вам помочь.
А так - Вы свободный человек и вольны писать хоть с телефона, хоть с пылесоса - дело Ваше.
проехали с неправиль вставленным кодом, я уже понял свою ошибку.
вы можете подсказать как записать строку из байтов получаемых через сериал? не применяя делей.
данные передаются пакетами разного объема
while (Serial.available() > 0) { bt = Serial.read(); btSTR += bt; //строка delayMicroseconds(520); //чтоб успел прийти следующий байт }вы можете подсказать как записать строку из байтов получаемых через сериал? не применяя делей.
посмотри здесь #76 пример, как - там в коде DigiUSB, считай, что то Serial.
проехали с неправиль вставленным кодом, я уже понял свою ошибку.
вы можете подсказать как записать строку из байтов получаемых через сериал? не применяя делей.
данные передаются пакетами разного объема
while (Serial.available() > 0) { bt = Serial.read(); btSTR += bt; //строка delayMicroseconds(520); //чтоб успел прийти следующий байт }Данная конструкция предназначена для того, чтобы за несколько (сколько потребуется) проходов цикла смогла собрать строку и при этом не тратилось бы время на ожидание. Т.е. пока принимается строка, можно делать еще какую-нибудь полезную работу.
Плюс в том, что мы ничего не ждем, а минус - что за один раз строка, как правило, просто не успеет собраться.
Контрукция - правильная, только ее нужно так же правильно использовать. Т.е. не пытаться выудить из нее после первого же прохода строку целиком, а по окончанию цикле while проверять, закончена ли строка или еще нет. И предпринимать необходимые действия только в том случае, когда строка закончена.
вы можете подсказать как записать строку из байтов получаемых через сериал? не применяя делей.
Не могу. Нельзя получить данные, которые ещё не пришли. А дождаться их прихода без делей или его заменителей нельзя.
Данные надо собирать не за раз, а за несоклько (сколько пторебуется) проходов функции loop.
ясно.
всем спасибо. буду думать))
А дождаться их прихода без делей или его заменителей нельзя.
зачем ждать данные - пусть данные сам ждут в приёмном буфере
по нормальному у пакетов данных должны быть заголовки (в которых, например, длина пакета указана) или может маркеры какие, например, начала или конца пакета, ну и совсем хорошр если ещё контрольная сумма присутствует.
Всё это облегчает приём таких пакетов не за один проход луп, а за много (что позволяет спокойно выполнять остальной код).