задержка при использовании аппаратного сериал

Buzoff
Offline
Зарегистрирован: 03.04.2018

здравствуйте.

обьясните, пожалуйста, почему при аппаратном сериал задержка нужна (в моем случае 0,5мс), а при програмном нет.

пример кода 1:

Moderator : пожалуйста, вставьте код правильно - http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii

 

Buzoff
Offline
Зарегистрирован: 03.04.2018

задача стоит такая, при получении определенной строки - моргнуть светодиодом.

думал что с аппаратныс ЮАРТом будет надежнее, но без паузы не работает запись строки.

а при програмном ЮАРТе работает без задержек.

при  скорости 19200, ждать по 500мкс не очень подходит

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Вообще-то код полагается вставлять по правилам - иначе его нрикто читать не будет.

Я, например, не читал, но, если отвечать на Ваш вопрос, то, вероятнее всего, Вы неправильноработаете с портом, а именно - не выясняете, пришли ли данные, прежде, чем их читать. 

Ну а вообще - при скорости 19200 передача одного байта занимает никак не меньше 520 мкс, так что ждать в любом случае придется, вне зависимости от того, подходит это или нет.

 

PS. Да, при программном - точно такие же задержки, только если при аппаратном процессор курит, то при программном - пыхтит, не переставая. Т.е. в первом варианте - 520 мкс ожидания, а во втором - 520 мкс судорожной работы.

Buzoff
Offline
Зарегистрирован: 03.04.2018

Знаю что неправильно вставил код. Не могу отредактировать первый пост.

Подскажите как правильно собрать строку, чтоб не использовать принудительные остановки цикла?

Buzoff
Offline
Зарегистрирован: 03.04.2018

Везде в примерах так:
while (Serial.available() > 0) {
bt = Serial.read();
btSTR += bt;
}
Вот я и подумал, что оно автоматом дожидается следующий байт. А если задуматься, то и правда, цикл проходит быстрее чем прийдет следующий байт.

Buzoff
Offline
Зарегистрирован: 03.04.2018

Я так понимаю в данном примере без delay тут никак

ДмитрийВ
Offline
Зарегистрирован: 02.07.2019

если данные будут приходить быстрей, чем вы собираете строку, то вы никогда её не соберёте, а с задержкой подавно.
Так вообще не делается.
Или проще, если данные будут постоянно поступать, то цикл превращается в бесконечный.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Buzoff пишет:
Везде в примерах так: while (Serial.available() > 0) { bt = Serial.read(); btSTR += bt; } Вот я и подумал, что оно автоматом дожидается следующий байт. А если задуматься, то и правда, цикл проходит быстрее чем прийдет следующий байт.
Опять не смогли код вставить? :(

Buzoff
Offline
Зарегистрирован: 03.04.2018

Как раз с задержкой и работает.
Цикл заканчивается быстрее чем приходит следующий байт. Поэтому и приходится делать паузы.

Buzoff
Offline
Зарегистрирован: 03.04.2018

Евгений, я сейчас пишу с телефона.

ДмитрийВ
Offline
Зарегистрирован: 02.07.2019

Buzoff пишет:
Как раз с задержкой и работает.
Цикл заканчивается быстрее чем приходит следующий байт. Поэтому и приходится делать паузы.

С задержкой работает потому, что вы прекращаете слать данные. Запустите бесконечную отправку данных на com-порт и увидите результат.

Buzoff
Offline
Зарегистрирован: 03.04.2018

Правильно. У меня данные идут пакетами.

ДмитрийВ
Offline
Зарегистрирован: 02.07.2019

Buzoff пишет:
Правильно. У меня данные идут пакетами.

Тогда определите размер пакета в цикле чтения и выходите когда размер пакета достигнут.

Buzoff
Offline
Зарегистрирован: 03.04.2018

Спасибо, Andriano.

Клапауций 003
Offline
Зарегистрирован: 20.07.2019

Buzoff пишет:
Евгений, я сейчас пишу с телефона.

пишу на спине убитого товарища - извините за неровный почерк.(с) о_О

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Buzoff пишет:
Евгений, я сейчас пишу с телефона.

Большинство людей не читают код, вставленный как попало, а потому просто не могут Вам помочь.

А так - Вы свободный человек и вольны писать хоть с телефона, хоть с пылесоса - дело Ваше.

Buzoff
Offline
Зарегистрирован: 03.04.2018

ЕвгенийП пишет:

Buzoff пишет:
Евгений, я сейчас пишу с телефона.

Большинство людей не читают код, вставленный как попало, а потому просто не могут Вам помочь.

А так - Вы свободный человек и вольны писать хоть с телефона, хоть с пылесоса - дело Ваше.

проехали с неправиль вставленным кодом, я уже понял свою ошибку.

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

данные передаются пакетами разного объема

while (Serial.available() > 0) {
bt = Serial.read();
btSTR += bt;         //строка
delayMicroseconds(520);  //чтоб успел прийти следующий байт
}

 

Клапауций 003
Offline
Зарегистрирован: 20.07.2019

Buzoff пишет:

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

посмотри здесь #76 пример, как - там в коде DigiUSB, считай, что то Serial.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Buzoff пишет:

проехали с неправиль вставленным кодом, я уже понял свою ошибку.

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

данные передаются пакетами разного объема

while (Serial.available() > 0) {
bt = Serial.read();
btSTR += bt;         //строка
delayMicroseconds(520);  //чтоб успел прийти следующий байт
}

 

Данная конструкция предназначена для того, чтобы за несколько (сколько потребуется) проходов цикла смогла собрать строку и при этом не тратилось бы время на ожидание. Т.е. пока принимается строка, можно делать еще какую-нибудь полезную работу.

Плюс в том, что мы ничего не ждем, а минус - что за один раз строка, как правило, просто не успеет собраться.

Контрукция - правильная, только ее нужно так же правильно использовать. Т.е. не пытаться выудить из нее после первого же прохода строку целиком, а по окончанию цикле while проверять, закончена ли строка или еще нет. И предпринимать необходимые действия только в том случае, когда строка закончена.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Buzoff пишет:

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

Не могу. Нельзя получить данные, которые ещё не пришли. А дождаться их прихода без делей или его заменителей нельзя.

Данные надо собирать не за раз, а за несоклько (сколько пторебуется) проходов функции  loop.

Buzoff
Offline
Зарегистрирован: 03.04.2018

ясно.

всем спасибо. буду думать))

Клапауций 003
Offline
Зарегистрирован: 20.07.2019

ЕвгенийП пишет:

А дождаться их прихода без делей или его заменителей нельзя.

зачем ждать данные - пусть данные сам ждут в приёмном буфере

MaksVV
Offline
Зарегистрирован: 06.08.2015

по нормальному у пакетов данных должны быть заголовки (в которых, например, длина пакета указана) или может маркеры какие, например, начала или конца пакета, ну и совсем хорошр если ещё контрольная сумма присутствует. 

Всё это облегчает приём таких пакетов не за один проход луп, а за много (что позволяет спокойно выполнять остальной код).