Зачем проверять считываемое каждый раз на допустимость, если это можно сделать один раз при записи? А CRC подтвердит, что считает именно записанное. Т.е. допустимое.
Хм… я там дополнил код в вопросе… мне надо не буфер посчитать а срс всей структуры и четто не получаицца. Я решил что параметр прредается как в sizeof, ан нет
Сделать буффер чтоле по длине структуры и заUnionить его с самой структурой штоле ?
Я уж попробовал
int *ptr {&data};
И передать ptr но тоже не сработало.
И, кстати, допустимость считанного значения не говорит о том, что еепром не битый.
Это так, самоуспокоение.
Ну да, просто во времена былинные после ресета мы читали из нцмд и каждое значение еще и проверяли на диапазоны.
Допустим в еепроме хранятся стартовая и максимальная скорость. Диапазон 0…255 для обеих.
Считалась стартовая 250, а максимальная 30.
Допустимо? Да. Валидно? Нет.
Да, получилось, то есть это явное указание, что там будет тот тип, который нужен функции под собственную ответственность ?
Да, согласен, данные перед записью считаются верными , потому достаточно считать crc
Спасибо sadman41 и ua6em
Кстати, sizeof(data)-sizeof(crc). Иначе перезаписанное в структуре crc сразу валидность порушит.
Я crc не в структуре храню, отдельной записью.
А так не сработало
mycrc = crc16((void*) &data,sizeof(data));
Тогда ладно. А я в той же структуре. Пишу сразу кучей и данные и crc. Ещё и систим префикс таскаю, который позволяет сбросить на дефолт настройки в еепроме, если прошивка обновилась, прилетев с новым префиксом, и нужно все дропнуть или конвертировать настройки в новую структуру.
Для этого нужно функции указатель на войд принять и кастануть внутри ее к нужному типу.
Типа как тут
void fram_pack(byte disk, uint16_t startAddress, void *data, uint16_t len) { // disk - 0x50-0x57, startAddress - 0x00 - 0xFF, &data - первый байт данных, len - колво байт данных (sizeof(data))
Wire.beginTransmission(disk);
Wire.write(startAddress >> 8);
Wire.write(startAddress & 0xFF);
Wire.write((byte*)data, len);
Wire.endTransmission();
delay(1);
}
Внутри явно указан неопределенный снаружи тип.
То есть сто бы ни пришло внутри обрабатываем побайтно
Типа того, но указательность утеряна почему-то.
Хмм а в чем утеряна? Вроде работает, тестировал вдоль и поперек, подсовывал разное
Потому что я видел неформатированный код без астерисков.
И во fram delay не нужен, как я помню. Он пишет с нулевой задержкой.
Наверно да, попробую, код вцелом не мой, нашел на хабре под фрамку с другим объемом и другой организацией, поэкспериментировал и доработал, даже тут гдетто была тема об этом.
В тонкостях передачи внутрь параметров не пытался разбираться.
К сожалению для меня указатели почемутто до сих пор трином бинона.
Нигде немогу доходчиво почитать. Наверно туп и родюся баобабом, зато на 1000 лет главное не прорабом.
ты не одинок, мне после ассемблера (там всё просто) тоже не даются )))
Можно подумать, в Ассемблере указателей нет.
В Си не указатели сложные, а синтаксис идиотский.
конечно есть и, там всё просто