большая строка не компилируется
- Войдите на сайт для отправки комментариев
Ср, 09/12/2015 - 14:06
Не хочет компилится скетч со строкой большой длины, вот такой
String message2 = String ("<html><head><script>var connection = new WebSocket('ws://'+location.hostname+':81/', ['arduino']);connection.onopen = function () { connection.send('Connect ' + new Date()); }; connection.onerror = function (error) { console.log('WebSocket Error ', error);};connection.onmessage = function (e) { console.log('Server: ', e.data);};function sendRGB() { var r = parseInt(document.getElementById('r').value).toString(16); var g = parseInt(document.getElementById('g').value).toString(16); var b = parseInt(document.getElementById('b').value).toString(16); if(r.length < 2) { r = '0' + r; } if(g.length < 2) { g = '0' + g; } if(b.length < 2) { b = '0' + b; } var rgb = '#'+r+g+b; console.log('RGB: ' + rgb); connection.send(rgb); }</script></head><body>LED Control:<br/><br/>R: <input id=\"r\" type=\"range\" min=\"0\" max=\"255\" step=\"1\" onchange=\"sendRGB();\" /><br/>G: <input id=\"g\" type=\"range\" min=\"0\" max=\"255\" step=\"1\" onchange=\"sendRGB();\" /><br/>B: <input id=\"b\" type=\"range\" min=\"0\" max=\"255\" step=\"1\" onchange=\"sendRGB();\" /><br/></body></html>");
почему не знаете?
Оперативы не хватает.
Компилятор знает, почему не компилируется, он даже выдает сообщение, что ему не понравилось, а мы не знаем. Наверное это тайна или тест такой, кто тут телепат, нет?
Ковычек больно много
Ковычек больно много
все кавычки экранированы вроде.
Коллеги, кавычки ни при чем, вместо странички html, я тупо забивал в строку цифры от 0 до 9 и так 90 раз, без каких либо других символов и пробелов, итого 900 байт в строке. Результать тот же. убираю 50 символов(остаток 850), все нормально компилируется. скетч пустой, только первоначальный шаблон и строка, не думаю что ОЗУ не хватает.
Да и компилятор не ругется, как обычно деликатно указывая на ошибку, а тупо зависает, прогресс справа типа тоже встает колом. Вот скриншот:
Класс String занимает несколько больше места в памяти, чем массив символов string.
может быть по этому?
Коллеги, кавычки ни при чем, вместо странички html, я тупо забивал в строку цифры от 0 до 9 и так 90 раз, без каких либо других символов и пробелов, итого 900 байт в строке. Результать тот же. убираю 50 символов(остаток 850), все нормально компилируется. скетч пустой, только первоначальный шаблон и строка, не думаю что ОЗУ не хватает.
Ардуино Уно?
Сообщения компилятора секретны?
изначально это вылезло в скетче под esp8266, пробовал и под UNO, то же самое. Никаких сообщений компилятор не выводит, стопор на скриншоте
разбей на две строки, видимо такая ИДЕ.
Похоже на баг в IDE, потому что она падает, что видно на скриншоте.
ну как же я вебклиенту буду html-страницу по частям отправлять?
одну за одной.
Вряд ли в IDE дело. Просто почти килобайт вподряд - слишком много.
Попробуйте F()
Можете считать как хотите, но exception в IDE это факт, который виден на скриншоте.
Про килобайт я ничего не говорил. Никто не спорит, что строка большая.
Да, очень похоже на косяк в ИДЕ. Скорее всего бяда с ихней "переделкой скетча". Можно попробовать скомпилять руками в arv-gcc. Делается относительно не сложно: открываете хоть тот же Блинк, только из того места, где у вас лежит этот скетч, а не из примеров. Включаете "болтливый режим" (выводить сообщения при компиляции) и запускаете на компиляцию. Там будет строка запуска avr-gcc+ с указанием путей куда он запихал файл для компиляции (временный каталог) .. вот переходите в него, копируете этот проблемный скетч тудаже и из консоли (командной строки) запускаете свой скетч на компиляцию через копи-пасте и правку (заменить название файла) .. смотрите чего кажет компилятор.
Скорее всего съест нормально. Можно ещё добавить в конце опцию -Е и получить файл после обработки препроцессором БЕЗ компиляции. Это на случай посмотреть как развернулись разные #define, если интересно. Компилятору на длину строки - пофиг.
Я так себе настраивал kate для работы в терминале БЕЗ Ардуино ИДЕ .. там же и сборщик пашет и avr-dude .. да и времнные каталоги уже свои. Просто смотрите чего да как ИДЕ запускаете и делаете себе "батник".
Да, если ещё добавлять компилятору опции для ассемблера -Wa,-achls=file_path_name.asm , то можно получить то, что выдает компилятор и полюбопытствовать чего попадает в Ассемблер.
А если добавить опции для линковщика -Wl,--cref -Wl,-map=map_file , то можно получить и перекрестные ссылки и карту памяти.
А можно добавлять команды и библиотекарю .. и hex файл выдать "куда нужно" и .. :)
Да неважно какая длина, должно хавать всё. С массивом, который вы захотите разместить во флеш (const char mass[] PROGMEM) будет таже история. Голый winavr ясное дело что захавает, тут глюк это именно ИДЕ, даже по скриншоту видно что ошибку вываливает какая-то java.util. ))))
Старая добрая командная строка! Надо бы конечно попробовать скомпилировать напрямую без IDE, для чистоты эксперимента. Кто бы еще ткнул пальцем как это сделать. Где собирается эта вся штука я знаю. Вот что выдает IDE при удачной компиляции испытуемого скетча "sketch_dec09a.cpp":
И как из этого выделить нужную строку запуска компилятора ума не приложу.
попробуй http://inotool.org/ если дефолтная ИДЕ падает
Кстати во временных папках при неудачной компиляции остается файл stderr.txt, файл ошибок я так понимаю, с вот таким содержанием:
Про StackOverflowError пишут на сайте java "Thrown when a stack overflow occurs because an application recurses too deeply."
Кривость ИДЕ очевидна. Но ТС не прав в своем подходе. Все в одну строку и так отправлять совсем не правильно. Разбивать нужно. Причем даже не на 2 а на много более. Смотрите например на фрагмент
var r = parseInt(document.getElementById('r').value).toString(16); var g = parseInt(document.getElementById('g').value).toString(16); var b = parseInt(document.getElementById('b').value).toString(16);
Там жеж стока возможностей!
строка 01 у вас и есть вызов компилятора для самого скетча. параметр -о указывает полное имя выходного файла компиляции. Его можно заменить на что-то более вразумительное и после можно добавлять все те опции о которых писал выше для тех или иных целей.
53,54 строки как понимаю у вас создают hex файл для дальнейшей заливки в машинку. Самой заливки тут нет, только компиляция.
Ошибка stackoverflow - да, переполнение стека, косяк ИДЕ.
Пробовал на IDE версии 1.6.7, такого косяка нет, но почему то не могу сдружить ее с пакетом для esp8266.
Я так и не пойму, как мне разделить строку с html-ным кодом в данном контексте:
С "железками" у меня лучше получается дружить, их хоть можно потрогать))), а эти web-технологии просто амеба какая то.
Чисто ради интереса в 1.6.5 сформировал большую строку. 1500 символов. На большее в UNO не хватает памяти.
Но, если честно, не понимаю где такие штуки необходимы.
Чисто ради интереса в 1.6.5 сформировал большую строку. 1500 символов. На большее в UNO не хватает памяти.
Но, если честно, не понимаю где такие штуки необходимы.
В вашем варианте мне тоже непонятно зачем "топор использовать заместо скальпеля" или наоборот .. можно конечно, им даже бреются некоторые.
Ардуино - это платформа по управлению железками включить там, выключить .. ну при желании свистнуть что тут что-то не туда втыкнулось или свет пропал .. а вы пытаетесь это приспособить для работы с html, который болтлив, тяжел и предназначен для связей и обменов с совсем иными целями .. или надо железо поменять на то, которое приспособлено или задачу видоизменить, приспособив к железу .. а так, смешно просто. :)
В вашем варианте мне тоже непонятно зачем "топор использовать заместо скальпеля" или наоборот .. можно конечно, им даже бреются некоторые.
Ардуино - это платформа по управлению железками включить там, выключить .. ну при желании свистнуть что тут что-то не туда втыкнулось или свет пропал .. а вы пытаетесь это приспособить для работы с html, который болтлив, тяжел и предназначен для связей и обменов с совсем иными целями .. или надо железо поменять на то, которое приспособлено или задачу видоизменить, приспособив к железу .. а так, смешно просто. :)
Спасибо что не запрещаете смеяться. :)
Решение банальное: каждый инструмент хорош ровно для своих задач и послабее он или помощней - никакой разницы. У Вас задача для дуньки - управление сыроваркой. Это её сфера применения. Но вам надо передавать "некоторые данные" .. ну так и передавайте ИХ, а не html-страницу обвешанную js-скриптами и прочей лабудой для html. И все ваши "проблемы" (которые вы сами себе и создали) отпадут сами собой. Не стоит скальпелем (ардуиной) дом рубить (html отсылать). А вот получив ТОЛЬКО данные, ноутбуком можете хоть веб-морду рисовать хоть в каком "всплывающем" интерфейсе показывать .. он с этим справится гораздо лучше дуньки.
Ну почему же. Дунька все замечательно умеет. Как раз задача мониторинга и управления.
Ставится w5100 , хоть на нану (сейчас мега, пока отладка). Страница закидывается на SD. С нее и пересылается , только не буфером , а посимвольно. Вместе с нею живут AJAX - скрипты.
И что, работает ваш вариант? А мой вариант не пробовали? Я же говорил для чего мне нужна такая строка, что же тут непонятного?
Работает. Это легко проверить. Вариант приведён в полной форме.
Ваш вариант не пробовал, так как Вы привели фрагмент, который требуется дополнять, то есть домысливать Ваши действия. А при этом никто не сможет гарантировать, что я или кто либо ещё кроме Вас, сможет это сделать так, как это сделали Вы.
Ваша идея понятна, однако не ясно для чего Вам несколько переменных очень большого размера, которые по сути не нужны постоянно для работы программы. Почему бы не разместить инструкции, требуемые для Вашей программы в PROGMEM, а затем по мере необходимости выплёвывать их аккуратными порциями в сторону "сервера"?
"аккуратными порциями" - это как, можно подробней?
Давайте попробуем так:
Да, с сожалению ethernet-шилда у меня нет, и в html я понимаю слабо.
Но с моей точки зрения должен быть способ отправки html-строки посимвольно, а не пачкой.
Это открывает большие возможности, потому что в PROGMEM можно запихать достаточно много информации.