Go Down

Topic: Arduino UNO memoria (Read 872 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
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy