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

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

  1. b707

    b707 Гуру

    плохо с математикой? 6 + 4 + 4 + 1 = 15.
    Но важнее, что никакой "конец строки" вы никуда не пишете - в коде этого нет.

    А насчет того, что все "заработало железно" - врать не надо. Вот такая строка
    Код (C++):
    myFile.println(String(data));
    пишет в файл совсем не то, что вы ожидаете.
     
    parovoZZ нравится это.
  2. К радости или сожалению, скорее, к радости, в Rad Studio всё построено более гуманно, чем в Microsoft C++.
    Там меньше заморочек с этим - практически нет. Только если надо что то "свиртуозить", залезть в систему вглубь, а не вширь.
    Соответственно, и код там строится в разы быстрее.
     
  3. b707

    b707 Гуру

    там просто все это пишется за вас. Реально вы С++ не знаете совсем.
     
    Andrey12 нравится это.
  4. точно.
    эту каку я уже заменил по рекомендации продвинутого товарища.
    теперь это выглядит так:
    Код (C++):
    bool SaveNewData(void)
    {
        File myFile = SD.open("connect.dat", FILE_WRITE);
        if (myFile)
        {
          Serial.print("Записываю MAC, ip1, ip2 ");
          uint8_t data[17];
          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];
          //data[14] = locPort;
          //data[15] = dePort;
          myFile.write(data, 16);
          myFile.close();
          return true;
        }
        else
          return false;
    }
    последний символ оставлен на конец строки, но и так всё работает
     
  5. b707

    b707 Гуру

    интересно. как вы это обратно читаете....
     
    Andrey12 нравится это.
  6. и, пока писал, увидел ещё косяк, добавил

    Код (C++):
     }
        else
        {
          myFile.close();
          return false;
        }
     
  7. не должно работать?

    как то так:
    Код (C++):
    Serial.println("reading data from SD ...");
          ClearData();
          Serial.println("очистил данные ...");
          DataPrn();
          for (byte i = 0; i < 6; i++)
              mac[i] = myFile.read();      
          for (byte i = 0; i < 4; i++)
              myip[i] = myFile.read();  
          for (byte i = 0; i < 4; i++)
            deip[i] = myFile.read();
          //locPort = myFile.read();
          //dePort = myFile.read();      
          myFile.close();
          Serial.println("прочитал данные ...");            
          DataPrn();
     
  8. b707

    b707 Гуру

    если формат файла задан жестко - сойдет
     
    Andrey12 нравится это.
  9. Asper Daffy

    Asper Daffy Иксперд

    А разве нет?
    6 + 4 + 4 + 1 = 15
    (если не умеете считать в уме, напишите программу на С++ в котором Вы спец, пусть она посчитает :)
     
    Andrey12 нравится это.
  10. как сократить обхём переменных
    Ну, крутое замечание. Оно мне очень помогло. спасибо.
    У вас, я смотрю, этот форум - как утренние газеты - делать нехрен, яйца чесать надоело, пойду потролю кого-нибудь.
     
  11. b707

    b707 Гуру

    учиться программировать и грамотно писать код.
    Глядя на куски вашего кода в первом собщении - думаю расход оперативки в нем легко можно сократить вдвое, не трогая библиотеки. Наверняка и остальной код не лучше...
     
    Andrey12 нравится это.
  12. b707

    b707 Гуру

    Михаил, заканчивайте дерзить. Вот точно не с вашими знаниями обижаться на шутки Asper Daffy, вы даже представить не можете, насколько мало вы знаете по сравнению с ним.
    Вы вчера вроде настроились на конструктивный лад - вот так и продолжайте
     
    Andrey12 нравится это.
  13. SergeiL

    SergeiL Оракул Модератор

    Ну да, согласен.
    Как пример: у меня одна Leonardo ETH с начала 2017-го года глючит без единого сбоя и перезапуска, подключенная к мобильному интернету и аккумулятору 12В на плавающей зарядке. Даже забыл про нее, но глючит потихоньку ;).
    Шлет данные на домашнюю распберри, включая счетчики перезапусков и реконнектов.
    Распберри проверяет данные от нее, и при их отсутствии или выходе за пределы - сигнализирует.
    Отсутствие данных видел только при тестировании ;)
    Как то проблемы танцоров вспомнились...
     
    Daniil, Asper Daffy и Andrey12 нравится это.
  14. как код может помочь сократить объём переменных? ведь проблема в них?

    п.с.
    в каждой системе есть свои фокусы, тонкие места, приёмы.
    я научился решать все проблемы в рад студио - а там их достаточно много, особенно, когда начинаешь пользоваться сторонними устройствами.
    я познаю систему ровно в том объёме, в котором мне достаточно для решения поставленной задачи. я - не программист в полном смысле этого дела. я - управленец. а программирование мне помогает решать многие вещи. например производственные процессы без ИТР.

    тут свои грабли.
    я спрашиваю совета, и приятно получать ответы, а не рассказы, как я все плохо, и как не умею.
    если бы я всё умел - я бы тут не сидел. это, надеюсь, и ежу понятно.

    ну а показывать другим, что ты умнее и круче - это комплекс, комплекс родом из детства.
     
  15. примите мои поздравления. мне, пока, еще дерзать и дерзать
     
    Последнее редактирование: 5 авг 2020
  16. столкнулся с тем, что по UDP сообщения отправляются медленнее, чем я рассчитывал.
    код, который отправляет :
    Код (C++):
    void loop()
    {
        if (WaitingIP)
        {
            //for (int i = 1; i < 256; i++)
            sentIP++;
            if (sentIP == 256)
              sentIP = 1;
            {
                deip[3] = sentIP;  // хранитель IP адреса отправки
                Serial.println();
                Serial.println("Задумал отправить");
                SendMsg("WaitIP," + MacToStr(mac) + "," + String(loPort) + ",", deip, dePort);
                //Serial.println(i);
            }
            //delay(5000);
        }
        int packetSize = Udp.parsePacket();
        if(packetSize)
        {
            Serial.print("Получено ");
            Serial.print(packetSize);
            Serial.println(" байт");
            Serial.print("От ");
            IPAddress remote = Udp.remoteIP();
            for (int i = 0; i < 4; i++)
            {
                Serial.print(remote[i], DEC);
                if (i < 3)
                  Serial.print(".");
            }
            Serial.print(", port ");
            Serial.println(Udp.remotePort());
       
            // считываем пакет в буфер packetBufffer
            Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
            Serial.print("Contents: ");
            Serial.println(packetBuffer);
            SendMsg("получил", deip, 13);
            Serial.println("отправил ответ");
        }
    }
    void SendMsg(String msg, IPAddress ip, int port)
    {
        Serial.println("Начало отправки ");
     
        uint8_t mesa[msg.length() + 1];
        Serial.println(msg);
        Serial.println(IPAddress(ip));
        Serial.println(port);
        msg.toCharArray(mesa, msg.length() + 1);
        Udp.beginPacket(ip, port);
        Udp.write(mesa, msg.length() + 1);
        Udp.endPacket();
        Serial.println("отправил");
    }
     
    отправка происходит раз в секунду, примерно.
    пробовал циклом, пробовал инкриментом менять айпи получателя.
    цель - сообщить компу о том, что вот, новая плата в сети, и ей надо прописать уникальный мак, айпи и порт для дальнейшего общения.

    по умолчанию комп принимает сообщения от "всех новеньких" на порту №1
    цель цикла - пробомбордировать все адреса айпи от 1 до 254, т.к. не понятно, на каком из них сидит главный комп.
     
  17. b707

    b707 Гуру

    Михаил. хватит уже баек про Рад студио. Я не видел. что за код вы там пишете. но судя по вашим темам - вы там тоже не "решаете проблемы". а "закрываете вопрос", как вы выразились на другом форуме. То есть вы ни в чем не разбираетесь. а просто затыкаете дыру первым попавшимся костылем. Такому вашему "опыту" - грош цена.

    вот именно что на форум вы приходите не учиться, а за готовыми ответами.

    конечно может. Например, у вас в коде просто куча жестко закодированных строк типа
    Код (C++):
    Serial.print("Записываю MAC, ip1, ip2 ");
    которые впустую занимают оперативную память.
    Если переписать эта строку вот так:
    Код (C++):
    Serial.print(F("Записываю MAC, ip1, ip2 "));
    - размер занятой оперативки уменьшится на 24 байта. и так с каждой подобной строчкой - а я думаю, у вас в программе их десятки.

    Это не единственный прием, позволяющий экономить память. Если бы вы меньше хвастали своим типа "опытом" и больше слушали- вы бы давно многому научились.
     
    Последнее редактирование: 5 авг 2020
    Andrey12 нравится это.
  18. b707

    b707 Гуру

    с точки зрения экономии памяти код просто жуть...
    вот это вот например просто пипец
    Код (C++):
    SendMsg("WaitIP," + MacToStr(mac) + "," + String(loPort) + ",", deip, dePort);
    ради отправки одного сообщения создаете семь экземпляров класса String. И вы говорите, что у вас не хвтает памяти? - а код написан так, будто у вас еще гигабайты в запасе...

    вы спрашивали. как код может влиять на размер переменных? - вот пример, перепишите все свои строчки с класса String на символьные массивы - выиграете кучу места.
     
    Последнее редактирование: 5 авг 2020
    Andrey12 нравится это.
  19. ответов все же нет:
    1. как это повлияет на производительность? это больше интересует
    2. я понимаю так, что у ардуино есть место под код и под переменные. и это разные места. это так?
    3. почему код создаёт 7 экземпляров класса Sring? 5. И сколько это съедает, в производительности, в памяти?
     
  20. согласен. не знал таких приёмов. Буду пользоваться

    однако, это временные сообщения, которые нужны только на этапе отладки.
    они влияют на место под переменные?