• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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;

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