
One of the common errors you will see while programming your Arduino is a stray error. There are a number of causes for it. It is usual to see the following stray errors in your code,
- error stray ‘ 342’ in program.
- error stray ‘#’ in program.
- or stray ‘ 315’ in program.
- stray ‘’ in program .
- stray ‘302’ in program.
- error stray ‘ 240’ in program.
It is quite frustrating to deal with all these errors. Watch the video to get rid of this error or continue reading.
Why you get Stray errors?
If you are having a stray error on the compilation of code, it is most likely that you have copied the code from any website which has Unicode characters.
The characters are most likely hidden characters and therefore you see stray error in the blank spaces.
How to get rid of Stray error?
when you will have this error, the compiler will indicate the line. All you have to do is to remove the invalid characters. The invalid character may or may not be visible. If you cannot see any character just remove the space before the line.
After removing all the invalid spaces and characters, your code will compile fine.
Прошу, помогите найти код в ошибке и решить проблему, а то моя тупая головушка не может понять конкретного места. Прошу, не судите строго, я новичок в Ардуинке.
Код:
#include <LiquidCrystal.h>
int flag = 0;
LiquidCrystal lcd(13, 11, 10, 9, 8, 7); //Подключение ЖК-Монитора
void setup()
{
pinMode(0, OUTPUT); // Выход на красную лампочку для авто
pinMode(4, OUTPUT); // Выход на зеленую лампочку для пешехода
pinMode(1, OUTPUT); // Выход на желтую лампочку для авто
pinMode(3, OUTPUT); // Выход на красную лампочку для пешехода
pinMode(2, OUTPUT); // Выход на зеленую лампочку для авто
pinMode(5,INPUT); // Выход на кнопку
lcd.begin(16, 2);
}
void loop()
{
if (flag == digitalRead(5))
{
flag = 0;
}
else
{
flag = 1;
}
if (flag == 1)
{
digitalWrite(4, HIGH);
digitalWrite(0, HIGH);
lcd.setCursor(0 ,0);
lcd.print("GREEN");
lcd.setCursor(0, 1);
lcd.print("RED");
delay(2000);
digitalWrite(0, LOW);
delay(200);
digitalWrite(1, HIGH);
lcd.print("YELLOW");
delay(2000);
digitalWrite(4, LOW);
digitalWrite(1, LOW);
delay(200);
digitalWrite(3, HIGH);
digitalWrite(2, HIGH);
lcd.setCursor(0, 0);
lcd.print("RED");
lcd.setCursor(0, 1);
lcd.print("GREEN");
delay(2000);
digitalWrite(2, LOW);
delay(200);
digitalWrite(1, HIGH);
lcd.print("YELLOW");
delay(2000);
digitalWrite(1, LOW);
digitalWrite(3, LOW);
delay(200);
}
}
Ответ программы в консоль:
5:39: error: stray '315' in program
5:40: error: stray '276' in program
28:19: error: stray '315' in program
28:20: error: stray '276' in program
35:20: error: stray '315' in program
35:21: error: stray '276' in program
43:17: error: stray '315' in program
43:18: error: stray '276' in program
45:19: error: stray '315' in program
45:20: error: stray '276' in program
50:22: error: stray '315' in program
50:23: error: stray '276' in program
6:1: error: expected ',' or ';' before 'void' In function 'void loop()':
29:1: error: expected ';' before 'lcd'
36:1: error: expected ';' before 'delay'
44:1: error: expected ';' before 'lcd'
46:1: error: expected ';' before 'delay'
51:1: error: expected ';' before 'delay'
exit status 1
Здесь упоминалось, что Arduino/CraftDuino/Freeduino можно программировать не только на Wiring-е, но и на других языках программирования.
Попробуем разобраться как это можно сделать — написать программу на обычном С/C++.
Для этого воспользуемся компилятором WinAVR.
WinAVR — это интегрированная среда разработки; она включает мощные компиляторы Си и ассемблера, программатор AVRDUDE, отладчик, симулятор и множество других вспомогательных программ и утилит.
Скачать WinAVR можно на странице проекта:
http://sourceforge.net/projects/winavr/
однако, в комплекте Arduino IDE уже идёт WinAVR (hardwaretoolsavr), поэтому можно воспользоваться им.
Для работы с исходными текстами подойдёт компонент WinAVR – Programmers Notepad (hardwaretoolsavrpnpn.exe) — удобный редактор программиста и интегрированная среда разработки (IDE):

