Ви не увійшли.
Спасибо за быстрый ответ, буду разбираться. Но по ходу есть еще вопрос:
Гоняю программу тестирования печатной платы, которая работает следующим образом: после включения она гоняет тест и при каждом прогоне выкидывает в технологический монитор сообщения "Запуск прохода" и "Конец прохода".
Останавливаю тест, включаю Ethernet (плата стоит сервером на Ethernet). Контролирую в том же технологическом мониторе, что запрос с компа пришел правильный.
Запускаю опять тест, теперь в строках сообщений в технологическом мониторе передаются какие-то строки из ОЗУ. Т.е. программа при исполнении модуля Serial.println("Запуск прохода") устанавливает указатель не туда.
Я подозреваю, что мне просто не хватает какой-то библиотеки, например <avr/pgmspace.h>, которая позволит контроллеру отделить массивы, располагаемые в ОЗУ от массивов, располагаемых в ПЗУ.
Где эту библиотеку взять?
Или проблема не в этом?
Вячеслав!
Большое спасибо за подсказку, а также всем поучавствовашим. Формат подсмотрел по ссылке
https://www.arduino.cc/en/Reference/PROGMEM
Немножко странный формат, ну да ладно, в Си для встроенных контроллеров это всегда так. При отладке немного поплутал. Меня смутило, что библиотеки SPI.h, Ethernet.h светятся красным, а avr/pgmspace нет.
С кодировкой все в порядке, но указатели "убегали" по очень простой причине. Буфер был величиной 650 байт, а формат указателя byte. Это я с самого начала проглядел.
Это сразу в глаза не бросается, вариант 1 не работает
// option 1
static short address_short = *index_ROM;
static char c;
for (int i = 0; i < len_index; i++) {
c = pgm_read_byte_near(address_short++i);
Serial.write(c);
}
а вариант 2 работает, хотя с точки зрения СИшного кода оба варианты правильны
// option 2
static char c
for (int i = 0; i < len_index; i++) {
c = pgm_read_byte_near(index_ROM + i);
Serial.write(c);
}