Close

Odpověď na: Arduino Json a analyza stringu

Úvodní stránka Fórum Vaše projekty Arduino Arduino Json a analyza stringu Odpověď na: Arduino Json a analyza stringu

#11712
Zbyšek Voda
Správce

Ještě bych doplnil Vojtu.

Funkce client.read() vrátí jeden byte (tedy i znak), který přečte z dat, které klientovi přicházejí. Vy chcete dosáhnout toho, že budete tyto přečtené znaky postupně načítat a někam ukládat.

K tomu se hodí právě pole – to je vyhrazené místo v paměti, ve kterém je možné se pohybovat pomocí indexu, tedy čísla v hranatých závorkách.

Definici pole v kódu máte:
char c[1024];
říká – v paměti bude pole složené z datového typu char a bude mít 1024 položek.

Když chcete nastavit hodnotu počátečního znaku pole, provedete to následovně:
c[0] = 30;
popřípadě
c[0] = 'A'; – tímto do pole uložíte znak A (ve skutečnosti jeho číselnou hodnotu v ASCII tabulce

Pozor, pole v jazyce C jsou indexované od 0, tedy první prvek pole má index 0, druhý 1 a v tomto případě poslední znak má index 1023.

Pomocí cyklu while tedy budete číst znaky přicházející klientu a ukládat je do pole c. Podmínka client.available() platí, dokud jsou nějaké znaky k přečtení. Po každém průchodu navýšíte počitadlo i o jedna, tedy v dalším průchodu budete zapisovat na následující pozici v poli. Dovolil jsem si rozšířit Vojtův návrh:

int i = 0;

while (client.available()) {
    c[i] = client.read();
    i++;
}

c[i] = '\0'

Serial.println(c);
i = 0;

Na konec načtených dat jsem ještě přidal znak nula. Tímto jsem z načteného pole znaků vytvořil řetězec, tedy text. Řetězce jsou způsob, jak se dá uložit v kódu text. V jazyku C/C++ jsou uložené jako pole znaků, která jsou ukončená znakem nula. Potom funkce jako Serial.println() ví, kdy přestat s vypisováním (vypisují znak po znaku, dokud nenarazí na 0). Je možné, že i ten JSON parser, který používáte vyžaduje na vstupu validní řetězec a ten musí být ukončený nulou.

Také by možná bylo dobré do cyklu přidat podmínku, aby došlo k načtení maximálně 1023 znaků – více by se nevešlo do pole (poslední znak je právě 0). Také by bylo rozumné zvětšit velikost pole.

Napadlo mě, že budete mít ještě asi problém s HTTP hlavičkou. Přijatá data totiž neobsahují pouze JSON, který chcete parsovat, ale také HTTP hlavičku. Ta vypadá třeba takto:

HTTP/1.x 200 OK
Transfer-Encoding: chunked
Date: Sat, 28 Nov 2009 04:36:25 GMT
Server: LiteSpeed
Connection: close

Po hlavičce následují dva znaky zalomení řádku a až poté obsah web stránky – ve vašem případě pravděpodobně právě JSON. S tím se taky budete muset vypořádat 🙂