Для более подробного знакомства со средой разработки WinAVR рекомендую статьи
Среда разработки WinAVR.
Makefile и компиляция программы.
Возьмём пример из второй статьи и адаптируем его для Arduino:
Создаём файл avrblink.c
/************************************************
ПРИМЕР МИГАНИЯ СВЕТОДИОДАМИ :: MYROBOT.RU
, адаптированный RoboCraft.ru для Arduino
*************************************************/
#include <avr/io.h>
#include <avr/delay.h>
#define F_CPU 16000000UL // 16 MHz
int main(void) // начало основой программы
{
DDRD = 0xff; // все выводы порта D сконфигурировать как выходы
while (1) { // Бесконечный цикл
PORTD = 0xff; // установить "1" на всех линиях порта D
_delay_ms(1000);// Ждем 1 сек.
PORTD = 0x00; // установить "0" на всех линиях порта D
_delay_ms(1000);// Ждем 1 сек.
}
}
— адаптировали, изменив частоту на 16МГц и время задержки 😉 Однако, как видно в исходнике – сейчас МК мигает всем портом D! Т.е., если посмотреть Arduino Pin Mapping – цифровыми выходами, начиная с digital pin 0 и заканчивая digital pin 7.
В WinAVR исходный текст программы компилируется при помощи утилиты make.exe, которая находится в папке WinAVRutilsbin. Make.exe контролирует генерацию исполняемых файлов из исходного кода программы. Для управления работой этой утилиты используют make-файлы. Make-файл сообщает компилятору, какие команды запускать, какие файлы компилировать и линковать, какой выходной код генерировать и т. д.
Копируем в директорию с нашим .c-файлом Makefile–образец (hardwaretoolsavrsample Makefile)
и вносим требуемые изменения:
указываем тип микроконтроллера
# MCU name MCU = atmega8 Либо atmega168
Далее указываем частоту
F_CPU = 16000000
название нашего проекта
# Target file name (without extension). TARGET = avrblink
Уровень оптимизации s – можно заменить на 0, чтобы отключить оптимизацию
# Optimization level, can be [0, 1, 2, 3, s]. # 0 = turn off optimization. s = optimize for size. # (Note: 3 is not always the best optimization level. See avr-libc FAQ.) OPT = s
Тип и порт программатора
AVRDUDE_PROGRAMMER = stk500v2 # com1 = serial port. Use lpt1 to connect to parallel port. AVRDUDE_PORT = com1 # programmer connected to serial device
Сохраняем изменения и пробуем скомпилировать (Tools – Make All)

Но, получаем сообщение об ошибке, т.к. Programmers Notepad не знает где искать компилятор и утилиту make.exe
Прописываем пути к нужным директориям:
c:utilsarduino-0016hardwaretoolsavrutilsbin
c:utilsarduino-0016hardwaretoolsavrbin
c:utilsarduino-0016hardwaretoolsavravrbin
в переменную среды PATH, перезагружаемся и пробуем снова
В ОС Windows это делается через Мой Компьютер — Свойства — Дополнительно — Переменные среды. Выбираете PATH, щёлкаете изменить и через точку с запятой добавляете нужные пути.

