Go Down

Topic: Array di char e Itoa (Read 3081 times) previous topic - next topic

Federico66

#45
Feb 15, 2020, 02:45 pm Last Edit: Feb 15, 2020, 03:09 pm by Federico66
Non credo di sbagliarmi nel dire che c'è un po' di confusione!!!

@simosere: non stai facendo la conversione di una variabile String in char array (stringa C), ma stai modificando un pezzo di codice che usa le Stringhe in un altro che usa le stringhe C.

Per fare questo devi aver ben presente le differenze, e prima di trasformare questo
Code: [Select]
String result;
in qualcosa tipo questo
Code: [Select]
char result[n]
dovresti modificare il metodo sendData (che tra l'altro non sappiamo come è fatto!) che sembra accettare e  restituire Stringhe.

Quindi per prima cosa dovresti prendere la funzione sendData e fare in modo che accetti come parametri delle stringhe C e restituisca una stringa C.

Ma prima di tutto questo dovresti lasciar perdere il codice che hai trovato e cercare di studiare e quindi scrivere un tuo codice che invia comandi AT attraverso la seriale e attende le risposte, la qual cosa forse è molto più semplice che modificare il codice di qualcun altro, che oltretutto sembra anche scritto male.
Se cerchi, anche nel forum, trovi tantissimi esempi con moduli bluetooth, quello che cambia è solo il comando, la logica è sempre la stessa, invio e aspetto la risposta.

Scusa se sembro brusco, ma per imparare devi partire da cose semplici, e quello che stai facendo non è semplice se ti mancano le basi.

Federico

[EDIT]
Aggiungo un paio di link utili per i comandi AT per 8266:
Qui puoi familiarizzare con comandi AT (via monitor seriale) e le relative risposte.
Qui un elenco completo dei comandi AT con descrizione
"La logica vi porterà da A a B. L'immaginazione vi porterà dappertutto." A. Einstein

simosere

Ciao Federico grazie!

hai dei link che mi consentano di capirci qualcosa...

Federico66

Lascia perdere link.

Premesso che non ho un ESP8266, quindi non potrei testare un dialogo AT, inizia a lavorare con le stringhe C, quindi, partendo dal post #35, tu hai due costanti
Code: [Select]

const char NET_SSID[20] = "TIM-12345678";
const char NET_PWD[20] = "123456";

//o sarebbe meglio

#define NET_SSID "TIM-12345678"
#define NET_PWD "123456"


e devi ottenere una nuova stringa (cmd) che contiene

Code: [Select]

char cmd[80]; //->AT+CWJAP="TIM-12345678","123456"


Prova a concatenare e posta il codice

Federico



"La logica vi porterà da A a B. L'immaginazione vi porterà dappertutto." A. Einstein

simosere

#48
Feb 17, 2020, 01:28 pm Last Edit: Feb 17, 2020, 01:29 pm by simosere
Ciao Federico,

grazie sei stato molto gentile.

ok stasera provo quanto mi hai consigliato  e ti faccio sapere.


per codice intendi quello con cui comunico con l'esp? oppure tutto il codice completo?


al momento su questo pc ho solo il codice del controllo remoto:


Code: [Select]
void controllo() {

  Serial.begin(9600);

  esp8266.begin(115200);

 

  String SSIDstring = ("\"TIM-31791139\"");

  String PASSstring = ("\"123456\"");



  String result;

  result = sendData("AT+CWJAP=" + SSIDstring + "," + PASSstring + "\r\n", 10000, true);


  if ((result.indexOf("OK") > 0) || (result.indexOf(" OK") > 0) || (result.indexOf("OK ") > 0)) {

    Serial.println(F("CONNESSO"));

    statoconnessione = 1;

  }

  else {

    Serial.println(F("NON CONNESSO"));

    statoconnessione = 0;

  }

}




Code: [Select]
void verificawifi() {

  Serial.begin(9600);

  esp8266.begin(115200);

  // WiFi instellingen SSID en wachtwoord.

  String SSIDstring = ("\"TIM-31791139\"");

  String PASSstring = ("\"123456\"");



  sendData("AT+RST\r\n", 500, true);


  sendData("AT+CWMODE=1\r\n", 500, true);

  controllo();

  

  sendData("AT+CIPSTATUS\r\n", 4000, true);


  sendData("AT+CIPMUX=1\r\n", 4000, true);

  
  sendData("AT+CIPSERVER=1,80\r\n", 4000, true);

  sendData("AT+CIFSR\r\n", 4000, true);

  Rotations = 0;

  startingTimewifi = millis();

}




e poi il controllo da remoto:


Code: [Select]
if (esp8266.available()) { // Controleer op de ESP een bericht stuurt.

    if (esp8266.find("+IPD,")) {

      delay(1000);

      int connectionId = esp8266.read() - 48; // Haal er 48 van af, want de "read()" functie geeft een ASCII decimaal waaarde en 0 terug (het eerste decimale nummer begint op 48)

      // ----- WEBPAGINA -----

      String Webpagina = "P:" + String(valorestatopioggia) + "\r\n";

      String two = "V:" + String(Rotations) + "\r\n";

      String three = "A-C:" + String(attivaz_chiusuraGRANDESX) + "," + String(attivaz_chiusuraGRANDECENTRO) + "," + String(attivaz_chiusuraPICCOLA) + "\r\n";

      String four = "TSX:" + String((TIMEOUTGRANDESX / 60000) - (millis() - startingTimeGRANDESX) / 60000) + "\r\n";

      String five = "\r\n";

      String six = "TCE:" + String((TIMEOUTGRANDECENTRO / 60000) - (millis() - startingTimeGRANDECENTRO) / 60000) + "\r\n";

      String seven = "\r\n";

      String eight = "TPI:" + String((TIMEOUTPICCOLA / 60000) - (millis() - startingTimePICCOLA) / 60000) + "\r\n";

      String nine = "\r\n";

      String ten = "T:" + String(Tpercepita8, 2) + "\r\n";

      String eleven = "A-D:" + String(stato_pulsanteSX) + "," + String(stato_pulsanteCENTRO) + "," + String(stato_pulsantePICCOLA) + "\r\n";

      String twelve = "P:" + String(stapiovendo) + "\r\n";

      // ----- WEBPAGINA -----

      sendData("AT+CIPSEND=" + String(connectionId) + "," + Webpagina.length() + "\r\n", 500, true);

      sendData(Webpagina, 1000, true); // Stuur de webpagina door.

      sendData("AT+CIPSEND=" + String(connectionId) + "," + two.length() + "\r\n", 500, true);

      sendData(two, 1000, true); // Stuur de webpagina door.

      sendData("AT+CIPSEND=" + String(connectionId) + "," + three.length() + "\r\n", 500, true);

      sendData(three, 1000, true); // Stuur de webpagina door.

      if (((millis() - startingTimeGRANDESX) / 60000) < (TIMEOUTGRANDESX / 60000)) {

        sendData("AT+CIPSEND=" + String(connectionId) + "," + four.length() + "\r\n", 500, true);

        sendData(four, 1000, true); // Stuur de webpagina door.

      }

      else

      {

        sendData("AT+CIPSEND=" + String(connectionId) + "," + five.length() + "\r\n", 500, true);

        sendData(five, 1000, true); // Stuur de webpagina door.

      }

      if (((millis() - startingTimeGRANDECENTRO) / 60000) < (TIMEOUTGRANDECENTRO / 60000)) {

        sendData("AT+CIPSEND=" + String(connectionId) + "," + six.length() + "\r\n", 500, true);

        sendData(six, 1000, true); // Stuur de webpagina door.

      }

      else

      {

        sendData("AT+CIPSEND=" + String(connectionId) + "," + five.length() + "\r\n", 500, true);

        sendData(five, 1000, true); // Stuur de webpagina door.

      }

      if (((millis() - startingTimePICCOLA) / 60000) < (TIMEOUTPICCOLA / 60000)) {

        sendData("AT+CIPSEND=" + String(connectionId) + "," + eight.length() + "\r\n", 500, true);

        sendData(eight, 1000, true); // Stuur de webpagina door.

      }

      else

      {

        sendData("AT+CIPSEND=" + String(connectionId) + "," + five.length() + "\r\n", 500, true);

        sendData(five, 1000, true); // Stuur de webpagina door.

      }

      sendData("AT+CIPSEND=" + String(connectionId) + "," + ten.length() + "\r\n", 500, true);

      sendData(ten, 1000, true); // Stuur de webpagina door.

      sendData("AT+CIPSEND=" + String(connectionId) + "," + eleven.length() + "\r\n", 500, true);

      sendData(eleven, 1000, true); // Stuur de webpagina door.

      sendData("AT+CIPSEND=" + String(connectionId) + "," + twelve.length() + "\r\n", 500, true);

      sendData(twelve, 1000, true); // Stuur de webpagina door.

      sendData("AT+CIPCLOSE=" + String(connectionId) + "\r\n", 1000, true); // Sluit de connectie.

      Rotations = 0;

    }

  }



come vedi un casino di string a cui vorrei porre rimedio ed è il motivo per il quale sto imparando a usare le stringhe classiche...

Federico66

per codice intendi quello con cui comunico con l'esp? oppure tutto il codice completo?
Mi sono spiegato male, per il momento lascia stare il tuo programma attuale.
Hai detto che vuoi usare le stringhe C, quindi ti ho dato un semplice esercizio, propedeutico alla riscrittura del tuo programma.

Federico
"La logica vi porterà da A a B. L'immaginazione vi porterà dappertutto." A. Einstein

simosere

ok...ora ho capito. faccio i compiti e ti posto il tutto!!! hahahaha :)

