Циклит программа, не хватает памяти

Тема в разделе "Arduino & Shields", создана пользователем Михаил123, 4 авг 2020.

  1. Arduino UNO R3 + Ethernet Sfield W5100
    библиотеки и переменные:

    #include "SPI.h"
    #include "Ethernet.h"
    #include "EthernetUdp.h"
    #include "SD.h"
    EthernetUDP Udp;

    byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
    byte myip[] = {192,168,1,1};
    byte deip[] = {192,168,1,1};
    int locPort = 1;
    int destPort = 13;
    char mesa[30];
    bool DataRead = false;


    инициализирую SD, работаю с картой - нормально.
    как только пытаюсь работать с сетевой (подключаю строку if (Ethernet.begin(mac) == 0)) - программа циклит

    Код (C++):
    NewReadFile:  
        File myFile = SD.open("connect.dat", FILE_READ);
        delay(300);
        // открываем ранее созданный файл file.txt
        if (!myFile) {
          myFile.close();
          // если файл file.txt не найден
          Serial.println("file not found");
          File myFile = SD.open("connect.dat", FILE_WRITE);
          Serial.print("Записываю MAC, ip1, ip2 ");
          char data[14];
          for (byte i = 0; i < 6; i++)
            data[i] = mac[i];
          for (byte i = 0; i < 4; i++)
            data[i + 6] = myip[i];
          for (byte i = 0; i < 4; i++)
            data[i + 10] = deip[i];
          myFile.println(String(data));
          //Serial.println(String(data));
          myFile.close();
          Serial.println("записал новый файл данных");
          goto NewReadFile;
        }
        else
        {
    цикл крутится с первой строки и каждый раз определяет отсутствие файла. Файл формирует, возвращается, опять не видит его и т.д.
    это начинает происходить, как только после блока работы с SD картой добавляю строку:
    при компиляции с этой строкой идет сообщение:
    как мне побороть эту беду?
     
  2. Asper Daffy

    Asper Daffy Иксперд

    Для начала, понять, что происходит.

    А для этого нужно

    1. Научиться выкладывать код (причём полностью, а не огрызки)
    2. научиться внятно задавать вопросы. Для этого
    2.1. прекратить бредить о вещах, которых не понимаете
    2.2 именно задавать вопрос, а не выдавать свой уже готовый ответ про память (которая, вполне вероятно, не при делах)
    3. Убедиться, что несовместимые библиотеки Ethernet и SD используются аккуратно, так. чтобы эту несовместимость обойти и чтобы она не мешала.

    Ну, вот как-то так.
     
    Igor68, Daniil, NikitOS и 2 другим нравится это.
  3. Умничать надо где-нибудь далеко. Если нечего что то не понятно - задайте вопрос.
    Прошу не спамить
     
  4. глючная эта штука - Ардуина. Убеждаюсь не в первый раз.
    добавил код:
    Serial.println("открыл файл для чтения");

    после строки
    File myFile = SD.open("connect.dat", FILE_READ);

    и всё закрутилось.
    Что за хрень?
     
  5. ...и вопрос в догонку:
    функция
    Код (C++):
    Serial.print("Free RAM: ");
        Serial.println(FreeRam());
    .как тут может быть отрицательное значение?
     
  6. @Михаил123
    1. Вы открываете файл для записи в
    Код (Text):
    File myFile = SD.open("connect.dat", FILE_WRITE);
    И вам абсолютно не важен результат, открылся файл на запись или нет, возможно файл так и не удалось открыть, потому что мешает ethernet шилд.

    2. Плохая практика объявлять две переменные с одним и тем-же именем в одной функции/методе
    Код (Text):
    File myFile = SD.open("connect.dat", FILE_READ);
    и ещё одна myFile
    Код (Text):
     File myFile = SD.open("connect.dat", FILE_WRITE);
    можно запутаться.

    3. При записи бинарных данных, того массива байтов в котором МАК и ip адреса, используете у класса File метод println, передавая ему построенный String от указателя на массив символов, т.е. строка будет построена не длиной в 14 байт, а включая всякий мусор длиной до первого бинарного нуля. Почему для записи массива байтов определенной длины был выбран метод println, а не File::write(const uint8_t *buf, size_t size) не понятно.
     
    b707, Daniil, parovoZZ и ещё 1-му нравится это.
  7. для разнообразия - закомментировал строку
    Код (C++):
    Serial.println("открыл файл для чтения");
    и понеслось
    ...
     
  8. спасибо за наводки.
    я не мастер в ардуинах, я больше по с++ в рад студио.
    долго бился, спрашивал, как писать/читать маки и адреса - никто до этого ничего не подсказал (вопросы были на других форумах) - как то собрал, работает.
    вроде, мусора не должно быть при моей записи, но предложенный вариант мне кажется более верным.

    с интернет шильдом путем научного тыка научился работать (собрал кучу инфо с разных форумов - тоже не могли ничего сказать толком)
    сейчас он точно не мешает.

    весь фокус - в волшебной строке )))
     
  9. Это не фокус, это память праспахиваете, типичное поведение.
    Для тех кто "больше по с++" это должно быть очевидно.
     
    b707, Daniil и parovoZZ нравится это.
  10. Asper Daffy

    Asper Daffy Иксперд

    Так вроде это ты тут вопросы задаёшь. Мне-то всё понятно.
     
  11. b707

    b707 Гуру

    да он "по С++" только на словах... видели мы его на ардуино,ру, в С++ двух слов связать не может...Насоздавал полтора десятка тем, ответы не понравились - в итоге обида "никто так и не помог"...
     
    Andrey12 нравится это.
  12. я не понял слова "праспахиваете" и что за типичное поведение?
     
  13. Балаболы идут лесом. Мне жалко времени терять на пустой трёп.
     
  14. Ни одного ответа не получил, кроме бла-бла-бла.
     
  15. b707

    b707 Гуру

    и похоже никаких выводов не сделал. Тут тем же кончится.

    вам, батенька, учиться надо, да только вы не умеете. Потому и ни один ответ не помог.
     
    Последнее редактирование: 4 авг 2020
  16. Как можно сократить объём переменных - убрать неиспользуемые функции из используемых библиотек?
     
  17. b707

    b707 Гуру

    1)никак. 2) в этом нет нужды, компилятор убирает сам 3)Вы уже спрашивали.
     
    Последнее редактирование: 4 авг 2020
    parovoZZ нравится это.
  18. b707

    b707 Гуру

    всякий программист С/С++ знает термин "распахиваете память".. Это когда например в строку длиной 14 байт вы пишете не 14 символов, а значительно больше.
    И это "типичное поведение" для "знатока С++" типа вас...

    Кстати, и в файл при этом пишется вовсе не мак и не IP-номера, а полная ерунда
     
    Последнее редактирование: 4 авг 2020

  19. Разве у меня пишется байт больше, чем 14? 6 + 4 + 4 + 1(конец строки)
    Я специально очищаю переменные, и проверяю, что записано.
    Пишется и читается всё нормально.

    При подключении обратно закомментированного ранее, функционала, прога стала виснуть в произвольных местах.

    Загрузил всё это в мегу, убрал все "задержки" типа delay(200) и т.п. - прога заработала "железно".

    Всё-таки, не зря пишется предупреждение о возможной нестабильной работе программы при малом остатке (менее 20%) свободного места для переменных.
     
  20. всё-таки нужда есть как то сократить объём переменных, т.к. на UNO виснет, а на меге - нет проблем.
    Если всё-таки никак, то UNO не подходит...

    Жаль.