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.
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.
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.
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, ed evidentemente lo è 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.
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.
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 ... :
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.