Garbage su seriale all'apertura connessione.

Buongiorno a tutti!
Ho riscontato questo problema con il mio UNO: ho uno sketch che riceve dati da Seriale, analizza l'input e a seconda di cosa riceve si comporta in due modi differenti
-Serial.println("Stringa")
-Serial.write(array,lunghezza)

Usando il terminale dell'IDE tutto bene, ma se provo ad interfacciarmi da Python/C# ottengo un'anomalia: nel caso della println() tutto OK, nel caso della write() no, in quanto, prima di stampare il contenuto dell'array, stampa 4byte (in HEX 35 30 0D 0A), sempre quelli.

Sapete cosa può causare quel comportamento? Conseguenze del reset all'apertura della connessione?E perché con la println funziona tutto?

Grazie!

cirowner:
Usando il terminale dell'IDE tutto bene, ma se provo ad interfacciarmi da Python/C# ottengo un'anomalia: nel caso della println() tutto OK, nel caso della write() no, in quanto, prima di stampare il contenuto dell'array, stampa 4byte (in HEX 35 30 0D 0A), sempre quelli.

Quindi stai ricevendo '3' , '5', CR e LF ... ti dicono nulla i due numeri ?

Guglielmo

Ehm...al momento non mi viene in mente niente...

Allora metti il codice Arduino che gli diamo un'occhiata ... :wink:

Guglielmo

Questa è la funzione che si mette in ascolto sulla seriale. Quando riceve un comando controlla se è predente un parametro secondario e invoca la cmdParser passandogli il parametro principale e, se trovato, il parametro secondario

void serialLoop()
{
	String rv = "";
	while(Serial.available())
	{
		rv += String((char)Serial.read());
	}

	if(rv=="") return;



	String cmd, params;

	if(rv.indexOf(' ') != -1)
	{
		cmd = rv.substring( 0, rv.indexOf(' ') );
		params = rv.substring( (rv.indexOf(' ')+1) );
		cmdParser(cmd, params);
		return;
	}
	else
	{
		cmd = rv;
		cmdParser(cmd);
		return;
	}
}

Questa funzione viene chiamata del listener seriale. I vari CMD_ sono definiti nell'header file.

void cmdParser(String command, String params)
{
	if(command == CMD_GET_FC)
	{
        printFlashConfig();
	}
	else if(command == CMD_READ_ALL)
	{
        read();
	}
}

Con la printFlashConfig() nessun problema (errata corrige, sono print, non println)

void printFlashConfig()
{
	uint8_t buffer[4] ;
	//calcoli che riempiono il buffer
	Serial.print("FlashConfig:");
	Serial.print("0");
	Serial.print(String(buffer[3],HEX));
	Serial.print(String(buffer[2],HEX));
	Serial.print(String(buffer[1],HEX));
	Serial.println(String(buffer[0],HEX));

}

mentre con la read() ho appunto il problema dei caratteri aggiuntivi

void read(int blockNum, int blocksize)
{
     uint8_t buffer[PAGESIZE];
    //Operazioni sul buffer
 

        if(len%132==0)
        {
            Serial.write(buffer,PAGESIZE);
        }

}

Con questi spezzoni di codice non si vede ...
... la mia paura è, che per un qualche motivo, tu vada a sovrascrivere in memoria l'array buffer.

Già vedo una cosa che io non farei mai ...
...l'uso della classe String !

Su una MCU con 2 KB di SRAM è praticamente volersi fare del male da soli ! Non hai garbage-collector e, ogni volta che modifichi una String ... viene riallocata dinamicamente memoria e ... andare fuori di memoria su Arduino, in questo modo è un'attimo ]:smiley:

Prova a mettere delle chiamate per la verifica della memoria libera in vari punti del codice e vedi come stai messo ...

Guglielmo

Capisco.
Quello che però non mi spiego è perché con il terminale dell’IDE non si presenti il problema.
Anche perché ricordo che prima di fare le ultime modifiche al codice quel problema non si presentava affatto.
Provo a fare delle modifiche…