Problema conversione array

ciao ho il seguente problema di conversione dell'array.
Il codice mi legge url che scrivo sul brower e fin qui tutto mi funziona, poi devo prendere il valore pulito e mandarlo alla myserial.write e qui sorgono i problemi.
Vi mando il codice che ho costruito

Esempio sul browers segno :http://192.168.4.1/?10&20&50
in ptr2 mi trovo 10 20 50

Devo caricare i valori 10 20 50 e spedirli con mySerial.write alla seriale.

Il codice ' errato percheè il programma mi va in errore di stak overflow e non mi spedisce nulla

    case 1:
 
        Serial.println("main\n\tpath /main\n\treq: " + String(req) + "\n\tlen: " + req.length());

         char arr2[200];
        char *str2[20];
        char *ptr2;
        idx = 0;
        req.toCharArray(arr2, 200);
        ptr2 = strtok(arr2, "?&");  // takes a list of delimiters
        while (ptr2 != NULL) {
          str2[idx] = ptr2;
          idx++;
          ptr2 = strtok(NULL, "&");  // takes a list of delimiters
          Serial.println (ptr2);   // qui mi fa vedere tutti i dati corretti
            }
       mySerial.write(ptr2, 20);


  
        break;
 
[/  code]

Ciao! Premetto che essendo dati numerici 10,20,50, forse sarebbe più sensato inviare un byte con quel valore numerico e non un array di char.

Il tuo array mySerial.write(ptr2, 20); ptr2 non è un array di caratteri!è un array di indirizzi di memoria, che di solito sono numeri che non possono essere contenuti in un byte. serial.write invia una successione di byte che non possono contenere l'indirizzo di memoria, ma non è neanche quello che vorresti.

Se li vuoi trasmettere come caratteri, usa strcpy() per copiare le stringhe in un array di char, e poi invia quello con serial.write().

Esempio:

char s[4];
strcpy(s,ptr2);
mySerial.write(s);

cioe, vediamo se ho capito bene
tu hai (e non mi interessa sapere come) un array di 200 char, di nome "arr2" che contiene una stringa
questa stringa è nella forma http://192.168.4.1/?10&20&50
tu devi timandare sulla seriale software 10 20 50
ti serve di archiviarli in un array? o solo rispedirli?
sono interi non negativi oppure potrebbero essere anche maggiori di 32000 o negativi?
quanti sono gli elementi? sempre 3 o magari un numero variabile?
nell'ipotesi semplificativa che siano interi non negativi e non ti serva archiviarli e non ci interessi "comprenderli e usarli" ma solo rispedirli

byte i=0;
bool start=0;
while(arr2[i])
{
   if (arr2[i]=='?')
   {
      start=1;
   }
   if (start)
   {
      if (arr2[i]>='0' && arr2[i]<='9')
      {
         myserial.write(arr2[i]);
      }
   }
}

mi esce sempre lo stesso errore e si sconnette

char s[4];
strcpy(s,ptr2);
mySerial.write(s);

New Client connected
GET /?10&10 HTTP/1.1
main
path /main
req: GET /?10&10 HTTP/1.1
len: 20
10
10 HTTP/1.1

Fatal exception 28(LoadProhibitedCause):
epc1=0x4000bf0e, epc2=0x00000000, epc3=0x00000000, excvaddr=0x00000000, depc=0x00000000

Exception (28):
epc1=0x4000bf0e epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000

ctx: cont
sp: 3ffef800 end: 3ffefb20 offset: 01a0

