• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь в С++. Работа с указателями.

Atom

Member
Сделал функции записи и чтения в EEPROM.

C++:
uint16_t eeprom_addr = 0;
uint16_t eeprom_len = 0;
uint16_t eeprom_crc = 0;

void _write_(void* ptr, uint8_t ptrsize) {

    while (ptrsize > 0) {

        uint8_t c = *(uint8_t*)(ptr);

        EEPROM.put(eeprom_addr, c);

        eeprom_crc += c;
        if ((eeprom_addr & 0x0F) == 0) Serial.printf_P(PSTR("\r\n%4.4x :"), eeprom_addr);
        Serial.printf_P(PSTR(" %2.2x"), c);

        ptr += 1;

        eeprom_addr++;

        ptrsize--;

    }
    //Serial.printf(c_dbg_addr, eeprom_addr );

}//void _write_( void* ptr, uint8_t ptrsize)

void _read_(void* ptr, uint8_t ptrsize) {

    while (ptrsize > 0) {

        uint8_t c; EEPROM.get(eeprom_addr, c);

        Serial.printf_P(PSTR(" addr: %x "), ptr);
      
        *(uint8_t*)(ptr) = c;

        if ((eeprom_addr & 0x0F) == 0) Serial.printf_P(PSTR("\r\n%4.4x :"), eeprom_addr);
        Serial.printf_P(PSTR(" %2.2x"), c);

        eeprom_crc += c;

        ptr += 1;

        eeprom_addr++;

        ptrsize--;

    }

    //Serial.printf(c_dbg_addr, eeprom_addr );

}//void _read_( void* ptr, uint8_t ptrsize)

Читаю ранее записанные пользовательские данные в классе, где описана в хэдере массив uint64_t eeprom_usr_data[WFSC_UDCOUNT_], где WFSC_UDCOUNT_ назначена 2.

C++:
void TestClass::readEEPROM()
{    void* ud_ref = (void*)eeprom_usr_data;
    Serial.printf_P(PSTR("usr_data *  %x\r\n"), ud_ref);

    Serial.printf_P(PSTR("usr_data size %d\r\n"), sizeof(eeprom_usr_data[0]) * WFSC_UDCOUNT_);
    
    _read_(eeprom_usr_data, sizeof(eeprom_usr_data[0])* WFSC_UDCOUNT_);
    Serial.printf_P(PSTR(" eeprom_usr_data:"));
    for (uint8_t i = 0; i < WFSC_UDCOUNT_; i++)
        Serial.printf_P(PSTR("[%d]%x "), i, eeprom_usr_data[i]);
    Serial.println("");
}
вывод данных в serial показывает, что данные читаются верно (0x0000003f и 0x00000000), а вот записывает конретную чушь (0x4020e7f4 и 0x4020e7f4)

Код:
10:10:14.930 -> usr_data *  3ffeeab8
10:10:14.930 -> usr_data size 16
10:10:14.930 ->  addr: 3ffeeab8  3f addr: 3ffeeab9  00 addr: 3ffeeaba  00 addr: 3ffeeabb  00 addr: 3ffeeabc  00 addr: 3ffeeabd  00 addr: 3ffeeabe  00 addr: 3ffeeabf  00 addr: 3ffeeac0
10:10:14.930 -> 0030 : 00 addr: 3ffeeac1  00 addr: 3ffeeac2  00 addr: 3ffeeac3  00 addr: 3ffeeac4  00 addr: 3ffeeac5  00 addr: 3ffeeac6  00 addr: 3ffeeac7  00 eeprom_usr_data:[0]4020e7f4 [1]4020e7f4
Получается
*(uint8_t*)(ptr) = c;

не верно отрабатывает? Или я не умею их готовить?
 
Сверху Снизу