grazie

Federico66

ok...ora ho capito. faccio i compiti e ti posto il tutto!!! hahahaha :)
In questo forum sono l'ultimo che può insegnare il C/C++ (lo uso da poco), ma conosco molti altri linguaggi, e ti assicuro che l'unico modo per acquisire dimestichezza con un nuovo linguaggio, è fare esercizi semplici, magari seguendo gli esempi banali di un reference.

A tal proposito, per le stringhe, ti consiglio di far riferimento a questa pagina, ed in particolare, per il momento, a queste funzioni: strcpy e strncpy, strcat e strncat, strcmp e strncmp; e per l'utilizzo, valuta anche la differenza tra quelle con nome simile ;)

Federico
"La logica vi porterà da A a B. L'immaginazione vi porterà dappertutto." A. Einstein

simosere

grazie federico del consiglio:

intanto ti posto il codice:

Code: [Select]
char cmd[80]; //->AT+CWJAP=" NET_SSID "," NET_PWD "
  strcpy (cmd, "AT+CWJAP=");
  strcat (cmd, " NET_SSID ");
  strcat (cmd, ",");
  strcat (cmd, " NET_PWD ");
  Serial.print(cmd);
}


sembra andare, mi ha fatto connettere l'ESP... però se mi affidavo all'esempio sotto non funzionava invece...

