Неявные преобразования типа char

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DIYMan пишет:

ua6em пишет:

Вот, вот, как вообще у любителей к коим себя отношу что-то работает )))

Написано криво, вот и не работает, как надо, чему тут удивляться? В строке 14 в буфере может не быть ничего, т.к. до этого уже читали с буфера.

то-есть вся строка переданная , а это строка 'A123' уже считана?

В туториале пишут, что функция Serila.read() считывает следующий доступный байт из буфера, логично жеж предположить, что следующий байт после A это 1???
Так как функция продолжает работать дальше, откуда она эти байты достаёт?

Откуда достает данные строка 10?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Ещё раз: в строке 14 - косяк. Для того, чтобы это понять - достаточно проговорить код, начиная с начала. В начале проверяется, "а есть ли хотя бы ОДИН байт в приемном буфере", затем этот байт читается, а в строке 14, если в приемном буфере был на момент проверки всего один байт - можем получить кукиш.

Код - переписывать, если ждёшь пакет определённой длины, влезающий в приемный буфер - то проще всего в if(Serial.available добавить проверку if(Serial.available() > 4 - как пример, условие сработает только при наличии 5 и больше уже принятых по UART байт.

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DIYMan пишет:

Ещё раз: в строке 14 - косяк. Для того, чтобы это понять - достаточно проговорить код, начиная с начала. В начале проверяется, "а есть ли хотя бы ОДИН байт в приемном буфере", затем этот байт читается, а в строке 14, если в приемном буфере был на момент проверки всего один байт - можем получить кукиш.

Код - переписывать, если ждёшь пакет определённой длины, влезающий в приемный буфер - то проще всего в if(Serial.available добавить проверку if(Serial.available() > 4 - как пример, условие сработает только при наличии 5 и больше уже принятых по UART байт.

Я правильно понимаю - первый вызов функции Serial.read() чистит буфер полностью, так выходит из теста, куда он это сохраняет
Если бы я не работал с серийным портом ранее напрямую и не понимал на уровне железа как он программируется когнитивного диссонанса не возникало...

Этот пример именно так, неправильно, написан исключительно в целях познания работы этой функции

sadman41
Онлайн
Зарегистрирован: 19.10.2016

И вновь "специально написанный неправильный пример"... А правильный-то чего никто из "исследователей" не пишет?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sadman41 пишет:

И вновь "специально написанный неправильный пример"... А правильный-то чего никто из "исследователей" не пишет?

а он и правильный одновременно, удалить 14,15 и 18 строки вставленные для исследования )))

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

ua6em пишет:

Я правильно понимаю - первый вызов функции Serial.read() чистит буфер полностью, так выходит из теста, куда он это сохраняет
Если бы я не работал с серийным портом ранее напрямую и не понимал на уровне железа как он программируется когнитивного диссонанса не возникало...

Этот пример именно так, неправильно, написан исключительно в целях познания работы этой функции

Serial.read не чистит буфер полностью. Посмотрите уже наконец исходники, если действительно интересуетесь вопросом - там всё более чем прозрачно написано. Да и в документации по Serial.read чётко сказано, что она делает.

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

ua6em пишет:

Я правильно понимаю - первый вызов функции Serial.read() чистит буфер полностью

Неправильно. Она читает один байт и ей глубоко начхать есть там в буфере что-то ещё или нет.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

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

ua6em пишет:

Я правильно понимаю - первый вызов функции Serial.read() чистит буфер полностью

Неправильно. Она читает один байт и ей глубоко начхать есть там в буфере что-то ещё или нет.

Можете пояснить, почему строка 14 не считывает следующий байт (из последовательности A123), говоря, что буфер пуст?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

ua6em пишет:

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

ua6em пишет:

Я правильно понимаю - первый вызов функции Serial.read() чистит буфер полностью

Неправильно. Она читает один байт и ей глубоко начхать есть там в буфере что-то ещё или нет.

Можете пояснить, почему строка 14 не считывает следующий байт (из последовательности A123), говоря, что буфер пуст?

Потому что была проверка только на наличие НЕНУЛЕВОГО кол-ва байт (один байт - тоже ненулевое значение) в приемном буфере, далее, выше строки 14 - ВОЗМОЖНЫЙ ЕДИНСТВЕННЫЙ байт в приемном буфере был вычитан, посему в строке 14 МОЖЕТ возникнуть ситуация, что приемный буфер УЖЕ пуст. Очевидно же.

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

ua6em пишет:
почему строка 14 не считывает следующий байт (из последовательности A123), говоря, что буфер пуст?
Потому, что он пуст. Не пришло туде ещё ничего. Подождать надо.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

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

ua6em пишет:
почему строка 14 не считывает следующий байт (из последовательности A123), говоря, что буфер пуст?
Потому, что он пуст. Не пришло туде ещё ничего. Подождать надо.

слона то я и не приметил )))