stack>>>
3ffef9a0: 00000001 3ffeea34 3ffefad0 4020243a
3ffef9b0: 20544547 3031002f 20303100 50545448
3ffef9c0: 312e312f 00000000 00000010 ffffffff
3ffef9d0: 4010721c 037b47fb 00000000 3ffee8f8
3ffef9e0: 000003e8 00000000 00000000 fffffffe
3ffef9f0: 00000120 3fffc6fc 00000001 3ffee8a0
3ffefa00: 00010401 3fffdad0 3ffeeaf0 00000030
3ffefa10: 40204a04 00000030 00000010 ffffffff
3ffefa20: 40204a04 3ffeeb00 402049f8 00000000
3ffefa30: 00000000 00000000 00000000 fffffffe
3ffefa40: ffffffff 3fffc6fc 00000001 3ffeeb00
3ffefa50: 00000000 3fffdad0 3ffeeaf0 00000030
3ffefa60: 00000000 3fffdad0 3ffeeaf0 00000030
3ffefa70: 4010590e 00000001 00000000 00000000
3ffefa80: 00000000 3ffefae8 3ffee7f4 3fff03d4
3ffefa90: 0000000f 00000000 3fff0ecc 0000001f
3ffefaa0: 00000014 00000000 000003e8 4010068c
3ffefab0: 00000000 3fff0efc 3ffee96c 3ffeeaf0
3ffefac0: 3fffdad0 00000000 3ffeeae8 402024c1
3ffefad0: 3ffe86c0 00000000 000003e8 0000e42d
3ffefae0: 3ffefae8 3fff0efc 3ffe86c0 00000000
3ffefaf0: 000003e8 00000000 00000000 3fff0efc
3ffefb00: 3fffdad0 00000000 3ffeeae8 40204a18
3ffefb10: feefeffe feefeffe 3ffeeb00 40100718
<<<stack<<<

ets Jan 8 2013,rst cause:2, boot mode:(1,7)

Standardoil:
cioe, vediamo se ho capito bene
tu hai (e non mi interessa sapere come) un array di 200 char, di nome "arr2" che contiene una stringa
questa stringa è nella forma http://192.168.4.1/?10&20&50
tu devi timandare sulla seriale software 10 20 50
ti serve di archiviarli in un array? o solo rispedirli?
sono interi non negativi oppure potrebbero essere anche maggiori di 32000 o negativi?
quanti sono gli elementi? sempre 3 o magari un numero variabile?
nell'ipotesi semplificativa che siano interi non negativi e non ti serva archiviarli e non ci interessi "comprenderli e usarli" ma solo rispedirli

byte i=0;

bool start=0;
while(arr2[i])
{
  if (arr2=='?')
  {
      start=1;
  }
  if (start)
  {
      if (arr2[i]>='0' && arr2[i]<='9')
      {
        myserial.write(arr2[i]);
      }
  }
}

mi esce errore c
lerror: ISO C++ forbids comparison between pointer and integer [-fpermissive]

if (arr2=='?')

Ripensandoci usare un array di char o un puntatore, si ottiene sempre un puntatore al primo elemento.
Il nome dell'array è il puntatore al primo elemento. Quindi è la stessa cosa :frowning: :frowning:

Ripensandoci mi sono accorto che nel test if .... Mi sono dimenticato l'indice dello array (rimasto nella tastiera)
Ma tu non hai risposto alle mie domande, servono ad aiutarti, vedi tu se è il caso di rispondere o no
Comunque ho corretto il programma

Standardoil:
cioe, vediamo se ho capito bene
tu hai (e non mi interessa sapere come) un array di 200 char, di nome "arr2" che contiene una stringa
questa stringa è nella forma http://192.168.4.1/?10&20&50
tu devi timandare sulla seriale software 10 20 50
ti serve di archiviarli in un array? o solo rispedirli?
sono interi non negativi oppure potrebbero essere anche maggiori di 32000 o negativi?
quanti sono gli elementi? sempre 3 o magari un numero variabile?
nell'ipotesi semplificativa che siano interi non negativi e non ti serva archiviarli e non ci interessi "comprenderli e usarli" ma solo rispedirli

byte i=0;

bool start=0;
while(arr2[i])
{
  if (arr2[i]=='?')
  {
      start=1;
  }
  if (start)
  {
      if (arr2[i]>='0' && arr2[i]<='9')
      {
        myserial.write(arr2[i]);
      }
  }
}

