Go Down

Topic: Arduino UNO memoria (Read 820 times) previous topic - next topic

mancio

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

Code: [Select]

#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

uwefed

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

Testato

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 ""
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

mancio

Quote
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??

Testato

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?
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

astrobeed


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.

uwefed


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


mancio

Alla fine ho risolto cosi.

MODULO TRASMITTENTE, che riceve sulla seriale ext un flusso di caratteri e li invia immediatamente via XBEE
Code: [Select]

#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.
Code: [Select]

#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.

Go Up