Синтаксические ошибки
Первые ошибки, которые определяются отладчиком – это синтаксические ошибки. Их же легче всего исправить. Неправильный синтаксис в Arduino IDE выделяется строкой, в которой допущена неточность. Нужно разобраться – это ошибка в написании служебного слова, случайно удалена важная функция, не хватает закрывающейся скобки или неправильно отделены комментарии.
Для определения ошибки внимательно просмотрите строку-подсказку и внесите необходимые изменения. Ниже мы приведем примеры наиболее часто встречающихся синтаксических ошибок компиляции кода:
- Ошибка “expected initializer before ‘}’ token” говорит о том, что случайно удалена или не открыта фигурная скобка.
- Ошибка “a function-definition is not allowed here before ‘{‘ token” – аналогичная предыдущей и указывает на отсутствие открывающейся скобки, например, открывающих скобок в скетче только 11, а закрывающих 12.
- Уведомление об ошибке “undefined reference to “setup” получите в случае переименования или удаления функции “setup”.
- Ошибка “undefined reference to “loop” – возникает в случае удаления функции loop. Без команд этой функции компилятор запустить программу не сможет. Для устранения надо вернуть каждую из команд на нужное место в скетче.
- Ошибка “… was not declared in this scope” обозначает, что в программном коде обнаружены слова, которые написаны с ошибкой (например, которые обозначают какую-то функцию) или найдены необъявленные переменные, методы. Подобная ошибка возникает также в случае случайного удаления значка комментариев и текст, который не должен восприниматься как программа, читается IDE.
Ошибки библиотек
Большое количество ошибок возникает на уровне подключения библиотек или неправильного их функционирования. Наиболее известные:
- “fatal error: … No such file or directory”. Такое сообщение вы получите, если необходимую в скетче библиотеку вы не записали в папку libraries. Сообщение об ошибке в одном из подключенных файлов может означать, что вы используете библиотеку с ошибками или библиотеки не совместимы. Решение – обратиться к разработчику библиотеки или еще раз проверить правильность написанной вами структуры.
- “redefinition of void setup” – сообщение возникает, если автор библиотеки объявил функции, которые используются и в вашем коде. Чтобы исправить – переименуйте свои методы или в библиотеке.
Ошибки компилятора
Нестабильность в работе самого компилятора тоже могут возникать при отладке программы. Вариантов выхода из данной ситуации может быть несколько, например, установить последнюю версию компилятора. Иногда решением может быть наоборот, возвращение до более старой версии. Тогда используемая библиотека может работать корректно.
Ошибки компиляции при работе с разными платами – Uno, Mega и Nano
В Arduino можно писать программы под разные варианты микроконтроллеров. По умолчанию в меню выбрана плата Arduino/Genuino Uno. Если забудете о том что нужно указать нужную плату – в вашем коде будут ссылки на методы или переменные, не описанные в конфигурации “по умолчанию”.
Вы получите ошибку при компиляции “programmer is not responding”. Чтобы исправить ее – проверьте правильность написания кода в части выбора портов и вида платы. Для этого в Ардуино IDE в меню «Сервис» выберите плату. Аналогично укажите порт в меню “Сервис” – пункт «Последовательный порт».
Ошибка exit status 1
В среде разработки такое сообщение можно увидеть во многих случаях. И хотя в документации данная ошибка указывается как причина невозможности запуска IDE Аrduino в нужной конфигурации, на самом деле причины могут быть и другие. Для того, чтобы найти место, где скрывается эта ошибка можно “перелопатить” действительно много. Но все же стоит сначала проверить разрядность системы и доступные библиотеки.
Обновления и исправления касательно версий инструкции и ПО
Loading
13-12-2020, 16:31
5 комментариев
Даже опытные программисты-«ардуинщики» могут столкнуться с ошибками компиляции. Исправить их не сложно, а вот найти порой не так просто. Мы решили рассказать сегодня в деталях, какие системные ошибки чаще возникают на различных платах Ардуино, как их исправить и по возможности избежать.
Для начала рассмотрим базовые, так называемые синтаксические ошибки. Они встречаются чаще всего у новичков, но и опытные электронщики с ними точно знакомы не понаслышке. Искать их обычно супер-просто – в Arduino IDE некорректный синтаксис выделяется построчно (таким образом значительно легче отыскать неточность в кодах). Обычно это: отсутствие скобки в конце команды, пропуск этой самой служебной команды или слова, нехватка важных функций, неправильное их написание и т.д.
Для быстрого поиска ошибки советуем рассмотреть строку-подсказку. Ничего не помогло? Тогда для вас наша подборка наиболее распространенных синтаксических ошибок:
С синтаксисом все понятно – вставляем пропущенные символы, убираем лишние знаки, возвращаем функции по умолчанию.
Напомним, в среде разработки Ардуино IDE можно заливать скетчи для различных микроконтроллеров. По умолчанию обычно указана плата Genuino Uno. Если вы работаете с Mega, следует выбрать именно эту платформу (меню «Сервис»), иначе вас ожидает неприятное предупреждение: “programmer is not responding”.
Ошибка компиляции для платы Arduino Uno чаще всего возникает из-за проблем, связанных с библиотеками, например, неправильно подключили, не то ПО инсталлировали. В этом случае вы увидите напоминание “fatal error: … No such file or directory” (библиотека не перенесена в папку libraries) или “redefinition of void setup”.
Обозначенная на скриншоте ERROR означает, что программирование завершилось некорректно (расшифровываем: внутренние проблемы с компилятором, не обновили версию IDE, сбой в библиотеке, неправильный выбор разрядности операционной системы и др.).
Важно! Не забывайте использовать подсказки приложения – они очень помогают. Включаем тут: Файл -> Настройки -> “Показать подробный вывод во время компиляции”.
Что делать, если произошла ошибка при загрузке скетча Arduino Nano. Тут могут быть те же причины, что мы описали выше. Особых отличий в компиляции плат нет, главное, их правильный выбор первоначально. Однако часто пользователи настраивают не те показатели скорости порта: 9600 вместо необходимых 57600 либо не имеют соответствующих драйверов на устройствах – все это нужно проверить и исправить!
Offline
Зарегистрирован: 19.06.2018
что не так и как исправить?
Arduino: 1.8.5 (Windows 8.1), Плата:”Arduino Leonardo”
C:UsersD899~1AppDataLocalTempuntitled706967174.tmpsketch_jun19aF83CAKKIKFRUNNW (1).ino: In function ‘void setup()’:
F83CAKKIKFRUNNW (1):10: error: redefinition of ‘void setup()’
void setup() {
^
C:UsersD899~1AppDataLocalTempuntitled706967174.tmpsketch_jun19asketch_jun19a.ino:1:6: note: ‘void setup()’ previously defined here
void setup() {
^
C:UsersD899~1AppDataLocalTempuntitled706967174.tmpsketch_jun19aF83CAKKIKFRUNNW (1).ino: In function ‘void loop()’:
F83CAKKIKFRUNNW (1):23: error: redefinition of ‘void loop()’
void loop() {
^
C:UsersD899~1AppDataLocalTempuntitled706967174.tmpsketch_jun19asketch_jun19a.ino:6:6: note: ‘void loop()’ previously defined here
void loop() {
^
exit status 1
redefinition of ‘void setup()’
Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
“Показать подробный вывод во время компиляции”
-
Всем здрасьте.
По вот этому гайдупытаюсь завести аналогичный экранчик. Заканчивается все тем что данный код не компилируется
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h> // Скачанная библиотека для дисплея.
#include <Adafruit_SSD1306.h> // Скачанная библиотека для дисплея. https://yadi.sk/d/9F_uW1wIZUDna
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
void setup(){// У дисплея нету строк и колонок, только Pixel / пиксели по горизонтали и вертикали, условно! назовем курсор / колонка.
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C (for the 0.96″ 128X64 OLED LCD Display)I2C АДРЕС.
display.clearDisplay(); // Clear the buffer. / Очистить буфер.
display.setTextColor(WHITE); // Цвет текста.
display.setTextSize(1); // Размер текста (1).
display.setCursor(0,0); // Устанавливаем курсор в колонку 0, строку 0. на самом деле это строка №1, т.к. нумерация начинается с 0.
display.println(“Hello world! 11111111”); // Печатаем 1 строку.
display.setCursor(0,10); // Устанавливаем курсор в колонку 0, строку 1.(строка №2 ).
display.println(“Dmitry OSIPOV 2222222”); // Печатаем 2 строку.
display.setTextSize(5); // Меняем размер текста (5).
display.setCursor(0,20); // Устанавливаем курсор в колонку 0, строку 2.(строка №3 ).
display.println(“Size”); // Печатаем 3 строку.
display.display(); // Чтобы сделать символы видимыми на дисплее !.
}
void loop() {
}
И вылезают следующие ошибки:
Arduino: 1.6.5 (Windows 8.1), Плата”Arduino Uno”ssd1306_128x64_i2c.ino: In function ‘void setup()’:
ssd1306_128x64_i2c:9: error: redefinition of ‘void setup()’
sketch_jun16b:1: error: ‘void setup()’ previously defined here
ssd1306_128x64_i2c.ino: In function ‘void loop()’:
ssd1306_128x64_i2c:23: error: redefinition of ‘void loop()’
sketch_jun16b:6: error: ‘void loop()’ previously defined here
redefinition of ‘void setup()’Можете подсказать, какие ошибки тут?
-
Такое ощущение, что в один проект попало два файла с исходным текстом, в которых присутствуют функции setup и loop.
Имеет смысл глянуть в папку со скетчем и посмотреть на предмет наличия в ней файлов
ssd1306_128x64_i2c.ino
и sketch_jun16b (расширение, скорее всего, тоже .ino).
Следует посмотреть, какой из них содержит нужный код и выкинуть второй (переместить в другую папку, если он все-таки нужен).Теряюсь в догадках, как такого можно случайно достичь.
-
Перезапустил программу, вбил код заново… и снова проблемы…
D:ArduinoScetcheslibrariesAdafruit_SSD1306Adafruit_SSD1306.cpp:433:6: error: prototype for ‘void Adafruit_SSD1306::dim(boolean)’ does not match any in class ‘Adafruit_SSD1306’
void Adafruit_SSD1306::dim(boolean dim) {
^
In file included from D:ArduinoScetcheslibrariesAdafruit_SSD1306Adafruit_SSD1306.cpp:28:0:
D:ArduinoScetcheslibrariesAdafruit_SSD1306Adafruit_SSD1306.h:152:8: error: candidate is: void Adafruit_SSD1306::dim(uint8_t)
void dim(uint8_t contrast);
^
Ошибка компиляции.
Эх, не получается у меня что-либо сделать без проблем..
-
Какое-то противоречие внутри библиотеки.
Если я ничего не путаю, то в заголовочном файле библиотеки функция описана одним образом, а в cpp другим. В результате при компиляции библиотеки в одном месте оно ругается, что не может найти в описании класса ничего похожего на то, что пытается определить в реализации, а при компиляции включаемого заголовочного файла ругается на то, что не может найти реализацию заявленной в определении класса функции.
А вся проблема в разном именовании типа параметра: boolean в одном месте и uint8_t в другом.
Можно попробовать скорректировать библиотеку, приведя описание функции к общему знаменателю, но тут нужно видеть всю библиотеку, чтобы попытаться определить, какой именно тип из двух нужен, и поможет ли исправление.
Возможно, более простым решением будет найти другую, рабочую библиотеку. -
-
Благодарю!
Библия с этого гайда таки завела экран.
А то я еще попробовал OzOLED библию, она вроде затекла на ардуину, но экран не включила. Уже подумал, что месяц с ебая ждал брак.
Большое спасибо всем ответившим.