Go Down

Topic: Problema conversione array (Read 447 times) previous topic - next topic

Bettybetty

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

Code: [Select]



    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]

torn24

#1
Mar 23, 2019, 08:39 am Last Edit: Mar 23, 2019, 08:52 am by torn24
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:

Code: [Select]


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




Standardoil

#2
Mar 23, 2019, 08:56 am Last Edit: Mar 23, 2019, 12:31 pm by Standardoil Reason: Dimenticato indice array nel test
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
Code: [Select]

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]);
      }
   }
}
Prima legge di Nelson (che sono io): Non scambiare il fine con il mezzo: ricorda "cosa" devi fare, non "come" devi farlo

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

Bettybetty





mi esce sempre lo stesso errore e si sconnette
Code: [Select]


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)



Bettybetty

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
Code: [Select]

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=='?')

torn24

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  :(  :(

Standardoil

#6
Mar 23, 2019, 12:22 pm Last Edit: Mar 23, 2019, 12:34 pm by Standardoil
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
Prima legge di Nelson (che sono io): Non scambiare il fine con il mezzo: ricorda "cosa" devi fare, non "come" devi farlo

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

Bettybetty

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
Code: [Select]

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

Standardoil

ESP8266, ipotizzo una esp12E
ci ho pigliato?
Prima legge di Nelson (che sono io): Non scambiare il fine con il mezzo: ricorda "cosa" devi fare, non "come" devi farlo

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

Bettybetty

#10
Mar 23, 2019, 08:21 pm Last Edit: Mar 23, 2019, 08:21 pm by Bettybetty
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:
Code: [Select]

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à






 



}





gpb01

#11
Mar 23, 2019, 09:00 pm Last Edit: Mar 23, 2019, 09:01 pm by gpb01
OFF-TOPIC

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

Guglielmo

/OFF-TOPIC
Search is Your friend ... or I am Your enemy !

Standardoil


per quale principio hai deciso che una write sarebbe stata utile?
Prima legge di Nelson (che sono io): Non scambiare il fine con il mezzo: ricorda "cosa" devi fare, non "come" devi farlo

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

Go Up