Extracción de entradas de una cadena en Arduino

1

Estoy intentando extraer entradas de una cadena en un Arduino.

Estoy usando Esta biblioteca DCF77 (.zip) y obtengo una fecha y hora en este formato:

  

DCF77DATA 2012012531819CET

Esto traduce ito

  

DCF77DATA YYYYMMDDwhhmmTZ

con Y, M, D siendo la fecha, w el día de la semana yh y m son la hora. Esto siempre se genera en el minuto completo, por lo que se puede esperar que los segundos sean 0.

He estado intentando varias formas de obtener las horas y los minutos (la fecha no me concierne en este momento) y ponerlos en variables int. El último método que probé se ve así:

  const char *v = dcf77.getDateTime();
  if (strcmp (v,"DCF77POLL") != 0) {
    Serial.println(v);
    String time = String(v);
    // DCF77DATA 2012012531819CET
    char h_str[3];
    time.substring(19,20).toCharArray(h_str, 2);
    Serial.print("H: ");
    Serial.println(h_str);
    char m_str[2];
    time.substring(21,23).toCharArray(m_str, 2);
    Serial.print("M: ");
    Serial.println(m_str);

    int hours = atoi(h_str);
    int minutes = atoi(m_str);
  }

Esto produce un resultado interesante ... Obtengo el primer número del tiempo. Cuando son "23" minutos, obtengo "2", de ahí el h_str [3]. Pensé que estaba relacionado con la cadena terminada en 0, pero no ayudó. Lo mismo para la hora.

Además, cuando trato de imprimir el int no obtengo ningún resultado en la consola serie, parece que el programa simplemente se detiene.

    
pregunta Gerald Schneider

1 respuesta

1

Para su información, una pregunta sobre el análisis de cadenas es más adecuada para el desbordamiento de pila. Pero lo intentaré de todos modos.

No me queda claro dónde comienza la hora en esa cadena, ¿es 1819CET ? ¿Dónde 18 es la hora en formato de 24 horas y 19 minutos? ¿Por qué hay un 3 después de la fecha? Asumiré que 1819CET es la hora aquí en el formato HHMM {TIMEZONE} ya que ha indicado que el índice de inicio es 19 en su código, ya que 18 habría caído en el 3 en la cadena.

No estoy familiarizado con la biblioteca arduino, así que primero leeré su documentación. Al hacerlo se revela lo siguiente. Un extracto de aquí: enlace

  

Obtener una subcadena de una cadena. El índice de inicio es inclusivo (el   el carácter correspondiente se incluye en la subcadena), pero el   El índice de finalización opcional es exclusivo (el carácter correspondiente no es   incluido en la subcadena). Si se omite el índice final, el   La subcadena continúa hasta el final de la cadena.

Esto:

time.substring(19,20)

No incluirá el índice 20 . Solo devolverá una cadena de 1 carácter.

Para estar seguro, intente estos tamaños para sus matrices de caracteres: char h_str[3]; y char m_str[3];

Y trata de llamar así:

char h_str[3];
char m_str[3];
time.substring(19,21).toCharArray(h_str, sizeof(h_str));
time.substring(21,24).toCharArray(m_str, sizeof(m_str));

Estoy usando sizeof() aquí porque toCharArray() solicita el tamaño del búfer que se pasa como se especifica aquí .

    
respondido por el Jon L

Lea otras preguntas en las etiquetas