Pages: [1]   Go Down
Author Topic: Arduino UNO memoria  (Read 736 times)
0 Members and 1 Guest are viewing this topic.
Fidenza (PR)
Offline Offline
Full Member
***
Karma: 3
Posts: 143
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 270
Posts: 21850
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

0
Offline Offline
Faraday Member
**
Karma: 47
Posts: 5959
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ""
Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Fidenza (PR)
Offline Offline
Full Member
***
Karma: 3
Posts: 143
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Faraday Member
**
Karma: 47
Posts: 5959
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 134
Posts: 9678
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 270
Posts: 21850
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged

Fidenza (PR)
Offline Offline
Full Member
***
Karma: 3
Posts: 143
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Alla fine ho risolto cosi.

MODULO TRASMITTENTE, che riceve sulla seriale ext un flusso di caratteri e li invia immediatamente via XBEE
Code:
#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:
#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.
Logged

Pages: [1]   Go Up
Jump to: