Как стать автором
Обновить

Комментарии 26

Буду следить за публикациями.
Не могу не упомянуть протокол «Firmata». (http://robocraft.ru/blog/arduino/283.html)
Очень рекомендую изучить тему текстовых парсеров на основе конечных автоматов. Например, можно попробовать написать простейший парсер (для начала консольный, а не для ардуины) на связке bison + flex.
Холивары холиварами… но последствия адрдуины уже имеются.
Что если вашей программе на вход скормить очень длинную строку? Памяти в контроллере мало, и она совмещена со стеком… быстро переполняется и разрушает стек с соответствующими последствиями.
Надо добавлять контроль максимальной длины строки, для защиты от непреднамеренных ошибок хотябы. Если набрали в строку 32{подставить своё значение не больше свободного объёма RAM} символа а перевода строки всё ещё нет — дальнейшие символы надо игнорировать во избежание разрушения стека — что-то пошло не так.
Спасибо за взгляд со стороны и вскрытую уязвимость. Там, где я думал применять эту конструкцию, он бы себя не проявил. Ну, а на счет последствий… Вот вы беретесь утверждать, что мир МК юзерфрендли для абсолютных нубов? Я, лично, сомневаюсь. Я бы и не подумал даже сюда лезть. Однако сейчас я уже могу писать быдлокод — прогресс налицо. И, да, отказываться от Arduino IDE я таки собираюсь.
Не обязательно отказываться от Arduino IDE, надо просто изучить как она работает. В дальнейшем она может сэкономить массу времени на создании пилотных версий проектов, каких-то единичных вещей которые должны отработать минуту-десять-час и больше не понадобятся.
Достаточно уметь работать без неё, изучить работу голого контроллера чтобы понять как на железо ложится программа написанная в среде ардуино и т.д.
Я так думаю едва ли стоит переходить на чистый С для МК если вы не собираетесь становится профессиональным программистом. Всё то же самое можно делать и в Arduino IDE, просто не использовать универсальные громоздкие обёртки.
Мне 19 лет, и то, чем я сейчас занимаюсь, мне нравится. Я пойду учится делать это профессионально. Хочу остаться в этой сфере.
Тут дело не в ардуине — это стандартный недосмотр, который может допустить кто угодно (привет, HeartBleed).
На самом деле конкретно тут и не нужно строку в ОЗУ хранить, достаточно 2-3 байт для хранения состояния парсера, ну и сотня-другая байт флешки для хранения кода парсера.
Я к тому, что наезд на ардуино тут необоснованный:) Конечно, можно оптимальнее и безопаснее сделать.
ToSHiC, а набросали бы тоже материал? Любопытно, может и я для себя что нового увижу.
Насколько помню, ардуиновский обработчик последовательного порта, просто перестанет писать в буфер, размер которого можно менять, кстати.
В стеке ничего не потрется.
А вот обработка «не ожидаемых» пакетов полностью на разработчике.

Это другой буфер, который наполняется если данные долго не востребованы.
Я так понимаю, вы сделали свой протокол. Но, зачем в текстовом виде?
Почему не работать двоичными данными. Тогда не будет жутких обработок строк.

Например нужно записать значение в аналогАут:
0х01 0х01 0хАА — всего три байта — команда, порт и значение.
А теперь представьте, насколько быстрее сравнение (свитч туда-же) работают с байтам.

Предлагаю, разобраться и написать статью, как сделать это без стрингов (соответственно, и без парсеров).
Столько интересного, а подсчет контрольной суммы, а переменная длина пакета, а переспросы, а ответные статусы…
Навалом же готового.
Я хочу попробовать связать контроллер с вебом посредством отправки и принятия GET запросов. Следовательно, работа со строками необходима :)
Но в Вашем направлении тоже стоит предпринять какие-то шаги, буду иметь ввиду.
Ну, урл в любом случае стринговый :)
Хотя-бы простой парсер ресурса и параметров, конечно нужен.
Можно и по ip заходить же ) Если учитывать, что дальше локальной сети моей квартиры это не уйдет, то вполне себе норм :)
Да и не стал бы я писать сюда с самодельным протоколом работы с двоичными данными :) Как вы правильно сказали, и так навалом всего.
Посмотрите мою статью в которой я управляю ардуиной методом GET запросов с последующим парсингом комманд
http://habrahabr.ru/post/259579/
Можно вобще слать 1 байт, условно разбив байт на значения, к примеру:

| 00 | 0 | 0 | 0010 |
  |    |   |     |
  |    |   |     Номер порта, с которым что то делаем
  |    |   Бит действия, GET / SET
  |    Режим порта HIGH / LOW
  Еще что либо



Каждый программист должен хотя бы 1 раз в жизни написать свой 1)парсер 2)макропроцессор 3)printf.
Вы на правильном пути )
Но, видимо, в самом самом его начале, т.к. что такое макропроцессор и printf я даже понятия не имею :)
Но спасибо )
Осознал, что пару месяцев назад написал printf :)))
Что-то вспомнилось, как я будучи студентом 3-го курса пытался впихнуть в attiny2313 (с 2кб памяти) программу способную определять скорость вращения двигателя и выводить результат на ЖК экран. Я тогда так увлекся оптимизацией кода по выводы данных на экран, что совсем позабыл про цель работу. В конечном итоге скорость определялась мягко говоря не очень… Кто бы что ни говорил, но Arduino (а точнее atmega328p и более старшие модели), помогает решать многие проблемы одним простым sprintf-ом, например, оставляя время на более важные проблемы.
Может, попробуете посмотреть в сторону готовой библиотеки MicroRL?
Помнится, я писал аналогичные «затычки» как для парсинга строк, так и для вывода на экран (странное то, что сначала — на ЖК экран, а уже затем — в консоль), но решил наконец перейти на готовое. Или на сублиматы — подготовленное к использованию.
Не знал о существовании такой, спасибо!
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации