Go Down

Topic: Lettura seriale con array di char (Read 1 time) previous topic - next topic

davix10

Perché un singolo byte è sufficiente per contare da 0 a 255. Puoi usare anche un int ma in questo caso è "esagerato".

Il resto è corretto.
In questo momento il mio loop() è questo:

Code: [Select]

void loop() {
  serialSIM800.write("AT\r\n");
  risposta();
}

void risposta() {
  char response[BUFLEN] = {'\0'};
  byte i = 0;
  do {
    if (serialSIM800.available()) {
      char c = serialSIM800.read();
      Serial.write(c);
      response[i++] = c;
      response[i] = '\0';
    }
  } while (i < BUFLEN - 1 && response[i] != '\r');
}


Così però funziona solo al primo giro e anche aggiungendo il comando Serial.write(response[1]); non mi stampa nessun valore.

SukkoPera

#16
Oct 06, 2016, 02:36 pm Last Edit: Oct 06, 2016, 02:36 pm by SukkoPera
Posta lo sketch intero.
Make your Sega MegaDrive/Genesis region-free with Arduino! https://goo.gl/X7zBcq

Guida rapida a ESP8266: https://goo.gl/kzh62E

davix10

Posta lo sketch intero.
Code: [Select]
#include <SoftwareSerial.h>

//SIM800 TX is connected to Arduino D8
#define SIM800_TX_PIN 8

//SIM800 RX is connected to Arduino D7
#define SIM800_RX_PIN 7

#define LED_PIN 2
#define BUFLEN 200
//Create software serial object to communicate with SIM800
SoftwareSerial serialSIM800(SIM800_TX_PIN, SIM800_RX_PIN);
char lastCharRead[16];
char firstRead;
int index;
String content = "";
String readStrings;
char string[32];
char byteRead;
char response[200];
int indexByteMessaggio;
byte inByte;
byte messaggio[] = {
  0, 0, 0, 0, 0, 0, 0, 0
};
void setup() {
  //Begin serial comunication with Arduino and Arduino IDE (Serial Monitor)
  Serial.begin(9600);
  while (!Serial);

  //Being serial communication witj Arduino and SIM800
  serialSIM800.begin(9600);
  delay(1000);
  pinMode(LED_PIN, OUTPUT);

  Serial.println("Setup Complete!");
}

void loop() {
  serialSIM800.write("AT\r\n");
  risposta();
}

void risposta() {
  char response[BUFLEN] = {'\0'};
  byte i = 0;
  do {
    if (serialSIM800.available()) {
      char c = serialSIM800.read();
      Serial.write(c);
      response[i++] = c;
      response[i] = '\0';
    }
  } while (i < BUFLEN - 1 && response[i] != '\r');
}

SukkoPera

Cosa vuol dire che "funziona solo al primo giro"?
Make your Sega MegaDrive/Genesis region-free with Arduino! https://goo.gl/X7zBcq

Guida rapida a ESP8266: https://goo.gl/kzh62E

davix10

Cosa vuol dire che "funziona solo al primo giro"?
Il ciclo while è infinito quindi non esco mai dal ciclo.

SukkoPera

Sì ok, ma il primo giro cosa succede che non succede gli altri?
Make your Sega MegaDrive/Genesis region-free with Arduino! https://goo.gl/X7zBcq

Guida rapida a ESP8266: https://goo.gl/kzh62E

davix10

Sì ok, ma il primo giro cosa succede che non succede gli altri?
Il primo giro leggo AT e OK ma poi si ferma tutto li.

SukkoPera

Prova a fargli stampare response e vedi cosa c'è dentro. Su, un po' d'inventiva :).
Make your Sega MegaDrive/Genesis region-free with Arduino! https://goo.gl/X7zBcq

Guida rapida a ESP8266: https://goo.gl/kzh62E

davix10

Guarda io ho risolto utilizzando il tempo, ovvero aspettando 3 secondi.

Code: [Select]
void risposta() {
  char response[BUFLEN] ={'\0'};
  byte i = 0;
  interval=3000;
  timeElapsed=0;
  do {
    if (serialSIM800.available()) {
      char c = serialSIM800.read();
      response[i] = c;
      i++;
      response[i] = '\0';
     
    }
  } while (timeElapsed<interval);
  for (int ii=0; ii<10; ii++)
  {
   
    Serial.print(ii);
    Serial.print(':');
    Serial.print(response[ii],DEC);
    Serial.println("");
  }
}


Non so se sia il metodo migliore ma sicuramente funziona.

SukkoPera

Se il codice è quello mi sembra difficile che funzioni (non c'è niente che incrementa timeElapsed, per cui rimarrà sempre < interval), ma... contento tu :D.
Make your Sega MegaDrive/Genesis region-free with Arduino! https://goo.gl/X7zBcq

Guida rapida a ESP8266: https://goo.gl/kzh62E

davix10

Se il codice è quello mi sembra difficile che funzioni (non c'è niente che incrementa timeElapsed, per cui rimarrà sempre < interval), ma... contento tu :D.
Ho dimenticato di mostrare che timeElapsed è inizializzato così:

elapsedMillis timeElapsed;

usando la libreria

#include <elapsedMillis.h>

Non devo incrementare perché ci pensa la libreria a incrementarlo dato che è una variabile temporale.

SukkoPera

Capito. Beh, non sono sicuro che ti sia chiaro quel che fa quel codice, comunque ripeto: se funziona come deve, va bene così!
Make your Sega MegaDrive/Genesis region-free with Arduino! https://goo.gl/X7zBcq

Guida rapida a ESP8266: https://goo.gl/kzh62E

davix10

Capito. Beh, non sono sicuro che ti sia chiaro quel che fa quel codice, comunque ripeto: se funziona come deve, va bene così!
Il codice funziona, non mi soddisfa a livello estetico ma almeno funziona.

Il codice che ho scritto non ha nessun senso dal punto di vista applicativo. mostro i caratteri in codice ascii solo perché dovevo capire cosa arrivava, ma certamente dal punto di vista applicativo non ha nessun senso.

L'unica cosa che non mi piace è dover aspettare un tempo fisso...
Però non trovavo altro modo per uscire nel caso in cui mi arrivino meno dati di quelli previsti dal buffer.

gpb01

#28
Oct 06, 2016, 04:51 pm Last Edit: Oct 06, 2016, 04:51 pm by gpb01
L'unica cosa che non mi piace è dover aspettare un tempo fisso...
Però non trovavo altro modo per uscire nel caso in cui mi arrivino meno dati di quelli previsti dal buffer.
.. devi implementare un meccanismo di timeout usando la funzione millis() e verificando il tempo passato nel ciclo di attesa dei caratteri. Se superi il tempo masimo, comunque forzi l'uscita dal ciclo.

Guglielmo
Search is Your friend ... or I am Your enemy !

davix10

.. devi implementare un meccanismo di timeout usando la funzione millis() e verificando il tempo passato nel ciclo di attesa dei caratteri. Se superi il tempo masimo, comunque forzi l'uscita dal ciclo.

Guglielmo
Ok, ma è una soluzione funzionale oppure c'è qualcosa di meglio da fare invece che basarsi sul tempo?

Go Up