Home › Forum › Le librerie ospitate nel sito › EBYTE E32 dispositivi LoRa UART sx1278/sx1276. › Si riempie la SRAM sul ATMEGA328P resettandosi Ebyte e32
Taggato: Bug
- Questo topic ha 10 risposte, 1 partecipante ed è stato aggiornato l'ultima volta 3 anni, 5 mesi fa da
Renzo Mischianti.
-
AutorePost
-
-
20 Luglio 2020 alle 21:59 #5403
AB-informatica-service
In pratica ogni volta che mando un messaggio visualizzo lo stato di memoria (in byte) prima e dopo aver richiamato la funzione sendFixedMessage().
E’ un grosso problema per noi perché dopo una 15ina di messaggi va in autoreset per saturazione di SRAM.
Ciao
Attachments:
You must be logged in to view attached files. -
20 Luglio 2020 alle 22:09 #5406
Fixato, c’era un commento di troppo sulla sendFixedMessage, ora non brucia più memoria.
Inoltre approfitto per segnalare che se si usa la receiveMessage per i formati stringa senza size, c’è il rischio che se ti arrivano più messaggi allo stesso tempo quando leggi il buffer ne potresti trovare e leggere più di uno contemporaneamente
Per ovviare a questo problema ora c’è la
receiveMessageUntil
che legge sempre un messaggio alla volta, in alternativa alla lettura del buffer dovete occuparvi voi di splittare i vari messaggi in coda.
Ciao Renzo
-
19 Dicembre 2021 alle 23:32 #17189
Fabio
Ciao Renzo, ho ancora lo stesso problema.
Sto utilizzando Atmega 2560 questa volta e ho lo stesso problema di riempimento ram.Utilizzo Platformio su VSCode.
Cosa potrebbe essere questa volta?
Grazie
-
20 Dicembre 2021 alle 08:59 #17190
Ciao Fabio,
non riesco a replicare il problema, puoi mandarmi un esempio di codice dove si verifica il consumo di memoria?
Grazie Renzo-
20 Dicembre 2021 alle 09:44 #17191
Fabio
Ciao, si.
Allora il loop per quanto riguarda il codice LoRa è:
void loop(){
String message = communicationAbiot.receiveMessage();
if (message != "")
{
ecc..
}
}Mentre tutte le funzioni le ho racchiuse in un file e te lo copio tutto:
#include "CommunicationAbiot.h"
#include
#include
ResponseStatus rs;
ResponseContainer rc;
#define attivaMosfet 12
SoftwareSerial *serial;
LoRa_E32 *e32ttl; //AUX, M0 and M1
String CommunicationAbiot::receiveMessage()
{
String input = "";
if (e32ttl->available() > 1)
{
Serial.println("receiceMessage: Ho ricevuto un messaggio");
rc = e32ttl->receiveMessage();
input = rc.data;
Serial.print("Il messaggio ricevuto è: ");
Serial.println(input);
return input;
}
return input;
}
void CommunicationAbiot::sendMessage(const String &message)
{
Serial.print("sendMessage: Invio il messaggio: ");
Serial.println(message);
setSendingMode();
digitalWrite(attivaMosfet, HIGH);
delay(500);
rs = e32ttl->sendFixedMessage(0, GATEWAY_ADDRESS, 1, message);
Serial.println("sendMessage: " + message + " status: " + rs.getResponseDescription());
delay(500);
digitalWrite(attivaMosfet, LOW);
setReceivingMode();
}
// -------------------------------------
void CommunicationAbiot::initModem()
{
pinMode(attivaMosfet, OUTPUT);
digitalWrite(attivaMosfet, LOW);
serial = new SoftwareSerial(20, 18); //(RX,TX) <= TX, RX MODEM e32ttl = new LoRa_E32(serial, 21, 38, 41); //AUX, M0 and M1 while (!e32ttl->begin())
{
Serial.println("Attendo init modem TX...");
delay(1000);
}
delay(100);
configureModem();
Serial.println("Init modem OK");
setReceivingMode();
}
void CommunicationAbiot::destroyModem()
{
serial->stopListening();
serial->end();
if (e32ttl->available())
serial->read();
delete serial;
delete e32ttl;
}
void CommunicationAbiot::printModemConfiguration()
{
ResponseStructContainer c = e32ttl->getConfiguration();
Configuration configuration = *(Configuration *)c.data;
Serial.print(F("HEAD BIN: "));
Serial.print(configuration.HEAD, BIN);
Serial.print(configuration.HEAD, DEC);
Serial.print(" ");
Serial.println(configuration.HEAD, HEX);
Serial.println(F(" "));
Serial.print(F("AddH DEC: "));
Serial.println(configuration.ADDH, DEC);
Serial.print(F("AddL DEC: "));
Serial.println(configuration.ADDL, DEC);
Serial.print(F("Chan DEC: "));
Serial.print(configuration.CHAN, DEC);
Serial.print(" -> ");
Serial.println(configuration.getChannelDescription());
Serial.println(F(" "));
Serial.print(F("SpeedParityBit BIN : "));
Serial.print(configuration.SPED.uartParity, BIN);
Serial.print(" -> ");
Serial.println(configuration.SPED.getUARTParityDescription());
Serial.print(F("SpeedUARTDataRate BIN : "));
Serial.print(configuration.SPED.uartBaudRate, BIN);
Serial.print(" -> ");
Serial.println(configuration.SPED.getUARTBaudRate());
Serial.print(F("SpeedAirDataRate BIN : "));
Serial.print(configuration.SPED.airDataRate, BIN);
Serial.print(" -> ");
Serial.println(configuration.SPED.getAirDataRate());
Serial.print(F("OptionTrans BIN : "));
Serial.print(configuration.OPTION.fixedTransmission, BIN);
Serial.print(" -> ");
Serial.println(configuration.OPTION.getFixedTransmissionDescription());
Serial.print(F("OptionPullup BIN : "));
Serial.print(configuration.OPTION.ioDriveMode, BIN);
Serial.print(" -> ");
Serial.println(configuration.OPTION.getIODroveModeDescription());
Serial.print(F("OptionWakeup BIN : "));
Serial.print(configuration.OPTION.wirelessWakeupTime, BIN);
Serial.print(" -> ");
Serial.println(configuration.OPTION.getWirelessWakeUPTimeDescription());
Serial.print(F("OptionFEC BIN : "));
Serial.print(configuration.OPTION.fec, BIN);
Serial.print(" -> ");
Serial.println(configuration.OPTION.getFECDescription());
Serial.print(F("OptionPower BIN : "));
Serial.print(configuration.OPTION.transmissionPower, BIN);
Serial.print(" -> ");
Serial.println(configuration.OPTION.getTransmissionPowerDescription());
Serial.println("----------------------------------------");
}
void CommunicationAbiot::configureModem()
{
e32ttl->setMode(MODE_3_SLEEP); //per progranmare il modem
delay(100);
ResponseStructContainer c = e32ttl->getConfiguration();
Configuration configuration = *(Configuration *)c.data;
configuration.ADDL = ID_NODE;
configuration.ADDH = 0; //MAX 0xFF=255
configuration.CHAN = 1; //0x19;
configuration.OPTION.fec = FEC_1_ON;
configuration.OPTION.fixedTransmission = FT_FIXED_TRANSMISSION;
configuration.OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS;
configuration.OPTION.transmissionPower = POWER_20;
configuration.OPTION.wirelessWakeupTime = WAKE_UP_2000;
configuration.SPED.airDataRate = AIR_DATA_RATE_010_24;
configuration.SPED.uartBaudRate = UART_BPS_9600;
configuration.SPED.uartParity = MODE_00_8N1;
ResponseStatus rs = e32ttl->setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE);
delay(200);
}
void CommunicationAbiot::setReceivingMode()
{
e32ttl->setMode(MODE_3_SLEEP); //per progranmare il modem
delay(100);
ResponseStructContainer c = e32ttl->getConfiguration();
Configuration configuration = *(Configuration *)c.data;
configuration.SPED.airDataRate = AIR_DATA_RATE_001_12;
configuration.OPTION.wirelessWakeupTime = WAKE_UP_2000;
ResponseStatus rs = e32ttl->setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE);
delay(200);
e32ttl->setMode(MODE_2_POWER_SAVING);
delay(100);
}
void CommunicationAbiot::setSendingMode()
{
Serial.println("setSendingMode: ");
e32ttl->setMode(MODE_3_SLEEP); //per progranmare il modem
delay(100);
ResponseStructContainer c = e32ttl->getConfiguration();
Configuration configuration = *(Configuration *)c.data;
configuration.SPED.airDataRate = AIR_DATA_RATE_010_24;
configuration.OPTION.wirelessWakeupTime = WAKE_UP_2000;
ResponseStatus rs = e32ttl->setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE);
delay(200);
e32ttl->setMode(MODE_0_NORMAL);
delay(100);
}
void CommunicationAbiot::setSleepMode()
{
e32ttl->setMode(MODE_3_SLEEP);
delay(100);
}
-
20 Dicembre 2021 alle 11:25 #17197
Fabio
Ah ti metto qui anche il log cosi vedi che la SRAM diminuisce man mano:
Sono in enterSleep() da dove riprende il programma
Sono nel loop
receiceMessage: Ho ricevuto un messaggio
Il messaggio ricevuto è: D:1:2:3:4:5:6:7:8:9:10
Free Ram Size: 2314
Verifico se è per me
Questo messaggio e’ diretto a me: D:1:2:3:4:5:6:7:8:9:10
sendMessagiewithDelay:
Aspetto prima di rispondere : 3000
sendMessage: Invio il messaggio: 1:D:93:100:100:100:14:15:50setSendingMode:
sendMessage: 1:D:93:100:100:100:14:15:50
status: Success
Sono nella funzione di SLEEP…Qua ci sono circa 100 messaggi di mezzo…
Sono in enterSleep() da dove riprende il programma
Sono nel loop
receiceMessage: Ho ricevuto un messaggio
Il messaggio ricevuto è: D:6:8
Free Ram Size: 1878
Verifico se è per me
Non è per me, ritorno in ascolto
Sono nella funzione di SLEEP
-
-
20 Dicembre 2021 alle 10:50 #17195
Ciao Fabio,
così al primo colpo d’occhio manca il close dellaResponseStructContainer
.
Prova a fixare e poi dammi un feedback.
Ciao Renzo-
20 Dicembre 2021 alle 12:14 #17198
Fabio
Ho rivisto il tuo articolo dove spieghi la libreria.
Ora ho aggiunto c.close();
void CommunicationAbiot::setReceivingMode()
{
e32ttl->setMode(MODE_3_SLEEP); //per progranmare il modem
delay(100);
ResponseStructContainer c = e32ttl->getConfiguration();
Configuration configuration = *(Configuration *)c.data;
configuration.SPED.airDataRate = AIR_DATA_RATE_001_12;
configuration.OPTION.wirelessWakeupTime = WAKE_UP_2000;
ResponseStatus rs = e32ttl->setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE);
c.close();
delay(200);
e32ttl->setMode(MODE_2_POWER_SAVING);
delay(100);
}
void CommunicationAbiot::setSendingMode()
{
Serial.println("setSendingMode: ");
e32ttl->setMode(MODE_3_SLEEP); //per progranmare il modem
delay(100);
ResponseStructContainer c = e32ttl->getConfiguration();
Configuration configuration = *(Configuration *)c.data;
configuration.SPED.airDataRate = AIR_DATA_RATE_010_24;
configuration.OPTION.wirelessWakeupTime = WAKE_UP_2000;
ResponseStatus rs = e32ttl->setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE);
c.close();
delay(200);
e32ttl->setMode(MODE_0_NORMAL);
delay(100);
}
Ti tengo aggiornato.
-
-
20 Dicembre 2021 alle 12:22 #17202
Si fammi sapere, magari c’è anche qualche altra cosa.
Ciao Renzo -
20 Dicembre 2021 alle 14:01 #17204
Fabio
Ciao Renzo, confermo che aggiungendo il close() la SRAM non si riempie piu!
Grazie
-
20 Dicembre 2021 alle 17:05 #17206
Ciao Fabio,
perfetto!! 🙂
Ciao Renzo
-
-
AutorePost
- Devi essere connesso per rispondere a questo topic.