Tengo una comunicacion serial entre un Arduino mega y un Esp8266 el cual mediante un servidor NTP obtiene la hora.
El arduino mega el enviarle por comunicacion Serial1 un 2 obtiene esa variable del esp8266 que son los milisegundos desde 1970 hasta la actualidad ( epoch )
mi problema es q lo obtengo como un array a cada bit en codificacion ascii, queria saber una manera de convertir ese array a un solo numero para con el cual trabajar con TimeLib y obtener la fecha y hora actual. ej: {49, 50, 51, 52} -> 1234
void setup() {
Serial1.begin(115200);
Serial.begin(115200);
while (!Serial1) {
;
}
}
void loop() {
if (Serial.available()) {
int data = Serial.read();
if (data == 10) return; //ignorar el salto de linea \n
if ( data == 49)// si se envia un 1 por consola obtener la hora{
obtenerHora();
}
}
}
long obtenerHora() {
Serial1.print(2);
if (Serial1.available()) {
char data[Serial1.available()];
for (int i = 0; i < Serial1.available(); i++) {
data[i] = Serial1.read();
if(data[i] == 10) continue; // si el bit obtenido es \n (salto de linea) ignorar
Serial.print(data[i]);
}
}
}
int dataLen = sizeof(data)/sizeof(data[0]); // cantidad de items del array
int numero = data[0] - 48;
if(dataLen > 1) {
for(byte i = 1; i < dataLen; i++){
numero = numero * 10 + (data[i] - 48);
}
}
Serial.println(numero);
Como 48 es el código ASCII de '0', restando 48 al dígito obtienes el valor decimal que representa.
Lo demás se explica solo (creo...)
Lo está usando para conocer la cantidad de caracteres en el buffer por eso lo usa varias veces.
Lo correcto sería que lo guarde en una variable y trabaje con ésta, claramente.
Además, usarla como límite de for(), no se si es buena idea ya que se supone que available() se decrementa con cada read() y podría generar problemas.
Esa respuesta ya la sabía @anon90500195.
Le marco que es un abuso y que no hace falta 3 o mas veces usar Serial1.available()
Incluso lo que propones puede mejorarse con uno solo.
int longitud = Serial1.available();
int i = 0;
while (i < longitud) {
char data[longitud];
data[i] = Serial1.read();
Serial.print(data[i]);
i++;
}
Como dije, son enfoques. Esta bien usar 3 veces Serial.available() pues si, a quien le importa? El micro no dejará de funcionar por eso. Solo es para aprender.