Получилось!
А в директории рядом с нашим avrblink.c и Makefile появилось много интересного:
— .dep/avrblink.o.d
— avrblink.eep
— avrblink.elf
— avrblink.hex
— avrblink.lss
— avrblink.lst
— avrblink.map
— avrblink.o
— avrblink.sym
Самый важный из этих файлов — это avrblink.hex. В нем хранится шестнадцатиричный код для загрузки в память программ (Flash ROM) микроконтроллера.
:1000000012C02CC02BC02AC029C028C027C026C0BF :1000100025C024C023C022C021C020C01FC01EC0D4 :100020001DC01CC01BC011241FBECFE5D4E0DEBF25 :10003000CDBF10E0A0E6B0E0EEE8F0E002C0059031 :100040000D92A036B107D9F710E0A0E6B0E001C0EC :100050001D92A036B107E1F702D017C0D1CF8FEFC4 :1000600081BB4FEF20E931E042BB80E197E2F9012B :100070003197F1F70197D9F712BA80E197E2F901C8 :0E0080003197F1F70197D9F7EFCFF894FFCF42 :00000001FF
А avrblink.eep — хранит шестнадцатиричный код для загрузки в энергонезависимую память данных (EEPROM).
Попробуем загрузить наш .hex в наш proteus-кий простейший симулятор ардуины

Мигает 🙂
Однако, нужно привести нашу программу ближе к стандартному Blink-у и помигать одним встроенным светодиодом на digital pin13. Как видим по схеме или по Arduino Pin Mapping – это пятая линия порта B.
Читаем крайне познавательную статью
AVR GCC :: Управление портами микроконтроллера AVR.
и вносим нужные изменения в нашу программу:
/************************************************
ПРИМЕР МИГАНИЯ СВЕТОДИОДОМ от MYROBOT.RU, адаптированный RoboCraft.ru для Arduino
данный пример повторяет стандартный скетч Blink
*************************************************/
#include <avr/io.h>
#include <avr/delay.h>
#define F_CPU 16000000UL // 16 MHz
int main(void) // начало основой программы
{
DDRB = 0x20; // 0b00100000 конфигурируем 5-ю линию порта B, как выход - остальные - вход
while (1) { // Бесконечный цикл
PORTB |= _BV(PC5); // установить "1" на линии 5 порта B (digital pin 13)
_delay_ms(1000); // Ждем 1 сек.
PORTB &= ~_BV(PC5); // установить "0" на линии 5 порта B
_delay_ms(1000); // Ждем 1 сек.
}
}
UPD — обновлённая версия для новых версий компилятора:
#include <avr/io.h>
#include <util/delay.h>
int main(void) // начало основой программы
{
DDRB |= _BV(DDB5); // конфигурируем 5-ю линию порта B, как выход - остальные - вход
while (1) { // Бесконечный цикл
PORTB |= _BV(DDB5); // установить "1" на линии 5 порта B (digital pin 13)
_delay_ms(1000); // Ждём 1 сек.
PORTB &= ~_BV(DDB5); // установить "0" на линии 5 порта B
_delay_ms(1000); // Ждём 1 сек.
}
}
Компилируем, загружаем в протеус – работает!
Сравним размеры файлов 🙂
Ардуиновский Blink.hex весит 2031 байт
Наш hex при оптимизации по размеру (OPT = s) по размеру весит 410 байт
а с отключённой оптимизацией (OPT = 0) все 3184 байта!
Теперь осталось разобраться как же в реальности прошить наш .hex в ардуину 🙂
Например, можно воспользоваться каким-нибудь программатором 🙂
Однако, у нас ведь есть загрузчик и поэтому можем просто воспользоваться родным приёмом ардуины – самопрограммированием МК.
В любом случае, нам понадобится воспользоваться утилитой AVRDUDE, которая идёт в составе WinAVR и находится внутри Arduino IDE (hardwaretoolsavr)
AVRDUDE позволяет загружать программы и данные в память микроконтроллера, а также считывать их оттуда. AVRDUDE использует SPI-интерфейс. Существуют версии для Windows и Linux. Первоначальный код был написан Брайеном Дином (Brian S. Dean) и имел название avrprog.
При использвании ардуиновского «параллельного программатора» или популярных для LPT – пяти проводков – нужная дополнительная настройка:
В Windows 2000 и Windows XP запрещена прямая работа с параллельным (LPT) портом, поэтому для нормальной работы AVRDUDE необходимо установить драйвер giveio.sys. Для установки этого драйвера зайдите в папку WinAVRbin и запустите файл install_giveio.bat (удалить драйвер из системы можно, запустив файл remove_giveio.bat).
В Windows 98 никаких специальных настроек не требуется.
AVRDUDE — консольная программа и для её работы ей нужно передавать кучу параметров, но для упрощения задачи, уже есть готовая программа — ArduinoUpload, которая написана на C# и которая как раз и делает – то что нам нужно — загружает в ардуину .hex-файл через утилиту avrdude.