Code: [Select]
char str[80];
  strcpy (str,"these ");
  strcat (str,"strings ");
  strcat (str,"are ");
  strcat (str,"concatenated.");
  puts (str);
  return 0;
}

Federico66

intanto ti posto il codice:
Non so come tu sia riuscito a connetterti!

Quello che hai scritto, produce questa stringa
Code: [Select]

AT+CWJAP= NET_SSID , NET_PWD

tu devi produrre questa
Code: [Select]

AT+CWJAP="tuo ssid","tua pwd"

Lascia stare ESP, usa solo Arduino e stampa sul monitor seriale.

NET_SSID e NET_PWD sono variabili (costanti) se le metti tra gli apici, non usi il loro valore.

Federico

PS
Non puoi usare puts in Arduino!
"La logica vi porterà da A a B. L'immaginazione vi porterà dappertutto." A. Einstein

simosere

#54
Feb 17, 2020, 08:14 pm Last Edit: Feb 17, 2020, 08:42 pm by simosere
ok grazie del chiarimento:

questo il codice completo:

Code: [Select]
#include <Wire.h>

#include <SoftwareSerial.h>

SoftwareSerial esp8266(11, 12); // RX, TX


void setup() {
  Serial.begin(9600);
  esp8266.begin(115200); // Start de software monitor op 9600 baud.



#define NET_SSID "TIM-12345678";

#define NET_PWD  "123456";

  char cmd[80]; //->AT+CWJAP=" NET_SSID "," NET_PWD "
  strcpy (cmd, "AT+CWJAP=");
  strcat (cmd, " NET_SSID ");
  strcat (cmd, ",");
  strcat (cmd, " NET_PWD ");
  Serial.print(cmd);
}



void loop() {
  // put your main code here, to run repeatedly:

}


EDIT ho riprovato e funziona....

simosere

#55
Feb 17, 2020, 08:46 pm Last Edit: Feb 17, 2020, 08:47 pm by simosere
ho corretto come mi hai consigliato:

Code: [Select]
#define NET_SSID "TIM-12345678"

#define NET_PWD  "123456"

void setup() {
 Serial.begin(9600);




 char cmd[80]; //->AT+CWJAP=" NET_SSID "," NET_PWD "
 strcpy (cmd, "AT+CWJAP=");
 strcat (cmd, NET_SSID);
 strcat (cmd, ",");
 strcat (cmd, NET_PWD);
 Serial.print(cmd);
}



void loop() {
 // put your main code here, to run repeatedly:

}

Federico66

#56
Feb 18, 2020, 09:29 am Last Edit: Feb 18, 2020, 09:31 am by Federico66
>>@Guglielmo il thread ha preso una altro indirizzo, se lo ritieni necessario splittalo


>>@simosere
ho corretto come mi hai consigliato:
Per favore, almeno quando posti il codice, elimina tutte le righe bianche, sono inutili e rendono meno leggibile il tutto. Grazie

Bene, ma adesso ottieni
Code: [Select]
AT+CWJAP=TIM-12345678,123456
ma, come specificato in questo reference, ssid e pwd devono essere racchiusi tra i doppi apici, cioè
Code: [Select]
AT+CWJAP="TIM-12345678","123456"
quindi, come ti ha già spiegato @Guglielmo
...ci metti davanti il carattere speciale \ per cui \" significa metti nella stringa il carattere "
quindi, per inserire un doppio apice all'interno di una stringa racchiusa tra doppi apici, devi anteporre un backslash (carattere di escape), cioè \".

Nota: il carattere di escape (\) serve a modificare il significato del carattere seguente o per creare caratteri speciali (\n, \r), nel nostro caso serve ad indicare che il doppio apice seguente non è un delimitatore di stringa, ma un carattere nella stringa, cioè "\"ABC\"" produce "ABC".

Non solo, come specificato nel reference
Code: [Select]
ESP8266 expects <CR><LF> or CarriageReturn and LineFeed at the end of each command, but just<CR> seems to work too.

Quindi vanno aggiunti anche i caratteri \r\n

Tornando a noi, quindi diventa, (lo modifico io, ma spero sia chiaro)

Code: [Select]
#define NET_SSID "TIM-12345678"
#define NET_PWD "123456"

void setup() {
  Serial.begin(9600);

  char cmd[80];
  strcpy(cmd, "AT+CWJAP=\"");
  strcat(cmd, NET_SSID);
  strcat(cmd, "\",\"");
  strcat(cmd, NET_PWD);
  strcat(cmd, "\"\r\n");
  //Uso print e non println in quanto il line feed è inserito nella stringa
  Serial.print(cmd); //-> AT+CWJAP="TIM-12345678","123456"
}

void loop() {}


Bene, adesso questa stringa va inviata a ESP8266, quindi il programma va modificato per
1. inviare cmd a ESP utilizzando SoftwareSerial
2. leggere la risposta di ESP
3. valutare se la risposta è positiva (o negativa) per decidere i comandi successivi
4. per fare un buon lavoro, probabilmente bisognerà gestire anche un timeout, cioè attendere una risposta da ESP per un determinato periodo, e se la risposta non arriva, smettiamo di aspettare e la consideriamo negativa.
5. infine, creare una funzione che accetta un stringa di comando, e restituisce la relativa risposta

Per iniziare, ti consiglio di soffermarti solo sui primi due punti
(un passo alla volta, senza fretta, ti permette di capire)

Buona programmazione :)
Federico

PS
Se qualcuno ha qualcosa da aggiungere, lo faccia tranquillamente, io non mi offendo ;)
"La logica vi porterà da A a B. L'immaginazione vi porterà dappertutto." A. Einstein

simosere

grazie Federico per l'aiuto.

1. inviare cmd a ESP utilizzando SoftwareSerial

ok stasera se riesco modifico il codice e lo posto



2. leggere la risposta di ESP

dovrebbe essere automatica se l'ESP riceve il comando e tutto funziona

3. valutare se la risposta è positiva (o negativa) per decidere i comandi successivi

qui in funzione di cosa risponde L'esp dovrebbe essere cosi:

if(esp8266.find("OK") >= 0) {



Federico66

2. leggere la risposta di ESP
dovrebbe essere automatica se l'ESP riceve il comando e tutto funziona
3. valutare se la risposta è positiva (o negativa) per decidere i comandi successivi
qui in funzione di cosa risponde L'esp dovrebbe essere cosi:
if(esp8266.find("OK") >= 0) {
Troppo facile ;)
Può essere vero se il comando è di esecuzione/settaggio, ma sicuramente non lo è se il comando è interrogativo!

Comunque, procedi pure, poi valuti se ricavare le risposte dell'esp.

Federico

"La logica vi porterà da A a B. L'immaginazione vi porterà dappertutto." A. Einstein

simosere

allora:

Code: [Select]
#define NET_SSID "TIM-12345678"
#define NET_PWD "123456"
#include <SoftwareSerial.h>
SoftwareSerial esp8266(11, 12); // RX, TX
#include <Wire.h>

void setup() {
  Serial.begin(9600);
  esp8266.begin(115200);
  char cmd[80];
  strcpy(cmd, "AT+CWJAP=\"");
  strcat(cmd, NET_SSID);
  strcat(cmd, "\",\"");
  strcat(cmd, NET_PWD);
  strcat(cmd, "\"\r\n");
  //Uso print e non println in quanto il line feed è inserito nella stringa
  Serial.print(cmd); //-> AT+CWJAP="TIM-12345678","123456"
}

void loop() {}



ho aggiunto la parte della ESP... per avere una risposta da ESP stavo provando a mettere questo per poi interpretarne la risposta... ma la stampa su seriale c'è, ma non mi ocnpare l'ok.... dove sto sbagliantdo:

Code: [Select]
char uno[10];
  strcpy(uno, "AT+RST");
  strcat(uno, "\r\n");
  Serial.print(uno);

Go Up