Arduino UNO memoria

Ho la necessità da leggere da seriale software (sui pin 2 e 3) una serie di dati provenienti da PLC per poi spedirli via xbee ad un altro terminale. Solo sembra che il plc trasmetta troppo velocemente e non riesco a leggere e inviare il dato a xbee perchè mi mangia i dati…allora ho pensato di salvare i dati ricevuti da seriale in una stringa e successivamente inviare i dati…solo che i dati sono troppi e esaurisco subito la memoria…come posso fare?? ho pensato ad una soluzione con SD ma non so se risolvo molto

#include <SoftwareSerial.h>
#include <SD.h>

SoftwareSerial xbee(10, 9);
SoftwareSerial ext(3, 2);

int lengthStr=1;
char *str;
boolean fileIsOpen=false;

void setup(){  
  Serial.begin(19200);
  Serial.println("Start");
  
  xbee.begin(19200);
  ext.begin(4800);
  delay(10);  
}

void readFromSerial(){
  while(ext.available()>0){    
    byte lettura = ext.read () & 0x7F;    
    //Serial.print((char)lettura);
    if(((char)lettura == '%') && !fileIsOpen){ 
      fileIsOpen=true;
      Serial.println("Data incoming..");      
      str=(char*)malloc(lengthStr+1);          
    }
    else if(((char)lettura == '%') && fileIsOpen){ 
      fileIsOpen=false;
      Serial.println("..end!");     
    }
    store((char)lettura);        
    ext.flush();
  }
}

void store(char dato){
    lengthStr++;
    char* tmp = NULL;
  
    tmp = (char*) realloc (str, lengthStr * sizeof(char));

     if (tmp!=NULL) {
       str=tmp;
       str[lengthStr-1]=dato;
     }
     else {
       free(str);
       Serial.println("ERROR!!");
       exit(1);
     }  
}

void loop(){        
  if(ext.available()>0) {
    readFromSerial();
    //byte lettura = ext.read () & 0x7F;    
    //Serial.print((char)lettura);
    //s+=(char)lettura;
    //xbee.print((char)lettura);    
  }  
  if((!fileIsOpen)&&lengthStr>10){
    Serial.println("DATA");
    for(int n=0;n<lengthStr;n++) Serial.print(str[n]);
    free(str);  
    lengthStr=1;
  }
}

poi altra cosa…come faccio a deallocare la stringa e riallocarla vuota?? grazie

Perché non colleghi il XBee direttamente al PLC (ovviamente con dei adattatori di livello oportuni)

Semmai usa un Arduino Mega che ha 4 seriali HW.

Ciao Uwe

Ma il plc trasmette in continuazione ?se è così qualsiasi tipo di buffer, incluso una sd, farà solo in modo di allungare i tempi di riempimento, ma sempre si riempirà.
Secondo me il modo corretto è di vedere di spedire più velocemente, non puoi cambiare velocità verso xbee ?
Se ricevi veloce e spedisci lento prima o poi ti blocchi.
Se invece i dati dal plc sono saltuari puoi gestire con buffer e svuotare lento.

Che ide usi ? , la 1.0 ha cambiato la gestione seriale.

Per svuotare una stringa basta scriverci dentro il nulla con ""

Se invece i dati dal plc sono saltuari puoi gestire con buffer e svuotare lento.

si il PLC invia saltuariamente ma circa 2000-3000 caratteri a volta…potrei salvare il tutto su sd e poi inviare…ci potrebbe stare??

per collegare invece direttamente c’è una guida valida in giro??

I caratteri sono molti, calcola che hai circa 1500 caratteri a disposizione sulla ram, tolta una quota necessaria ad Arduino quindi anche se vuoi scrivere su ad devi essere veloce perché sempre dalla ram devi passare
Prova a spedire verso xbeee alla massima velocità, non li ho mai usati, accettano 115200?

mancio:
si il PLC invia saltuariamente ma circa 2000-3000 caratteri a volta..potrei salvare il tutto su sd e poi inviare..ci potrebbe stare??

Non devi salvare nulla su SD, semplicemente devi inviare subito il carattere ricevuto verso l'Xbee, però è indispensabile che utilizzi una velocità di comunicazione verso questo maggiore di quella con cui ricevi i dati dal plc che solitamente non trasmettono ad elevati baud rate, esempio ricevi dal PLC a 19200 e invii al Xbee, che ha un suo buffer di 128 caratteri, a 57600.
Attenzione che se la velocità sulla seriale software è troppo alta è questa che si perde i caratteri per strada perché non ce la fa, è una emulazione e ha i suoi limiti.

mancio:
per collegare invece direttamente c'è una guida valida in giro??

Xbee lavora con 3,3V. Non so che livelli escono dal PLC. Se é un RS232 Ti serve un integrato MAX232 che funziona a 3,3V.
Ciao Uwe

Alla fine ho risolto cosi.

MODULO TRASMITTENTE, che riceve sulla seriale ext un flusso di caratteri e li invia immediatamente via XBEE

#include <SoftwareSerial.h>

SoftwareSerial ext(3, 2);

void setup(){  
  Serial.begin(19200);
  
  ext.begin(4800);
  delay(10);    
}

void loop(){        
  if(ext.available()>0) {

    //readFromSerial();    
    Serial.print((char)ext.read());
    //Se ricevo caratteri da modulo che trasmette 7-E-1 devo fare
    //Serial.print((char)ext.read()&0x7F);

    Serial.flush();    
  } 
}

MODULO RICEVENTE. Attende i caratteri e poi li stampa sulla seriale che poi saranno modificati da un programma su PC.

#include <SoftwareSerial.h>

SoftwareSerial xbee(10, 9);

void setup(){  
  Serial.begin(9600);
        
  xbee.begin(19200); 
  delay(10);
}

void loop() {
  if(xbee.available()) {    
    char lettura=(char)xbee.read();
    Serial.print(lettura);    
  } 
}

Sembrano due programmi che sono una stupidata. Ma cercare di far andare i moduli a velocità adeguate non è stato semplice.

Se c’è bisogno spiego anche come ho impostato i due moduli Zigbee che poi faranno parte di una rete mesh.