Содержание
- mirsovetov.net
- Андрощук Александр, ИТ решения, советы, заметки…
- stray # in program
- Типичные ошибки Arduino, читать всем новичкам или сносим не предупреждая!
- mechanic
- Error stray 320 in program
- migrated from security.stackexchange.com Oct 5 ’13 at 13:26
- 13 Answers 13
- 2 Answers 2
- protected by Community ♦ Jan 7 ’18 at 7:47
- maccatalan
mirsovetov.net
Андрощук Александр, ИТ решения, советы, заметки…

stray # in program
При компиляции проекта в Android IDE возникла ошибка
LampCore:20: error: stray ‘302’ in program
Код, который вызывал ошибку не был какой то особенный, была объявлена простенькая структура с полями:
В моем случае ошибка возникла из за того, что я случайно в названии структуры Config написал не латинский символ C. Самое интересное что с виду все кажется в порядке, а на самом деле это не так, и возникает ошибка «stray ‘320’ in program».
Так что решение — использовать только латинские символы (это не касается комментариев).
Также могут возникать другие ошибки такого же рода, только с другим кодом
Скорее всего что следующие ошибки:
error stray 2 in program
error stray 200 in program
error stray 201 in program
error stray 213 in program
error stray 223 in program
error stray 226 in program
error stray 227 in program
error stray 240 in program
error stray 253 in program
error stray 273 in program
error stray 302 in program
error stray 320 in program
error stray 321 in program
error stray 340 in program
error stray 342 in program
error stray 357 in program
error stray 361 in program
тоже связанны с этой проблемой, если это не так, пожалуйста отпишитесь в комментариях.
Источник
Типичные ошибки Arduino, читать всем новичкам или сносим не предупреждая!
![]()
mechanic
ЧИТАЕМ, НЕ ЛЕНИМСЯ!
99% всех проблем прошивки написаны здесь!
1. Плата подключается к компьютеру по USB, на ней должны замигать светодиоды. Если этого не произошло:
- Неисправен USB кабель
- Неисправен USB порт компьютера
- Неисправен USB порт Arduino
- Попробуйте другой компьютер, чтобы исключить часть проблем из списка
- Попробуйте другую плату (желательно новую), чтобы исключить часть проблем из списка
- На плате Arduino сгорел входной диод по линии USB из-за короткого замыкания, устроенного пользователем при сборке схемы
- Плата Arduino сгорела полностью из-за неправильного подключения пользователем внешнего питания или короткого замыкания
2. Компьютер издаст характерный сигнал подключения нового оборудования, а при первом подключении появится окошко “Установка нового оборудования”. Если этого не произошло:
- См. предыдущий список неисправностей
- Кабель должен быть data-кабелем, а не “зарядным”
- Кабель желательно втыкать напрямую в компьютер, а не через USB-хаб
- Не установлены драйверы Arduino (во время установки IDE или из папки с программой), вернитесь к установке.
3. В списке портов (Arduino IDE/Инструменты/Порт) появится новый порт, обычно COM3. Если этого не произошло:
- См. предыдущий список неисправностей
- Некорректно установлен драйвер CH341 из предыдущего урока
- Если список портов вообще неактивен – драйвер Arduino установлен некорректно, вернитесь к установке
- Возникла системная ошибка, обратитесь к знакомому компьютерщику



