[Risolto] Azzerare array con memset

Ciao a tutti partendo da questa discussione http://it.emcelettronica.com/come-realizzare-casa-3d-collegarla-alla-realta

sto cercando di evolverla per creare qualcosa che mi servirà per automatizzare un acquario, visualizzare e inviare i dati tramite python da una pagina html, giusto per iniziare sto facendo un pò di prove, premetto che sono un impiantista con un pò di hobby per l'informatica quindi non sono ferrato nella programmazione ma ho acquistato un pò di libri e sto studiando, ho modificato il file della discussione in questo modo

byte buffer[3];
byte LENGHTBUFFER = 0x03;
byte SIGNATURE = 0xFF;


void setup() {
  Serial.begin(9600);
  //Serial.setTimeout(10000);

}

void loop() {
  if (Serial.available() == LENGHTBUFFER)
    {
        //Leggo il buffer con un delay di 10ms
        buffer[0] = Serial.read();
        delay(10);
        buffer[1] = Serial.read();
        delay(10);
        buffer[2] = Serial.read();
    }
    if(buffer[0] == SIGNATURE) {
      led(buffer[1],buffer[2]);
    }

}

void led(int pin, int val_pin) {
  int value_pin=0;
  if (val_pin == 255) {
    value_pin = HIGH;
  }
  else {
    value_pin = LOW;
  }
  digitalWrite(pin,value_pin);
  Serial.print(pin);
  Serial.println(value_pin); //eseguo una stampa per veificare che
                             //il comando sia stato inviato
  memset(buffer,0,sizeof(buffer));
}

e ho scritto anche lo script in python che fa quello che deve, il problema è che l'ultima riga, cioè quella che resetta il buffer mi blocca tutto il programma, però ci vuole perchè se non resetto il buffer mi mantiene sempre in memoria i dati e quindi non posso in secondo momento mandare altri dati.

Soluzioni?

Grazie

Non puoi semplicemente inserire degli 0 nel buffer?

buffer[0] = 0;
buffer[1] = 0;
buffer[2] = 0;

cyberhs:
Non puoi semplicemente inserire degli 0 nel buffer?

buffer[0] = 0;

buffer[1] = 0;
buffer[2] = 0;

Poichè dovrò scrivere altre funzioni che avranno lunghezza del buffer diversa ho letto di memset e volevo sfruttarla, però farò una prova per capire se funge, anche se ancora non capisco il perchè non vada considerando che è l’ultima operazione della funzione.

Perdona, ma all’inizio del tuo codice NON vedo la :

#include <string.h>

in cui è definita la memset

void * memset (void *, int, size_t)

Guglielmo

gpb01:
Perdona, ma all’inizio del tuo codice NON vedo la :

#include <string.h>

in cui è definita la memset

void * memset (void *, int, size_t)

Guglielmo

non sapevo perchè dal’esempio che ho visto non c’era, adesso provo, comunque ho provato anche specificando tutti gli elementi dell’array, ma ottengo lo stesso risultato, python resta in attesa dell’ultimo Serial.println di arduino.

… evidentemente il problema è nel codice python … ::slight_smile:

Guglielmo

gpb01: ... evidentemente il problema è nel codice python ... ::)

Guglielmo

Se commento la riga relativa al memset il codice python va, come se bloccasse la scrittura sulla seriale quel memset, ma considerando che è l'ultima riga della funzione il Serial.println dovrebbe andare e poi resettare il buffer, giusto?

Allora, la memset() di per se funziona perfettamente e NON c'entra nulla ... se poi azzerare il buffer in quel momento è sbagliato, [u]ed evidentemente lo è[/u] perché anche azzerando singolarmente gli elementi dell'array ti da lo stesso problema ... allora è probabilmente un errore nella logica del tuo codice. Invece di fare quella pulizia nella funzione led() prova a farla direttamente nel loop() dopo l'IF.

E NO, serial print NON va a toccare cosa è dentro la variable buf[], svuota il suo buffer di trasmissione, ma che è tutt'altra cosa.

Guglielmo

gpb01: E NO, serial print NON va a toccare cosa è dentro la variable buf[], svuota il suo buffer di trasmissione, ma che è tutt'altra cosa.

Guglielmo

Io intendevo che dopo il Serial.println il memset dovrebbe resettare il buffer.

Allora quel Serial.println nel codice l'ho messo solo per vedere se il codice fa quello che volevo io, se commento il memset python legge quel Serial.println e stampa a video il numero del pin che imposto nel buffer e il suo valore, ma il problema è che se non resetto il buffer il codice in arduino continua in un loop infinito anche senza inserire valori, legge sempre quelli che ho inviato la prima volta e continua a mandarli in stampa, quindi ho inserito quel memset, ma non appena utilizzo quella riga o resetto il buffer elemento per elemento python resta in attesa del Serial.println, e non riesco a capire se arduino non scrive proprio sulla seriale o c'è qualche altro problema.

Hai fatto la modifica che ti ho detto ?

Guglielmo

si tutto uguale

Metti il codice come lo hai modificato.

Guglielmo

byte buffer[3];
byte LENGHTBUFFER = 0x03;
byte SIGNATURE = 0xFF;


void setup() {
  Serial.begin(9600);
  //Serial.setTimeout(10000);

}

void loop() {
  if (Serial.available() == LENGHTBUFFER)
    {
        //Leggo il buffer con un delay di 10ms
        buffer[0] = Serial.read();
        delay(10);
        buffer[1] = Serial.read();
        delay(10);
        buffer[2] = Serial.read();
    }
    if(buffer[0] == SIGNATURE) {
      led(buffer[1],buffer[2]);
    }
    memset(buffer,0,sizeof(buffer));

}

void led(int pin, int val_pin) {
  int value_pin=0;
  if (val_pin == 255) {
    value_pin = HIGH;
  }
  else {
    value_pin = LOW;
  }
  digitalWrite(pin,value_pin);
  Serial.print(pin);
  Serial.println(value_pin);
}

Bene, invece di usare il tuo programma python, apri il monitor seriale di Arduino, invia i tre caratteri (... eventualmente modifica il valore di SIGNATURE che 0xFF è più complesso da generare con la tastiera) e guarda cosa ti arriva ... dopo di che, copia ed incolla qui.

E comunque ... perché il secondo IF non è dentro il primo ? Tanto lo devi fare SOLO se sono arrivati i tre bytes ... ::)

Guglielmo

Grazie a tutti o risolto il problema, nello script python, poichè sono ancora in prova in pecedenza avevo messo un'altra lettura da seriale che aspetta una "newline" come ultimo termine per passare avanti, poichè questa non arrivava python restava in attesa, togliendo il memset arduino stampava all'infinito, e quindi per me lo script python funzionava bene.

Graie

E' sempre meglio fare le prove con il "terminale seriale" ... e poi con le applicazioni ;)

Comunque ... BENE ! :)

Guglielmo