остаётся выбрать наш .hex-файл, COM-порт к которому подключена ардуина и указать путь до avrdude (hardwaretoolsavrbinavrdude.exe)
Как видим, всё что делает программа — это формирует команду вида:
avrdude -F -v -pm168 -cstk500v1 -P\.COM4 -b19200 -D -Uflash:w:"file.hex":i
разберёмся, что значат все эти параметры:
-F: Игнорировать проверку соединения с МК. Разумеется, такая проверка желательна – поэтому использование этого флага стоит избегать.
-v: так называемый «многословный» (verbose) вывод – полезно для контроля и отладки.
-p : Указываем тип МК для программирования. Например, если бы был ATtiny2313, здесь нужно было бы написать: attiny2313. Мы же указываем нашу атмегу 🙂
m8 ATmega8
m16 ATmega16
m32 ATmega32
-c : Указываем тип программатора. Если используется STK500 — пишем stk500 и т.д.
-P : указывается коммуникационный порт, к которому подключён программатор. Это может быть COM1 или LPT1 или даже USB.
-b : Указывается скорость для работы с последовательным портом – нужно для программаторов, работающих через COM-порт – таких как STK500.
-D: Отключаем очистку МК перед прошивкой.
-U :r|w|v:[:format]: Самая важная команда – выполнение прошивки.
— тип памяти МК — flash или eeprom (или hfuse, lfuse, efuse для конфигурации фьюзов МК).
r|w|v – флаги определяют, что мы хотим сделать:
r (read — считать)
w (write — записать)
v (verify — проверить).
файл для записи или чтения.
[:format] флаг формата данных. Здесь всегда используется формат «Intel Hex», поэтому стоит i
Таким образом, командой -Uflash:w:»file.hex»:I – мы записываем файл file.hex в FLASH-память МК. Если нам потребуется считать eeprom-память в файл «eedump.hex» – мы напишем -Ueeprom:r:eedump.hex:i
Дополнительные параметры AVRDUDE:
-C : указываем путь до конфигурационного файла avrdude
-e: очистка МК
-n: ничего не записывать в МК. Защита, чтобы не отправить в МК ничего лишнего 🙂
-u: указывает, что хотим модифицировать фьюзы МК.
-t: терминальный режим
-q: в противоположность -v – это «тихий» режим – меньше слов – больше дела 🙂
список параметров с их кратким описанием можно получить просто запустив avrdude без параметров или с параметром -?
А более подробную документацию можно найти здесь(hardwaretoolsavrdocavrdudeavrdude.pdf).
Ну что же – пробуем прошить. Жму Reset на плате и сразу кнопку “Program”

Ошибка!
AVRDUDE пишет, что не находит своего конфигурационного файла 🙁
Хм… попробуем ему помочь – дописываем в конец строчку:
-C"c:utilsarduino-0016hardwaretoolsavretcavrdude.conf"

И снова перезагружаю плату и жму “Program”.

Ура! Получилось! Пойду допишу об этом нюансе на сайт ардуины 😉
Вот так – научились загружать в ардуину другие программы, которые можно писать хоть на ассемблере! 🙂
А так же теперь становится понятно, насколько Arduino IDE упрощает процесс программирования микроконтроллеров! 🙂
Приложение:
Скетч WinAVR-кого Blink-а, перенесённый в Arduino IDE
#include <avr/io.h>
#include <avr/delay.h>
void setup()
{
DDRB = 0x20; // 0b00100000 конфигурируем 5-ю линию порта B, как выход - остальные - вход
}
void loop()
{
PORTB |= _BV(PC5); // установить "1" на линии 5 порта B (digital pin 13)
_delay_ms(1000); // Ждем 1 сек.
PORTB &= ~_BV(PC5); // установить "0" на линии 5 порта B
_delay_ms(1000); // Ждем 1 сек.
}
далее: Переходим от Arduino к программированию ATtiny13 на C
Ссылки
http://sourceforge.net/projects/winavr/
СРЕДА РАЗРАБОТКИ WinAVR
MAKEFILE И КОМПИЛЯЦИЯ ПРОГРАММЫ
ПРОСТОЙ ПРОГРАММАТОР AVR :: AVRDUDE
http://www.arduino.cc/playground/Code/ArduinoUpload (архив с программой, исходники)
AVR Tutorial — Starting out with avrdude
По теме
Делаем ISP-программатор из Arduino
Про фьюзы
Программаторы
|
ElwooD07 0 / 1 / 0 Регистрация: 01.02.2012 Сообщений: 16 |
||||
|
1 |
||||
|
04.02.2012, 15:43. Показов 25526. Ответов 3 Метки нет (Все метки)
Не пойму что за ошибка! Ввел обычное перечисление, и всплыла эта непонятная ошибка. Если закомментировать enum, то всё впорядке. Что это значит?
71 F:Dev-CppProjs1pr1.cpp stray ‘192’ in program
__________________
0 |
|
2018 / 1617 / 489 Регистрация: 31.05.2009 Сообщений: 3,005 |
|
|
04.02.2012, 15:54 |
2 |
|
В mff_FlexАТХ ATX у вас написано кириллицей.
0 |
|
go
3645 / 1377 / 243 Регистрация: 16.04.2009 Сообщений: 4,526 |
||||
|
04.02.2012, 15:59 |
3 |
|||
|
ElwooD07, попробуй так
http://liveworkspace.org/code/… c2ca18184b
0 |
|
0 / 1 / 0 Регистрация: 01.02.2012 Сообщений: 16 |
|
|
04.02.2012, 17:15 [ТС] |
4 |
|
Я кажется понял: это символы в коде нестандартные, т.к. я их методом Copy/Paste вставлял. Спасибо в любом случае!
0 |
- Печать
Страницы: [1] Вниз
Тема: Ошибка в ходе компиляции (Прочитано 8874 раз)
0 Пользователей и 1 Гость просматривают эту тему.

OPENANDFREEALEX
Ошибка в ходе компиляции
/home/openandfreealex/avr/main.c: In function ‘main’:
/home/openandfreealex/avr/main.c:9:1: error: stray ‘302’ in program
/home/openandfreealex/avr/main.c:9:1: error: stray ‘253’ in program
/home/openandfreealex/avr/main.c:9:14: error: expected ‘)’ before numeric constant
код:
#include <avr/io.h>
#include <util/delay.h>
void init(void);
int main(void)
{
init(); // Настройка переферии
PORTE |= (1«2);
while(1)
{
PORTA = 0b10101010;
_delay_ms(100);
_delay_ms(100);
PORTA = 0b01010101;
_delay_ms(100);
_delay_ms(100);
}
}
void init(void)
{
/* Конфигурирование портов (1-выход, 0-вход) */
DDRE = 0xFF; // PORTE — выход
PORTE = 0x00;
DDRA = 0xFF; // PORTA — выход
PORTA = 0x00;
}
Пользователь решил продолжить мысль 25 Февраля 2012, 00:58:41:
Можно закрывать, нашел.
« Последнее редактирование: 25 Февраля 2012, 00:58:41 от OPENANDFREEALEX »

НеФормат
НУ давай решение в студию

Olej
НУ давай решение в студию
обычно такие сообщения:
/home/openandfreealex/avr/main.c:9:1: error: stray ‘302’ in programлезут когда в С-коде недопустимые символы (байты текста кода) — это характерные и очень противные ошибки
/home/openandfreealex/avr/main.c:9:1: error: stray ‘253’ in program
, такое часто бывает когда не закрытые литерали встречаются с русскими (UNICODE) буквами…
в данном случае это почти наверняка:
PORTE |= (1«2);вместо 2-х знаков LT (<) случился какой-то странный знак кавычки.
P.S. это я написал, чтоб, кому случится, сразу знали в чём искать … «stray ‘253’» 
- Печать
Страницы: [1] Вверх