Возникает на этапе сборки и компиляции прошивки. Ошибки компиляции вызваны проблемами в коде прошивки, то есть проблема сугубо софтварная. Слева от кнопки “загрузить” есть кнопка с галочкой – проверка. Во время проверки производится компиляция прошивки и выявляются ошибки, если таковые имеются. Ардуино в этом случае может быть вообще не подключена к компьютеру.
- В некоторых случаях ошибка возникает при наличии кириллицы (русских букв) в пути к папке со скетчем. Решение: завести для скетчей отдельную папочку в корне диска с английским названием.
- В чёрном окошке в самом низу Arduino IDE можно прочитать полный текст ошибки и понять, куда копать
- В скачанных с интернета готовых скетчах часто возникает ошибка с описанием название_файла.h no such file or directory. Это означает, что в скетче используется библиотека , и нужно положить её в Program Files/Arduino/libraries/. Ко всем моим проектам всегда идёт папочка с использованными библиотеками, которые нужно установить. Также библиотеки всегда можно поискать в гугле по название файла.
- При использовании каких-то особых библиотек, методов или функций, ошибкой может стать неправильно выбранная плата в “Инструменты/плата“. Пример: прошивки с библиотекой Mouse.h или Keyboard.h компилируются только для Leonardo и Micro.
- Если прошивку пишете вы, то любые синтаксические ошибки в коде будут подсвечены, а снизу в чёрном окошке можно прочитать более детальное описание, в чём собственно косяк. Обычно указывается строка, в которой сделана ошибка, также эта строка подсвечивается красным.
- Иногда причиной ошибки бывает слишком старая, или слишком новая версия Arduino IDE. Читайте комментарии разработчика скетча
- Ошибка недостаточно свободного места возникает по вполне понятным причинам. Если в проекте используется плата Nano на процессоре 328p, а вы сэкономили три рубля и купили на 168 процессоре – скупой платит дважды. Оптимизация: статическая память – память, занимаемая кодом (циклы, функции). Динамическая память занята переменными.
Частые ошибки в коде, приводящие к ошибке компиляции
- expected ‘,’ or ‘;’ – пропущена запятая или точка запятой на предыдущей строке
- stray ‘320’ in program – русские символы в коде
- expected unqualified-id before numeric constant – имя переменной не может начинаться с цифры
- … was not declared in this scope – переменная или функция используется, но не объявлена. Компилятор не может её найти
- redefinition of … – повторное объявление функции или переменной
- storage size of … isn’t known – массив задан без указания размера
Возникают на этапе, когда прошивка собрана, скомпилирована, в ней нет критических ошибок, и производится загрузка в плату по кабелю. Ошибка может возникать как по причине неисправностей железа, так и из-за настроек программы и драйверов.
- USB кабель, которым подключается Arduino, должен быть Data-кабелем, а не кабелем только для зарядки. Нужным нам кабелем подключаются к компьютеру плееры и смартфоны.
- Причиной ошибки загрузки являются не установленные/криво установленные драйвера CH340, если у вас китайская NANO.
- Также будет ошибка avrdude: ser_open(): can’t open device, если не выбран COM порт, к которому подключена Arduino. Если кроме COM1 других портов нет – читай два пункта выше, либо попробуй другой USB порт, или вообще другой компьютер.
- Большинство проблем при загрузке, вызванных “зависанием” ардуины или загрузчика, лечатся полным отключением ардуины от питания. Потом вставляем USB и по новой прошиваем.
- Причиной ошибки загрузки может быть неправильно выбранная плата в “Инструменты/Плата”, а также неправильно выбранный процессор в “Инструменты/Процессор”. Также в свежих версиях IDE нужно выбирать ATmega328P (Old Bootloader) для китайских плат NANO.
- Если у вас открыт монитор COM порта в другом окне Arduino IDE или плата общается через СОМ порт с другой программой (Ambibox, HWmonitor, SerialPortPlotter и т.д.), то вы получите ошибку загрузки, потому что порт занят. Отключитесь от порта или закройте другие окна и программы.
- Если у вас задействованы пины RX или TX – отключите от них всё! По этим пинам Arduino общается с компьютером, в том числе для загрузки прошивки.
- Если в описании ошибки встречается bootloader is not responding и not in sync, а все предыдущие пункты этого списка проверены – с вероятностью 95% сдох загрузчик. Второй неприятный исход – загрузчик “слетел”, и его можно прошить заново.
Помимо ошибок, по причине которых проект вообще не загрузится в плату и не будет работать, есть ещё предупреждения, которые выводятся оранжевым текстом в чёрной области лога ошибок. Предупреждения могут появиться даже тогда, когда выше лога ошибок появилась надпись “Загрузка завершена“. Это означает, что в прошивке нет несовместимых с жизнью ошибок, она скомпилировалась и загрузилась в плату. Что же тогда означают предупреждения? Чаще всего можно увидеть такие:
- # Pragma message……. – сообщения с директивой Pragma обычно выводят библиотеки, сообщая о своей версии или каких-то настройках
- Недостаточно памяти, программа может работать нестабильно – Чуть выше этого предупреждения обычно идёт информация о задействованной памяти. Память устройства можно добивать до 99%, ничего страшного не случится. Это флэш память и во время работы она не изменяется. А вот динамическую память желательно забивать не более 85-90%, иначе реально могут быть непонятные глюки в работе, так как память постоянно “бурлит” во время работы. НО. Это зависит от скетча и в первую очередь от количества локальных переменных. Можно написать такой код, который будет стабильно работать при 99% занятой SRAM памяти. Так что ещё раз: это всего лишь предупреждение, а не ошибка.
Завершая раздел Введение в Arduino поговорим о вопросах, которые очень часто возникают у новичков:
- Ардуину можно прошить только один раз? Нет, несколько десятков тысяч раз, всё упирается в ресурс flash памяти. А он довольно большой.
- Как стереть/нужно ли стирать старую прошивку при загрузке новой? Память автоматически очищается при прошивке, старая прошивка автоматически удаляется.
- Можно ли записать две прошивки, чтобы они работали вместе? Нет, при прошивке удаляются абсолютно все старые данные. Из двух прошивок нужно сделать одну, причём так, чтобы не было конфликтов.
- Можно ли “вытащить” прошивку с уже прошитой Ардуины?Теоретически можно, но только в виде нечитаемого машинного кода, в который преобразуется прошивка на С++ при компиляции, т.е. вам это НИКАК не поможет, если вы не имеете диплом по низкоуровневому программированию.
- Зачем это нужно? Например есть у нас прошитый девайс, и мы хотим его “клонировать”. В этом случае да, есть вариант сделать дамп прошивки и загрузить его в другую плату на таком же микроконтроллере.
- Если есть желание почитать код – увы, прошивка считывается в виде бинарного машинного кода, превратить который обратно в читаемый Си-подобный код обычному человеку не под силу
- Вытащить прошивку, выражаясь более научно – сделать дамп прошивки, можно при помощи ISP программатора, об этом можно почитать здесь
- Снять дамп прошивки можно только в том случае, если разработчик не ограничил такую возможность, например записав лок-биты, запрещающие считывание Flash памяти, или вообще отключив SPI шину. Если же разработчик – вы, и есть желание максимально защитить своё устройство от копирования – гуглите про лок-биты и отключение SPI
Источник
Error stray 320 in program
I am having problem compiling the followed exploit code:
I am using: «gcc file.c» and «gcc -O2 file.c» but both of them gets the following errors:
I tried compiling them on both Kali linux and Ubuntu 10.04 and get the same result.
migrated from security.stackexchange.com Oct 5 ’13 at 13:26
This question came from our site for information security professionals.
13 Answers 13
You have an invalid character on that line. This is what I saw:


