Sto cercando di realizzare una sorta di parser XML su connessione TCP, ma mi capita una cosa strana…
Mi son fatto una funzione che cerca uno specifico TAG all’interno di una stringa XML, e se lo faccio girare da solo funziona correttamente, ma se poi lo metto all’interno di una gestione in loop della connessione TCP, continua a funzionare, ma mi sballa completamente la dimensione della stringa trovata, aggiungendo 4 caratteri alla fine che non hanno senso.
La cosa strana è k lo fa in maniera fissa, ovvero sempre 4 caratteri indipendentemente dalla lunghezza del TAG, ma lo fa solo se uso le funzioni TCP…
Posto il codice :
#include <Ethernet.h>
#include <stdio.h>
#include <String.h>
char inTCPBuffer[255]; // Stringa per la gestione dei messaggi in arrivo
// Dati per la gestione della rete
byte mac = { 222, 173, 190, 239, 254, 237 };
byte ip = { 10, 0, 0, 177 };
byte gateway = { 10, 0, 0, 1 };
byte subnet = { 255, 255, 0, 0 };
int port = 23;
Server server(port); // Instanzio il server
byte endByte = 0; // Carattere finale della trasmissione TCP
void setup(){
Ethernet.begin(mac, ip, gateway, subnet);
server.begin();
// Avvio la seriale di debug
Serial.begin(9600);
Serial.println(“AVVIO”);
}
void loop(){
Client client = server.available();
if (client) {
int indicebuffer = 0; // Contatore dei caratteri in ingresso
if (client.connected() && client.available()) {
while (inTCPBuffer[indicebuffer-1] != endByte) {
if (indicebuffer<255) inTCPBuffer[indicebuffer] = client.read(); // Riempo il buffer in ingresso
indicebuffer++;
}
parse_command(inTCPBuffer, “cmd=”"); // Lancio la fuznione alla ricerca di un TAG specifico
}
}
//parse_command("<data cmd=“Ciao”>", “cmd=”"); // Lancio la fuznione alla ricerca di un TAG specifico
}
void parse_command(char* XML, char* TAG){
int dim = 0; //strlen(TAG);
char ptr = strstr(XML, TAG);
ptr = strstr(ptr, “”");
for(int i=1;i<=strlen(ptr);i++){
if(ptr==’"’){*
-
// Se trovo il carattere di chiusura TAG esco dal ciclo for*
-
break;*
-
}else{*
-
dim++; // Incremento la dimensione della variabile che conterrà il TAG*
-
}*
-
}*
-
char string_1[dim]; // Dimensiono la stringa che contiene il valore del TAG in base a dim*
-
// Stanmpo la lunghezza della stringa appena generata*
-
Serial.print("Dimensiono la stringa a : ");*
-
Serial.print(dim);*
-
Serial.println(" caratteri");*
-
for(int i=0;i<=sizeof(string_1)-1;i++){*
string_1 = ptr[i+1]; // Copio nella stringa i singolo caratteri del TAG trovato
* }*
* // Stanmpo la lunghezza della stringa dopo aver copiato i caratteri*
* Serial.print("Lunghezza Stringa : ");*
* Serial.println(strlen(string_1));*
* Serial.print("Valore del TAG trovato : ");*
* Serial.println(string_1);*
}
*****************
Se mi collego tramite TCP e invio la stringa
Questo produce un OUTPUT del genere
Dimensiono la stringa a : 4 caratteri
Lunghezza Stringa : 8
Valore del TAG trovato : Ciaoì
ç
Se modifico lo script nella parte Loop, escludendo la gestione del TCP e forzando manualmente il parser in questo modo :
void loop(){
* parse_command("<data cmd=“Ciao”>", “cmd=”"); //
_}*_
L’OUTPUT diventa questo :
Valore del TAG trovato : Ciaoh
Dimensiono la stringa a : 4 caratteri
Lunghezza Stringa : 5
Ci sto perdendo le ore, e non riesco a venirne a capo… se qualcuno ha delle idee di come risolvere il problema, sono ben accette…