ciao scusa non ti avevo risposto mi sono accorta ora.
Mi occorre spedire solo i numeri interi che mi arrivano sulla seriale e non saranno piu' di 64, non hanno una lunghezza fissa.
Diciamo che la stringa che mi arriverà dal web sarà come quella che avevo scritto un po' piu' lunga (max64), mi arriveranno solo numeri interi positivi.
scusa ancora per la non risposta

Bettybetty:
ciao scusa non ti avevo risposto mi sono accorta ora.
Mi occorre spedire solo i numeri interi che mi arrivano sulla seriale e non saranno piu' di 64, non hanno una lunghezza fissa.
Diciamo che la stringa che mi arriverà dal web sarà come quella che avevo scritto un po' piu' lunga (max64), mi arriveranno solo numeri interi positivi.
scusa ancora per la non risposta

ora non mi da errore nello SCARICAMENTO del programma ma quando parte la stringa esce errore

Soft WDT reset

ctx: cont
sp: 3ffef800 end: 3ffefb20 offset: 01b0

stack>>>
3ffef9b0: 00000000 3ffeea34 3ffefad0 40202438
3ffef9c0: 20544547 0030312f 48203031 2f505454
3ffef9d0: 00312e31 3fffc6fc 0000005c 3ffee7f4
3ffef9e0: 3ffefae8 3fffdad0 3ffeeaf0 00000030
3ffef9f0: 00000000 00000006 3fff140c 40227a40
3ffefa00: 3fff07ec 00000000 00000000 00000000
3ffefa10: 00001973 00000006 3fff140c 40227a80
3ffefa20: 3fff07ec 3ffeeb00 40204a34 40107718
3ffefa30: 3fff1484 3fff1488 00000006 00000001
3ffefa40: 3fff1484 00000001 3fff140c 00000000
3ffefa50: 3fff1564 3fff1488 3fff1484 402255b2
3ffefa60: 000005b4 3fff1468 3fff1484 40225231
3ffefa70: 3ffeea10 0000025e 0000025e 4010020c
3ffefa80: 3fffdad0 3ffefae8 00000000 00000000
3ffefa90: 00000000 3fff10c4 0000000f 00000000
3ffefaa0: 3fff157c 0000001f 00000013 402035d6
3ffefab0: 00000000 3fff153c 3ffee89c 3ffeeaf0
3ffefac0: 3fffdad0 00000000 3ffeeae9 402024e1
3ffefad0: 3ffe86c0 00000000 000003e8 00011c86
3ffefae0: 3ffefae8 3fff153c 3ffe86c0 00000000
3ffefaf0: 000003e8 00000000 00000000 3fff153c
3ffefb00: 3fffdad0 00000000 3ffeeae9 40204a54
3ffefb10: feefeffe feefeffe 3ffeeb00 40100718
<<<stack<<<

ets Jan 8 2013,rst cause:2, boot mode:(1,6)

ets Jan 8 2013,rst cause:4, boot mode:(1,6)

wdt reset

ESP8266, ipotizzo una esp12E
ci ho pigliato?

uso nodemcu che usa esp ho rifatto lo skech semplificandolo ma continua a darmi errore appena tento di trasferire il file in seriale
Mando il istato:

void loop() {
 // aspetto che un client si connetta
  WiFiClient client = server.available();
  if (!client) {
    return;
  }
  // attendo che invii qualche dato
  while(!client.available()){
    delay(1);
  }
  // leggo la prima linea della richiesta (attenzione è CASE SENSITIVE)
  String request = client.readStringUntil('\r');
  Serial.println(request);


  delay (100);
mySerial.write (request);   // se tolgo questa linea  funziona senza bloccarsi
 delay (100);
   Serial.println ("FINITO");là






 



}

OFF-TOPIC

>Bettybetty: puoi darmi una spiegazione/motivazione relativa alla foto che usi per il tuo profilo?

Guglielmo

/OFF-TOPIC

per quale principio hai deciso che una write sarebbe stata utile?