Комментарии 26
Буду следить за публикациями.
Не могу не упомянуть протокол «Firmata». (http://robocraft.ru/blog/arduino/283.html)
Очень рекомендую изучить тему текстовых парсеров на основе конечных автоматов. Например, можно попробовать написать простейший парсер (для начала консольный, а не для ардуины) на связке bison + flex.
Холивары холиварами… но последствия адрдуины уже имеются.
Что если вашей программе на вход скормить очень длинную строку? Памяти в контроллере мало, и она совмещена со стеком… быстро переполняется и разрушает стек с соответствующими последствиями.
Надо добавлять контроль максимальной длины строки, для защиты от непреднамеренных ошибок хотябы. Если набрали в строку 32{подставить своё значение не больше свободного объёма RAM} символа а перевода строки всё ещё нет — дальнейшие символы надо игнорировать во избежание разрушения стека — что-то пошло не так.
Что если вашей программе на вход скормить очень длинную строку? Памяти в контроллере мало, и она совмещена со стеком… быстро переполняется и разрушает стек с соответствующими последствиями.
Надо добавлять контроль максимальной длины строки, для защиты от непреднамеренных ошибок хотябы. Если набрали в строку 32{подставить своё значение не больше свободного объёма RAM} символа а перевода строки всё ещё нет — дальнейшие символы надо игнорировать во избежание разрушения стека — что-то пошло не так.
Спасибо за взгляд со стороны и вскрытую уязвимость. Там, где я думал применять эту конструкцию, он бы себя не проявил. Ну, а на счет последствий… Вот вы беретесь утверждать, что мир МК юзерфрендли для абсолютных нубов? Я, лично, сомневаюсь. Я бы и не подумал даже сюда лезть. Однако сейчас я уже могу писать быдлокод — прогресс налицо. И, да, отказываться от Arduino IDE я таки собираюсь.
Не обязательно отказываться от Arduino IDE, надо просто изучить как она работает. В дальнейшем она может сэкономить массу времени на создании пилотных версий проектов, каких-то единичных вещей которые должны отработать минуту-десять-час и больше не понадобятся.
Достаточно уметь работать без неё, изучить работу голого контроллера чтобы понять как на железо ложится программа написанная в среде ардуино и т.д.
Я так думаю едва ли стоит переходить на чистый С для МК если вы не собираетесь становится профессиональным программистом. Всё то же самое можно делать и в Arduino IDE, просто не использовать универсальные громоздкие обёртки.
Достаточно уметь работать без неё, изучить работу голого контроллера чтобы понять как на железо ложится программа написанная в среде ардуино и т.д.
Я так думаю едва ли стоит переходить на чистый С для МК если вы не собираетесь становится профессиональным программистом. Всё то же самое можно делать и в Arduino IDE, просто не использовать универсальные громоздкие обёртки.
Тут дело не в ардуине — это стандартный недосмотр, который может допустить кто угодно (привет, HeartBleed).
Насколько помню, ардуиновский обработчик последовательного порта, просто перестанет писать в буфер, размер которого можно менять, кстати.
В стеке ничего не потрется.
А вот обработка «не ожидаемых» пакетов полностью на разработчике.
В стеке ничего не потрется.
А вот обработка «не ожидаемых» пакетов полностью на разработчике.
Я так понимаю, вы сделали свой протокол. Но, зачем в текстовом виде?
Почему не работать двоичными данными. Тогда не будет жутких обработок строк.
Например нужно записать значение в аналогАут:
0х01 0х01 0хАА — всего три байта — команда, порт и значение.
А теперь представьте, насколько быстрее сравнение (свитч туда-же) работают с байтам.
Предлагаю, разобраться и написать статью, как сделать это без стрингов (соответственно, и без парсеров).
Столько интересного, а подсчет контрольной суммы, а переменная длина пакета, а переспросы, а ответные статусы…
Навалом же готового.
Почему не работать двоичными данными. Тогда не будет жутких обработок строк.
Например нужно записать значение в аналогАут:
0х01 0х01 0хАА — всего три байта — команда, порт и значение.
А теперь представьте, насколько быстрее сравнение (свитч туда-же) работают с байтам.
Предлагаю, разобраться и написать статью, как сделать это без стрингов (соответственно, и без парсеров).
Столько интересного, а подсчет контрольной суммы, а переменная длина пакета, а переспросы, а ответные статусы…
Навалом же готового.
Я хочу попробовать связать контроллер с вебом посредством отправки и принятия GET запросов. Следовательно, работа со строками необходима :)
Но в Вашем направлении тоже стоит предпринять какие-то шаги, буду иметь ввиду.
Но в Вашем направлении тоже стоит предпринять какие-то шаги, буду иметь ввиду.
Можно вобще слать 1 байт, условно разбив байт на значения, к примеру:
| 00 | 0 | 0 | 0010 |
| | | |
| | | Номер порта, с которым что то делаем
| | Бит действия, GET / SET
| Режим порта HIGH / LOW
Еще что либо
Каждый программист должен хотя бы 1 раз в жизни написать свой 1)парсер 2)макропроцессор 3)printf.
Вы на правильном пути )
Вы на правильном пути )
Что-то вспомнилось, как я будучи студентом 3-го курса пытался впихнуть в attiny2313 (с 2кб памяти) программу способную определять скорость вращения двигателя и выводить результат на ЖК экран. Я тогда так увлекся оптимизацией кода по выводы данных на экран, что совсем позабыл про цель работу. В конечном итоге скорость определялась мягко говоря не очень… Кто бы что ни говорил, но Arduino (а точнее atmega328p и более старшие модели), помогает решать многие проблемы одним простым sprintf-ом, например, оставляя время на более важные проблемы.
Может, попробуете посмотреть в сторону готовой библиотеки MicroRL?
Помнится, я писал аналогичные «затычки» как для парсинга строк, так и для вывода на экран (странное то, что сначала — на ЖК экран, а уже затем — в консоль), но решил наконец перейти на готовое. Или на сублиматы — подготовленное к использованию.
Помнится, я писал аналогичные «затычки» как для парсинга строк, так и для вывода на экран (странное то, что сначала — на ЖК экран, а уже затем — в консоль), но решил наконец перейти на готовое. Или на сублиматы — подготовленное к использованию.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Обрабатываем строки на Arduino