You have invalid chars in your source. If you don’t have any valid non ascii chars in your source, maybe in a double quoted string literal, you can simply convert your file back to ascii with:
Edit: method with iconv will stop at wrong chars which makes no sense. The above command line is working with the example file. Good luck 🙂
I got the same with a character that visibly appeared as an asterisk, but was a UTF-8 sequence instead.
When compiled returned:
342 210 227 turns out to be UTF-8 for ASTERISK OPERATOR.
Deleting the ‘*’ and typing it again fixed the problem.
Whenever compiler found special character .. it gives these king of compile error . what error i found is as following
error: stray ‘302’ in program and error: stray ‘240’ in program
Some piece of code i copied from chatting messanger. In messanger it was special character only.. after copiying into vim editor it changed to correct character only. But compiler was giving above error .. then .. that stamenet i wrote mannualy after .. it got resolve.. 🙂
It’s perhaps because you copied code from net ( from a site which has perhaps not an ASCII encoded page, but UTF-8 encoded page), so you can convert the code to ASCII from this site :
There you can either detect errors manually by converting it back to UTF-8, or you can automatically convert it to ASCII and remove all the stray characters.
Codo was exactly right on Oct. 5 that ¤t[i] is the intended text (with the currency symbol inadvertently introduced when the source was put into HTML (see original): http://downloads.securityfocus.com/vulnerabilities/exploits/59846-1.c
Codo’s change makes this exploit code compile without error. I did that and was able to use the exploit on Ubuntu 12.04 to escalate to root privilege.
The explanations given here are correct. I just wanted to add that this problem might be because you copied the code from somewhere, from a website or a pdf file due to which there are some invalid characters in the code.
Try to find those invalid characters, or just retype the code if you can’t. It will definitely compile then.
With me this error ocurred when I copied and pasted a code in text format to my editor (gedit). The code was in a text document (.odt) and I copied it and pasted it into gedit. If you did the same, you have manually rewrite the code.

I noticed an issue in using the above tr command. The tr command COMPLETELY removes the «smart quotes». It would be better to replace the «smart quotes» with something like this.
This will give you a quick preview of what will be replaced.
This will do the replacements and put the replacement in a new file called WithoutSmartQuotes.txt.
sed s/[”“]/’»’/g File.txt > WithoutSmartQuotes.txt
This will overwrite the original file.
sed -i «.bk» s/[”“]/’»’/g File.txt
This problem comes when you have copied some text from html or you have done modification in windows environment and trying to compile in Unix/Solaris environment.
Please do «dos2unix» to remove the special characters from the file:
dos2unix fileName.ext fileName.ext

Sure, convert the file to ascii and blast all unicode characters away. It will probably work. BUT.
- You won’t know what you fixed.
- It will also destroy any unicode comments. Ex: //: A²+B²=C²
- It could potentially damage obvious logic, the code will still be broken, but the solution less obvious. For example: A string with «Smart-Quotes» (“ & ”) or a pointer with a full-width astrix ( * ). Now “SOME_THING” looks like a #define ( SOME_THING ) and *SomeType is the wrong type ( SomeType ).
Two more sugrical approaches to fixing the problem:
- Switch fonts to see the character. (It might be invisible in your current font)
Regex search all unicode characters not part non-extended ascii. In notepad++ I can search up to FFFF, which hasn’t failed me yet.
80 is hex for 128, the first extended ascii character.
After hitting «find next» and highlighting what appears to be empty space, you can close your search dialog and press CTRL+C to copy to clipboard.
Then paste the character into a unicode search tool. I usually use an online one. http://unicode.scarfboy.com/
Example: I had a bullet point (•) in my code somehow. The unicode value is 2022 (hex), but when read as ascii by the compiler you get 342 200 242 (3 octal values). It’s not as simple as converting each octal values to hex and smashing them together. So «E2 80 A2» is NOT the hex unicode point in your code.
For some weird reason, the following code doesn’t compile. I get a «stray ‘302’ in program» error around volatile unsigned int encoderPos = 0; , and I have no idea what the issue is. I’ve been trying to figure this out for over 40min, and nothing works. It doesn’t make any sense 😭

2 Answers 2
0302 is 0xc2. Somewhere in your source you have one or more non-breaking spaces (0xa0) encoded in UTF-8 (0xc2 0xa0). Use od or a similar tool to find them, and then replace them with normal spaces. Since you have non-ASCII Latin-1 characters in your source, those characters are encoded as two bytes with the first being 0xc2 or 0xc3. Remove all non-ASCII characters before proceeding.
One cause of the /(302) error is copy and paste code from a word processor. You have ASCII codes copied that add spaces, etc to your code. Go through each identified line and remove any extra spaces at the beginning and end of any identified line. Then, (Arduino IDE) go to TOOLS, Auto Format. At least, this cleared up the problem for me.
Thank you for your interest in this question. Because it has attracted low-quality or spam answers that had to be removed, posting an answer now requires 10 reputation on this site (the association bonus does not count).
Would you like to answer one of these unanswered questions instead?
maccatalan
Registered
a source that compiled very well before now does not with the following error.
Here is the code :
When I let this «as it» I get compilation errors :
stray ‘320’ in program
stray ‘240’ in program
When I replace the draw-oval-in-rect instruction by :
then it works very well.
This problem depends only on the NSBezierPath instruction. I tried it on other projects, even empty projets and . nothing to do. Always the same two ununderstable errors.
Источник
Содержание
- Скетч не загружается в Ардуино. Что делать?
- Добавить комментарий Отменить ответ
- Arduino.ru
- Произошла ошибка при загрузке скетча на ардуино нано.
- Arduino – первая прошивка и ошибки
- Первая прошивка
- Ошибки компиляции
- Частые ошибки в коде, приводящие к ошибке компиляции
- Ошибки загрузки
- Предупреждения
- Видео
Скетч не загружается в Ардуино. Что делать?
С такой проблемой сталкиваются довольно часто. Причем даже те, кто уже имел неплохой опыт программирования ардуино.
Понятное дело, что первое, что приходит на ум заказчику – ошибка в моей программе, за что поначалу мне было немного обидно.
Существует две наиболее частые ситуации:
- Arduino IDE ругается, что не может найти указанный файл (No such file or directory). Это говорит о том, что нужно установить какую-то библиотеку. А со своими программами я всегда поставляю все необходимые библиотеки.
- Загрузка скетча подвисает, а потом выдает ошибку:

1я ситуация разобрана здесь.
Вторая ситуация связана либо с тем, что плата выбрано неверно, либо выбранная плата имеет в себе старый загрузчик, который не желает работать на той скорости, на которой хочет IDE.
Дело в том, что Arduino IDE предполагает, что все современные Nano и UNO должны работать со скоростью 15200 бит в секунду. А китайские клоны до сих пор довольно часто работают со скоростью в 2 раза меньше – 57600.
Решить эту проблему можно двумя способами:
- Обновить загрузчик на плате
- Добавить плату со старым загрузчиком в конфигурацию Arduino IDE
Лично мне кажется, что второй способ – более универсальный и простой. Поэтому его и опишу.
Итак, зайдите на компьютере в папку, в которую установлена Arduino IDE. Лично у меня это, как и большинства, «C:Program Files (x86)Arduino», если Вы на Windows.
Теперь откройте папку hardwarearduinoavr и найдите файл boards.txt
В этом файле и находятся все платы, которые Вы выбираете через меню «Инструменты > Плата…»
Выбор платы из списка
Откройте этот файл в текстовом редакторе, например, в блокноте.
Найдите в нем строчку uno.upload.speed
Настройки плат ардуино
Мы видим, что скорость загрузки равно 115200. Но у нас плата, которая хочет 57600!
Можно, конечно, поменять на 115200 на 57600, но тогда, к сожалению, мы не сможет загружать скетчи на плату с новым загрузчиком.
Выход, получается, один – добавить плату, скажем, UNO2, на случай скорости 57600.
Предлагаю просто вставить себе мои настройки и сохранить файл:
Теперь у вас две платы UNO и две Nano:
Выбор платы ардуино в Arduino IDE
Добавить комментарий Отменить ответ
Для отправки комментария вам необходимо авторизоваться.
Arduino.ru
Произошла ошибка при загрузке скетча на ардуино нано.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Мое Ардуино нано постоянно выдает ошибку при загрузке скетча, даже скопированного с интернета.
Вот текст ошибки:
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Что за ардуино (ссылку — где покупалась)? Какие драйверы стоят? Что показывает диспетчер устройств? Что выбрано в меню «Инструменты|Плата»?
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Скорость порта 57600?
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Нет скорость 9600 бод.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Arduino IDE скачивалось вот по этой ссылке — https://www.arduino.cc/en/Main/Software также с этой программой были драйвера, установил все.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Судя по случайным и ненулевым ответам не та скорость.
P.S. Фамилию не позорьте 😉
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Сорости я вообще не касался. А что с фамилией?
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Arduino IDE скачивалось вот по этой ссылке — https://www.arduino.cc/en/Main/Software также с этой программой были драйвера, установил все.
Эти фразы противоречат одна другой. В поставке IDE одни драйверы, а в том гайде другие. Вы ставили и те и те? Если только из IDE, то они Вам не подходят — ставьте те, что описаны в гайде.
По поводу скорости, разговор особый. КТо Вам сказал, что у Вас скорость 9600? Вы включали в IDE печать подробностей загрузки? Если нет включите и изучите что скажет, можете и сюда скопипастить.
Arduino – первая прошивка и ошибки
Первая прошивка
Итак, разобрались со средой разработки, теперь можно загрузить первую прошивку. Можно загрузить пустую прошивку, чтобы просто убедиться, что все драйвера установились и платы вообще прошиваются. Рекомендуется делать это с новой платой, к которой никогда не подключались датчики и модули, чтобы исключить выход платы из строя по вине пользователя.
1. Плата подключается к компьютеру по USB, на ней должны замигать светодиоды. Если этого не произошло:
- Неисправен USB кабель
- Неисправен USB порт компьютера
- Неисправен USB порт Arduino
- Попробуйте другой компьютер, чтобы исключить часть проблем из списка
- Попробуйте другую плату (желательно новую), чтобы исключить часть проблем из списка
- На плате Arduino сгорел входной диод по линии USB из-за короткого замыкания, устроенного пользователем при сборке схемы
- Плата Arduino сгорела полностью из-за неправильного подключения пользователем внешнего питания или короткого замыкания
2. Компьютер издаст характерный сигнал подключения нового оборудования, а при первом подключении появится окошко “Установка нового оборудования”. Если этого не произошло:
- См. предыдущий список неисправностей
- Кабель должен быть data-кабелем, а не “зарядным”
- Кабель желательно втыкать напрямую в компьютер, а не через USB-хаб
- Не установлены драйверы Arduino (во время установки IDE или из папки с программой), вернитесь к установке.
3. В списке портов (Arduino IDE/Инструменты/Порт) появится новый порт, обычно COM3. Если этого не произошло:
- См. предыдущий список неисправностей
- Некорректно установлен драйвер CH341 из предыдущего урока
- Если список портов вообще неактивен – драйвер Arduino установлен некорректно, вернитесь к установке
- Возникла системная ошибка, обратитесь к знакомому компьютерщику
4. Выбираем свою плату. Если это Arduino Nano, выбираем в ИнструментыПлатаArduino Nano. Если другая – выбираем другую. Нажимаем стрелочку в левом верхнем углу (загрузить прошивку). Да, загружаем пустую прошивку.
-
- [Только для Arduino Nano] В микроконтроллер китайских нанок зашит “старый” загрузчик, поэтому выбираем ИнструментыПроцессорATmega328p (Old Bootloader). Некоторые китайцы зашивают в свои платы новый загрузчик, поэтому если прошивка не загрузилась (загрузка идёт минуту и вылетает ошибка avrdude: stk500_getsync() ) – попробуйте сменить пункт Процессор на ATmega328p
Если появилась надпись “Загрузка завершена” – значит всё в порядке и можно прошивать другие скетчи. В любом случае на вашем пути встретятся другие два варианта событий, происходящих после нажатия на кнопку “Загрузка” – это ошибка компиляции и ошибка загрузки. Вот их давайте рассмотрим более подробно.
Ошибки компиляции
Возникает на этапе сборки и компиляции прошивки. Ошибки компиляции вызваны проблемами в коде прошивки, то есть проблема сугубо софтварная. Слева от кнопки “загрузить” есть кнопка с галочкой – проверка. Во время проверки производится компиляция прошивки и выявляются ошибки, если таковые имеются. Ардуино в этом случае может быть вообще не подключена к компьютеру.
- В некоторых случаях ошибка возникает при наличии кириллицы (русских букв) в пути к папке со скетчем. Решение: завести для скетчей отдельную папочку в корне диска с английским названием.
- В чёрном окошке в самом низу Arduino IDE можно прочитать полный текстошибки и понять, куда копать
- В скачанных с интернета готовых скетчах часто возникает ошибка с описанием название_файла.h no such file or directory . Это означает, что в скетче используется библиотека , и нужно положить её в Program Files/Arduino/libraries/. Ко всем моим проектам всегда идёт папочка с использованными библиотеками, которые нужно установить. Также библиотеки всегда можно поискать в гугле по название файла.
- При использовании каких-то особых библиотек, методов или функций, ошибкой может стать неправильно выбранная плата в “Инструменты/плата“. Пример: прошивки с библиотекой Mouse.h или Keyboard.h компилируются только для Leonardo и Micro.
- Если прошивку пишете вы, то любые синтаксические ошибки в коде будут подсвечены, а снизу в чёрном окошке можно прочитать более детальное описание, в чём собственно косяк. Обычно указывается строка, в которой сделана ошибка, также эта строка подсвечивается красным.
- Иногда причиной ошибки бывает слишком старая, или слишком новая версия Arduino IDE. Читайте комментарии разработчика скетча
- Ошибка недостаточно свободного места возникает по вполне понятным причинам. Если в проекте используется плата Nano на процессоре 328p, а вы сэкономили три рубля и купили на 168 процессоре – скупой платит дважды. Оптимизация: статическая память – память, занимаемая кодом (циклы, функции). Динамическая память занята переменными.
Частые ошибки в коде, приводящие к ошибке компиляции
- expected ‘,’ or ‘;’ – пропущена запятая или точка запятой на предыдущей строке
- stray ‘320’ in program – русские символы в коде
- expected unqualified-id before numeric constant – имя переменной не может начинаться с цифры
- … was not declared in this scope – переменная или функция используется, но не объявлена. Компилятор не может её найти
- redefinition of … – повторное объявление функции или переменной
- storage size of … isn’t known – массив задан без указания размера
Ошибки загрузки
Возникают на этапе, когда прошивка собрана, скомпилирована, в ней нет критических ошибок, и производится загрузка в плату по кабелю. Ошибка может возникать как по причине неисправностей железа, так и из-за настроек программы и драйверов.
- USB кабель, которым подключается Arduino, должен быть Data-кабелем, а не кабелем только для зарядки. Нужным нам кабелем подключаются к компьютеру плееры и смартфоны.
- Причиной ошибки загрузки являются не установленные/криво установленные драйвера CH340, если у вас китайская NANO.
- Также будет ошибка avrdude: ser_open(): can’t open device , если не выбран COM порт, к которому подключена Arduino. Если кроме COM1 других портов нет – читай два пункта выше, либо попробуй другой USB порт, или вообще другой компьютер.
- Большинство проблем при загрузке, вызванных “зависанием” ардуины или загрузчика, лечатся полным отключением ардуины от питания. Потом вставляем USB и по новой прошиваем.
- Причиной ошибки загрузки может быть неправильно выбранная плата в “Инструменты/Плата”, а также неправильно выбранный процессор в “Инструменты/Процессор”. Также в свежих версиях IDE нужно выбирать ATmega328P (Old Bootloader) для китайских плат NANO.
- Если у вас открыт монитор COM порта в другом окне Arduino IDE или плата общается через СОМ порт с другой программой (Ambibox, HWmonitor, SerialPortPlotter и т.д.), то вы получите ошибку загрузки, потому что порт занят. Отключитесь от порта или закройте другие окна и программы.
- Если у вас задействованы пины RX или TX – отключите от них всё! По этим пинам Arduino общается с компьютером, в том числе для загрузки прошивки.
- Если в описании ошибки встречается bootloader is not responding и not in sync , а все предыдущие пункты этого списка проверены – с вероятностью 95% сдох загрузчик. Второй неприятный исход – загрузчик “слетел”, и его можно прошить заново.
Предупреждения
Помимо ошибок, по причине которых проект вообще не загрузится в плату и не будет работать, есть ещё предупреждения, которые выводятся оранжевым текстом в чёрной области лога ошибок. Предупреждения могут появиться даже тогда, когда выше лога ошибок появилась надпись “Загрузка завершена“. Это означает, что в прошивке нет несовместимых с жизнью ошибок, она скомпилировалась и загрузилась в плату. Что же тогда означают предупреждения? Чаще всего можно увидеть такие:
- # Pragma message……. – сообщения с директивой Pragma обычно выводят библиотеки, сообщая о своей версии или каких-то настройках
- Недостаточно памяти, программа может работать нестабильно – Чуть выше этого предупреждения обычно идёт информация о задействованной памяти. Память устройства можно добивать до 99%, ничего страшного не случится. Это флэш память и во время работы она не изменяется. А вот динамическую память желательно забивать не более 85-90%, иначе реально могут быть непонятные глюки в работе, так как память постоянно “бурлит” во время работы. НО. Это зависит от скетча и в первую очередь от количества локальных переменных. Можно написать такой код, который будет стабильно работать при 99% занятой SRAM памяти. Так что ещё раз: это всего лишь предупреждение, а не ошибка.
Завершая раздел Введение в Arduino поговорим о вопросах, которые очень часто возникают у новичков:
- Ардуину можно прошить только один раз? Нет, несколько десятков тысяч раз, всё упирается в ресурс flash памяти. А он довольно большой.
- Как стереть/нужно ли стирать старую прошивку при загрузке новой? Память автоматически очищается при прошивке, старая прошивка автоматически удаляется.
- Можно ли записать две прошивки, чтобы они работали вместе? Нет, при прошивке удаляются абсолютно все старые данные. Из двух прошивок нужно сделать одну, причём так, чтобы не было конфликтов.
- Можно ли “вытащить” прошивку с уже прошитой Ардуины? Теоретически можно, но только в виде нечитаемого машинного кода, в который преобразуется прошивка на С++ при компиляции, т.е. вам это НИКАК не поможет, если вы не имеете диплом по низкоуровневому программированию.
- Зачем это нужно? Например есть у нас прошитый девайс, и мы хотим его “клонировать”. В этом случае да, есть вариант сделать дамп прошивки и загрузить его в другую плату на таком же микроконтроллере.
- Если есть желание почитать код – увы, прошивка считывается в виде бинарного машинного кода, превратить который обратно в читаемый Си-подобный код обычному человеку не под силу
- Вытащить прошивку, выражаясь более научно – сделать дамп прошивки, можно при помощи ISP программатора, об этом можно почитать здесь
- Снять дамп прошивки можно только в том случае, если разработчик не ограничил такую возможность, например записав лок-биты, запрещающие считывание Flash памяти, или вообще отключив SPI шину. Если же разработчик – вы, и есть желание максимально защитить своё устройство от копирования – гуглите про лок-биты и отключение SPI
Видео
Не помню, где брал исходник.. может быть здесь: Arduino
В ардуино ИД в процессе загрузки ещё целая серия сообщений:
In file included from C:UsersdellDocumentsArduinolibrariesgrbl/grbl.h:43:0,
from C:UsersdellDocumentsArduinolibrariesgrblexamplesgrblUploadgrblUpload.ino:27:
C:UsersdellDocumentsArduinolibrariesgrbl/nuts_bolts.h:56:0: warning: «max» redefined
#define max(a,b) (a) > (b
? (a) : (b
In file included from sketchgrblUpload.ino.cpp:1:0:
C:Program Files (x86)Arduinohardwarearduinoavrcoresarduino/Arduino.h:93:0: note: this is the location of the previous definition
#define max(a,b) a)>(b)?(a)
b
In file included from C:UsersdellDocumentsArduinolibrariesgrbl/grbl.h:43:0,
from C:UsersdellDocumentsArduinolibrariesgrblexamplesgrblUploadgrblUpload.ino:27:
C:UsersdellDocumentsArduinolibrariesgrbl/nuts_bolts.h:57:0: warning: «min» redefined
#define min(a,b) (a) < (b
? (a) : (b
In file included from sketchgrblUpload.ino.cpp:1:0:
C:Program Files (x86)Arduinohardwarearduinoavrcoresarduino/Arduino.h:92:0: note: this is the location of the previous definition
#define min(a,b) a)<(b)?(a)
b
In file included from C:UsersdellDocumentsArduinolibrariesgrbl/grbl.h:43:0,
from C:UsersdellDocumentsArduinolibrariesgrblexamplesgrblUploadgrblUpload.ino:27:
C:UsersdellDocumentsArduinolibrariesgrbl/nuts_bolts.h:61:0: warning: «bit» redefined
#define bit (1 << n)
In file included from sketchgrblUpload.ino.cpp:1:0:
C:Program Files (x86)Arduinohardwarearduinoavrcoresarduino/Arduino.h:124:0: note: this is the location of the previous definition
#define bit(b) (1UL << (b
Скетч использует 29762 байт (96%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 1633 байт (79%) динамической памяти, оставляя 415 байт для локальных переменных. Максимум: 2048 байт.
Недостаточно памяти, программа может работать нестабильно.
Недавно при разработке контроллера столкнулся со странной ситуацией. При вызове функции String::replace() иногда возникала ошибка: результирующая строка содержала не тот текст, который я ожидал. В некоторых случаях конец строки «затирался» или состоял из символов явно не в той кодировке.
При получении подобных ошибок первое, что приходит в голову: ошибка в адресациях или указателях. Действительно, подобные ошибки могут быть связаны с неправильным использованием памяти, например когда идет передача указателя на переменную, которая уже может не существовать на этот момент. Тогда результат обращения к ней будет зависеть от того, перезаписана ли память новыми данными, и мы получим в итоге похожие симптомы.
Но я проверил несколько раз все места в коде, где могли быть подобные ошибки, но код был абсолютно корректный.
В программе был один момент, который и подсказал мне разгадку: я реализовывал функционал небольшого web-сервера, а для этого неминуемо пришлось передавать и обрабатывать довольно длинны строки, содержащие код html-шаблонов и заголовков http запросов. Большие конечно только по меркам Arduino Uno, которая имеет всего 2кб оперативной памяти. Вот память и закончилась. А при переполнении памяти вы никак об этом не узнаете, кроме как по возникшим ошибкам.
Итак, признаки того, что у вас закончилась ООП:
- ошибки «плавающие», возникают не всегда
- в программе есть функционал обработки длинных строк или работы с большими числами
- в качестве платформы вы используете Arduino Uno, Arduino Nano или другую плату с малым количеством ООП
- при выводе значений переменных в сериальный порт в вывод попадают символы в кривой кодировке, подстроки из прошлых выводов и тд
Но это все косвенные признаки. Для того же, чтобы точно понять, что проблема именно в нехватке памяти, можно воспользоваться библиотекой MemoryFree.
А можно и не подключать библиотеку, а просто добавить в проект 2 файл: MemoryFree.h и MemoryFree.cpp, их код есть на https://playground.arduino.cc/Code/AvailableMemory/.
Далее просто в нужных местах кода, где вы предполагаете, что память закончилась, расставить:
#include <MemoryFree.h>
...
Serial.print("freeMemory()=");
Serial.println(freeMemory());
Близкое к 0 значение или же отрицательное говорит о проблеме с нехваткой памяти.
Вот пара советов, как этого избежать:
- пополнить знания о работе с памятью в C++ (особенно если ваш опыт связан с разработкой на более высокоуровневых и/или скриптовых языках)
- на первое время чаще в процессе разработки использовать функцию freeMemory(), пока экономия памяти не отложится в вашей памяти 🙂
- если в программе есть функционал обработки больших строк или больших данных, то лучше выбрать плату с большим количеством памяти, как то Arduino Mega или даже Arduino Due
- чаще очищать неиспользуемые переменные
- длинные текстовые константы определять с использованием ключевого слова PROGMEM, тогда для их хранения будет использована flash-память, размер которой сильно превышает размер ООП
Пример использования PROGMEM:
#include <avr/pgmspace.h>
...
const char long_text[] PROGMEM = "Длинный текст, которые не меняется в процессе работы программы";
...
Arduino Mega с 8кБ ООП:
Arduino Due с 96кБ ООП:
Arduino
Неявные ошибки из-за нехватки памяти
Недавно при разработке контроллера столкнулся со странной ситуацией. При вызове функции String::replace() иногда возникала ошибка: результирующая строка содержала не тот текст, который я ожидал. В некоторых случаях конец строки «затирался» или состоял из символов явно не в той кодировке.
При получении подобных ошибок первое, что приходит в голову: ошибка в адресациях или указателях. Действительно, подобные ошибки могут быть связаны с неправильным использованием памяти, например когда идет передача указателя на переменную, которая уже может не существовать на этот момент. Тогда результат обращения к ней будет зависеть от того, перезаписана ли память новыми данными, и мы получим в итоге похожие симптомы.
Но я проверил несколько раз все места в коде, где могли быть подобные ошибки, но код был абсолютно корректный.
В программе был один момент, который и подсказал мне разгадку: я реализовывал функционал небольшого web-сервера, а для этого неминуемо пришлось передавать и обрабатывать довольно длинны строки, содержащие код html-шаблонов и заголовков http запросов. Большие конечно только по меркам Arduino Uno, которая имеет всего 2кб оперативной памяти. Вот память и закончилась. А при переполнении памяти вы никак об этом не узнаете, кроме как по возникшим ошибкам.
Итак, признаки того, что у вас закончилась ООП:
- ошибки «плавающие», возникают не всегда
- в программе есть функционал обработки длинных строк или работы с большими числами
- в качестве платформы вы используете Arduino Uno, Arduino Nano или другую плату с малым количеством ООП
- при выводе значений переменных в сериальный порт в вывод попадают символы в кривой кодировке, подстроки из прошлых выводов и тд
Но это все косвенные признаки. Для того же, чтобы точно понять, что проблема именно в нехватке памяти, можно воспользоваться библиотекой MemoryFree.
А можно и не подключать библиотеку, а просто добавить в проект 2 файл: MemoryFree.h и MemoryFree.cpp , их код есть на https://playground.arduino.cc/Code/AvailableMemory/.
Далее просто в нужных местах кода, где вы предполагаете, что память закончилась, расставить:
Близкое к 0 значение или же отрицательное говорит о проблеме с нехваткой памяти.
Вот пара советов, как этого избежать:
- пополнить знания о работе с памятью в C++ (особенно если ваш опыт связан с разработкой на более высокоуровневых и/или скриптовых языках)
- на первое время чаще в процессе разработки использовать функцию freeMemory() , пока экономия памяти не отложится в вашей памяти 🙂
- если в программе есть функционал обработки больших строк или больших данных, то лучше выбрать плату с большим количеством памяти, как то Arduino Mega или даже Arduino Due
- чаще очищать неиспользуемые переменные
- длинные текстовые константы определять с использованием ключевого слова PROGMEM , тогда для их хранения будет использована flash-память, размер которой сильно превышает размер ООП
Источник
Arduino.ru
Ошибка компиляции. Недостаточно оперативной памяти Arduino NANO
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Познакомился недавно с ардуинками и мой мозг тут же начал генерацию проектов на базе этого контроллера.
Взявшись за проект управления теплофикационными системами уперся в проблему нехватки памяти (RAM) в ардуинке.
Есть 4 датчика ds18b20;
Интернет модуль enc28j60;
И собственно сам котроллер ардуино.
Объекты управления: Насос отопления, насос ГВС, котел отопления, электрокотел ГВС и два электроклапана (на гвс).
Задача СИСТЕМЫ состоит в автоматизации работы отопления и гвс в различных обстоятельствах.
Например: т.к. дом загородный, перед выездом, (в направлении дома) через интернет можно включить котлы и приехать в уже прогретый дом с подготовленной горячей водой.
Или когда дом не посещается зимой, не дать ему замерзнуть путём включения Электрокотла гвс, открытия двух клапанов и включения насоса ЦО. Всё это долго описывать на самом деле, если кого заинтересует, выложу все схемы и опишу условия, а как сам запилю всю систему и проверю сделаю статью)
Т.к. я не программист, а в портфолио имеется лишь работа с html кодами, и то по примерам, то пришлось собирать скетч-франкенштейн.
Все строки которые понимал подписал. Проблема ещё в том что в этом виде всё работает нестабильно. Буфер для интернета аж «1300». Страница перезагружается каждые 5 секунд а потом уходит в «401 Unauthorized»
Если умельцы отзовутся, будет очень круто «допилить» эту СИСТЕМУ, уверен, что многим пригодится!
Источник
Arduino.ru
Ошибка при загрузке скетча // Недостаточно памяти, программа может работать нестабильно.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Помогите пожалуйста решить проблему. При загрузке скетча пишет:
Скетч использует 10894 байт (75%) памяти устройства. Всего доступно 14336 байт.Глобальные переменные используют 1000 байт (97%) динамической памяти, оставляя 24 байт для локальных переменных. Максимум: 1024 байт.
ЗАРАНЕЕ СПАСИБО. Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Какую проблему-то решить? Памяти допаять вам в МК что ли?
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Помогите пожалуйста решить проблему.
А проблема-то есть? Она работает или нет? Ну, мало памяти, но может хватает? Вы уж толком говорите.
А так — какие проблемы? Сокращать память, как я понимаю для Вас не вариант, ну тогда берите Мегу — туда влезет.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Фигня все это, у меня один скетч при 90 % стабильно уж пару месяцев работает, зависит от самого скетча, количества вызовов процедур (стек), количества сторонних библиотек и ещё кучи причин.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Вряд ли будет работать, стоит переходить на иной камень. Мой ХШ подсказывает, что сама программа отожрет в худшем случае около 10 байт со стека. Но, в ней активно работает lcd.print(), который есть наследник как и Serial.print() от всего стека классов stream, а там жрется не так уж и мало, вот сколько точно уже не помню, но вряд ли меньше 14 байт. Там тучно есть около 9 вложенных вызовов «друг в друга», из-за чего и делал свою часть библиотеки — аналога работы с LCD, а это явно уже 18 байт стека как миниум, без локальных переменных.
ТС, даже интересно, работает стабильно или куда? 🙂
Источник
Arduino.ru
Недостаточно памяти или Not enough memory
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

В общем, решил сделать светильник с часами, взял два проекта, соеденил. Да вот беда, скетч получился слишком длинный. Как бы можно его убавить? Заранее могу сказать что температура мне нужна в цельсиях, т.е. убрать конвертацию, и время нужно только в 24 формате, т.е. конвертацию тоже можно убрать.
А что еще, ума не приложу. Вот, собственно, код:
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Заранее могу сказать что температура мне нужна в цельсиях, т.е. убрать конвертацию, и время нужно только в 24 формате, т.е. конвертацию тоже можно убрать.
А чего не убрали?
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

строки 21-41 заменить на
строки 48-68 заменить на
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

я как бы не совсем программист. профессия электромонте по ремонту и обслуживания электрооборудования, а ардуино как хобби, + я только начинающии
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

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

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

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

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

55 байт для стека явно мало. Среда рекомендует, чтобы на стек оставалось не менее 512 байтов. На эту цифру желательно и ориентироваться.
Теперь по тексту скетча:
— У Вас подключена библилтека Adafruit, которая требует создания экранного буфера. А для экранного буфера в случае 1306/1308 нужен 1 Кбайт оперативной памяти. При том, что всего ее 2 Кбайта и 0.5 Кбатй нужно оставить для стека. Т.е. Adafruit сразу откусывает 2/3 доступной памяти.
В общем, что, что Вы хотите слделать, превышает возможности выбранного контроллера.
Собственно, если Вы используете контроллер на чипе 328, Вам следует определиться, насколько для Вас важен графический экран. Если он необходим, значит, следует быть готовым к тому, что все остальные функции будут сильно урезаны. Либо, если графический экран не критичен, следует заменить Adafruit на какую-нибудь другую библиотеку, не требующую экранного буфера.
Если же и графический буфер жизненно необходим, и на ограничение функциональности Вы не согласны, остается только перейти на другой контроллер, обладающий бОльшим объенмом оперативной памяти, например Mega 2560.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Тоже столкнулся с такой проблемой . нашёл такую либу без экранного буфера:
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

55 байт для стека явно мало. Среда рекомендует, чтобы на стек оставалось не менее 512 байтов. На эту цифру желательно и ориентироваться.
Теперь по тексту скетча:
— У Вас подключена библилтека Adafruit, которая требует создания экранного буфера. А для экранного буфера в случае 1306/1308 нужен 1 Кбайт оперативной памяти. При том, что всего ее 2 Кбайта и 0.5 Кбатй нужно оставить для стека. Т.е. Adafruit сразу откусывает 2/3 доступной памяти.
В общем, что, что Вы хотите слделать, превышает возможности выбранного контроллера.
Собственно, если Вы используете контроллер на чипе 328, Вам следует определиться, насколько для Вас важен графический экран. Если он необходим, значит, следует быть готовым к тому, что все остальные функции будут сильно урезаны. Либо, если графический экран не критичен, следует заменить Adafruit на какую-нибудь другую библиотеку, не требующую экранного буфера.
Если же и графический буфер жизненно необходим, и на ограничение функциональности Вы не согласны, остается только перейти на другой контроллер, обладающий бОльшим объенмом оперативной памяти, например Mega 2560.
Источник
Первая прошивка, ошибки, FAQ

Первая прошивка
Итак, разобрались со средой разработки, теперь можно загрузить прошивку. Рекомендую загрузить пустую прошивку, чтобы убедиться, что все драйвера установились и плата вообще прошивается. Также лучше делать это с новой или заведомо рабочей платой.
1. Плата подключается к компьютеру по USB, на ней должны замигать светодиоды. Если этого не произошло:
- Неисправен USB кабель.
- Неисправен USB порт компьютера.
- Неисправен USB порт Arduino.
- Попробуйте другой компьютер, чтобы исключить часть проблем из списка.
- Попробуйте другую плату, чтобы исключить часть проблем из списка.
- На плате Arduino сгорел диод по питанию USB.
- Плата Arduino сгорела полностью из-за неправильного подключения питания или короткого замыкания
2. Компьютер издаст характерный сигнал подключения нового оборудования, а при первом подключении появится окошко “Установка нового оборудования”. Если этого не произошло:
- См. предыдущий список неисправностей.
- Кабель должен быть data-кабелем, а не “зарядным”.
- Кабель желательно втыкать напрямую в компьютер, а не через USB-хаб.
- Не установлены драйверы для Arduino.
3. В списке портов (Arduino IDE/Инструменты/Порт) появится новый порт, отличный от COM1. Если этого не произошло:
- См. предыдущий список неисправностей.
- Некорректно установлен драйвер CH341.
- Если список портов вообще неактивен – драйвер Arduino установлен некорректно, вернитесь к установке
- Возникла системная ошибка, обратитесь к знакомому компьютерщику



4. Выбираем свою плату. Если это Arduino Nano, выбираем в ИнструментыПлатаArduino Nano. Если другая – выбираем другую. Нажимаем стрелочку в левом верхнем углу (загрузить прошивку). Да, загружаем пустую прошивку.
- [Для Arduino Nano] В микроконтроллер китайских нанок зашит “старый” загрузчик, поэтому выбираем ИнструментыПроцессорATmega328p (Old Bootloader). Некоторые китайцы зашивают в свои платы новый загрузчик, поэтому если прошивка не загрузилась (загрузка идёт минуту и вылетает ошибка avrdude: stk500_getsync()) – попробуйте сменить пункт Процессор на ATmega328p.
Если появилась надпись “Загрузка завершена” – значит всё в порядке и можно прошивать другие скетчи. В любом случае на вашем пути встретятся другие два варианта событий, происходящих после нажатия на кнопку “Загрузка” – это ошибка компиляции и ошибка загрузки. Вот их давайте рассмотрим более подробно.
Ошибки компиляции
Возникает на этапе компиляции прошивки. Ошибки компиляции вызваны проблемами в коде прошивки.
- В некоторых случаях ошибка возникает при наличии кириллицы (русских букв) в пути к папке со скетчем. Решение: завести для скетчей отдельную папочку в корне диска с английским названием.
- В чёрном окошке в самом низу Arduino IDE можно прочитать полный текстошибки и понять, куда копать.
- В скачанных с интернета готовых скетчах часто возникает ошибка с описанием название_файла.h no such file or directory. Это означает, что в скетче используется библиотека , и нужно положить её в Program Files/Arduino/libraries/. Ко всем моим проектам всегда идёт папочка с использованными библиотеками, которые нужно установить. Также библиотеки всегда можно поискать в гугле по название файла.
- При использовании каких-то особых библиотек, методов или функций, ошибкой может стать неправильно выбранная плата в “Инструменты/плата“. Пример: прошивки с библиотекой Mouse.h или Keyboard.h компилируются только для Leonardo и Micro.
- Если прошивку пишете вы, то любые синтаксические ошибки в коде будут подсвечены, а снизу в чёрном окошке можно прочитать более детальное описание, в чём собственно косяк. Обычно указывается строка, в которой сделана ошибка, также эта строка подсвечивается красным.
- Иногда причиной ошибки бывает слишком старая, или слишком новая версия Arduino IDE. Читайте комментарии разработчика скетча
- Ошибка недостаточно свободного места возникает по вполне понятным причинам. Возможно поможет урок по оптимизации кода.
Частые ошибки в коде, приводящие к ошибке компиляции
- expected ‘,’ or ‘;’ – пропущена запятая или точка запятой на предыдущей строке
- stray ‘320’ in program – русские символы в коде
- expected unqualified-id before numeric constant – имя переменной не может начинаться с цифры
- … was not declared in this scope – переменная или функция используется, но не объявлена. Компилятор не может её найти
- redefinition of … – повторное объявление функции или переменной
- storage size of … isn’t known – массив задан без указания размера
Ошибки загрузки
Возникают на этапе, когда программа успешно скомпилирована и производится загрузка в плату по кабелю. Ошибка может возникать как по причине неисправностей железа, так и из-за настроек программы и драйверов.
- USB кабель, которым подключается Arduino, должен быть Data-кабелем, а не кабелем только для зарядки. Нужным нам кабелем подключаются к компьютеру плееры и смартфоны.
- Причиной ошибки загрузки являются не установленные/криво установленные драйвера CH340, если у вас китайская NANO.
- Также будет ошибка avrdude: ser_open(): can’t open device, если не выбран COM порт, к которому подключена Arduino. Если кроме COM1 других портов нет – читай два пункта выше, либо попробуй другой USB порт, или вообще другой компьютер.
- Большинство проблем при загрузке, вызванных “зависанием” ардуины или загрузчика, лечатся полным отключением ардуины от питания. Потом вставляем USB и по новой прошиваем.
- Причиной ошибки загрузки может быть неправильно выбранная плата в “Инструменты/Плата”, а также неправильно выбранный процессор в “Инструменты/Процессор”. Также в свежих версиях IDE нужно выбирать ATmega328P (Old Bootloader) для китайских плат NANO.
- Если у вас открыт монитор COM порта в другом окне Arduino IDE или плата общается через СОМ порт с другой программой (Ambibox, HWmonitor, SerialPortPlotter и т.д.), то вы получите ошибку загрузки, потому что порт занят. Отключитесь от порта или закройте другие окна и программы.
- Если у вас задействованы пины RX или TX – отключите от них всё! По этим пинам Arduino общается с компьютером, в том числе для загрузки прошивки.
- Если в описании ошибки встречается bootloader is not responding и not in sync, а все предыдущие пункты этого списка проверены – с вероятностью 95% сдох загрузчик. Второй неприятный исход – загрузчик “слетел”, и его можно прошить заново.
Предупреждения
Помимо ошибок, по причине которых проект вообще не загрузится в плату и не будет работать, есть ещё предупреждения, которые выводятся оранжевым текстом в чёрной области лога ошибок. Предупреждения могут появиться даже тогда, когда выше лога ошибок появилась надпись “Загрузка завершена“. Это означает, что в прошивке нет критических ошибок, она скомпилировалась и загрузилась в плату. Что же тогда означают предупреждения? Чаще всего можно увидеть такие:
- # Pragma message… – это просто сообщения, оставленные разработчиком проекта или библиотеки. Чаще всего номер версии и прочая информация.
- Недостаточно памяти, программа может работать нестабильно – Чуть выше этого предупреждения обычно идёт информация о задействованной памяти. Память устройства можно добивать до 99%, ничего страшного не случится. Это флэш память и во время работы она не изменяется. А вот динамическую память желательно забивать не более 85-90%, иначе реально могут быть непонятные глюки в работе, так как память постоянно “бурлит” во время работы. НО. Это зависит от скетча и в первую очередь от количества локальных переменных. Можно написать такой код, который будет стабильно работать при 99% занятой SRAM памяти. Так что ещё раз: это всего лишь предупреждение, а не ошибка.
Завершая раздел Введение в Arduino поговорим о вопросах, которые очень часто возникают у новичков:
- Ардуину можно прошить только один раз? Нет, несколько десятков тысяч раз, всё упирается в ресурс Flash памяти. А он довольно большой.
- Как стереть/нужно ли стирать старую прошивку при загрузке новой? Память автоматически очищается при прошивке, старая прошивка автоматически удаляется.
- Можно ли записать две прошивки, чтобы они работали вместе? Нет, при прошивке удаляются абсолютно все старые данные. Из двух прошивок нужно сделать одну, причём так, чтобы не было конфликтов. Подробнее в этом уроке.
- Можно ли “вытащить” прошивку с уже прошитой Ардуины? Теоретически можно, но только в виде нечитаемого машинного кода, в который преобразуется прошивка на С++ при компиляции, т.е. вам это НИКАК не поможет, если вы не имеете диплом по низкоуровневому программированию. Подробнее в этом уроке.
- Зачем это нужно? Например есть у нас прошитый девайс, и мы хотим его “клонировать”. В этом случае да, есть вариант сделать дамп прошивки и загрузить его в другую плату на таком же микроконтроллере.
- Если есть желание почитать код – увы, прошивка считывается в виде бинарного машинного кода, превратить который обратно в читаемый Си-подобный код обычному человеку не под силу.
- Вытащить прошивку, выражаясь более научно – сделать дамп прошивки, можно при помощи ISP программатора, об этом можно почитать здесь.
- Снять дамп прошивки можно только в том случае, если разработчик не ограничил такую возможность, например записав лок-биты, запрещающие считывание Flash памяти, или вообще отключив SPI шину. Если же разработчик – вы, и есть желание максимально защитить своё устройство от копирования – гуглите про лок-биты и отключение SPI
Видео
Источник