Trabajando con cadenas de texto Arduino. Objeto String en Arduino y comandos vía puerto serie. comillas simples o dobles

Las cadenas de texto se pueden declarar de dos maneras: puedes usar el tipo cadena de datos, que se incluye en el kernel desde la versión 0019; o declarar la cadena como una matriz de caracteres terminada en nulo. Esta página describe el segundo método. para obtener más información detallada sobre el objeto String que proporciona más posibilidades a costa de un mayor consumo de memoria, consulte la página Cadena - objeto.

Ejemplos

A continuación se muestran ejemplos de declaraciones de cadenas correctas.

Char Str1; char Str2 = ("a", "r", "d", "u", "i", "n", "o"); char Str3 = ("a", "r", "d", "u", "i", "n", "o", " char Str1; char Str2 = ("a", "r", "d ", "u", "i", "n", "o"); char Str3 = ("a", "r", "d", "u", "i", "n", "o" , "\0"); char Str4 = "arduino"; char Str5 = "arduino"; char Str6 = "arduino"); char Str4 = "arduino"; char Str5 = "arduino"; char Str6 = "arduino";

Operaciones permitidas al declarar cadenas

  • Declarar una matriz de caracteres sin inicializarla (Str1)
  • Declare una matriz de caracteres con un elemento redundante, el propio compilador agregará el carácter nulo requerido (Str2)
  • Agregar carácter nulo explícitamente (Str3)
  • Inicialice la matriz con constante de cadena, entre comillas; el compilador creará una matriz del tamaño requerido con un carácter nulo al final (Str4)
  • Inicialice una matriz usando una constante de cadena, especificando explícitamente su tamaño (Str5)
  • Inicialice una matriz de gran tamaño, dejando espacio para cadenas más largas (Str6)

Carácter de terminación nula

Normalmente, todas las cadenas terminan con un carácter nulo (código ASCII 0), que permite funciones (como Serie.imprimir()) determinan la longitud de la cuerda. Sin este símbolo, continuarían leyendo secuencialmente bytes de memoria que en realidad ya no serían parte de la cadena.

Básicamente, esto significa que la longitud de su cadena debe ser 1 carácter más larga que el texto que desea almacenar en ella. Esta es la razón por la que Str2 y Str5 deben tener 8 caracteres, aunque la palabra "arduino" solo ocupa 7; la última posición se llena automáticamente con un carácter nulo. El tamaño de Str4 se convertirá automáticamente en 8: se requiere un carácter para el carácter nulo de terminación. En la cadena Str3, nosotros mismos especificamos el carácter nulo (indicado por "\0").

Tenga en cuenta que generalmente es posible declarar una cadena sin un carácter nulo final (por ejemplo, si establece la longitud de Str2 en 7 en lugar de 8). Sin embargo, esto interrumpirá la mayoría de las funciones de cadena, por lo que no debes hacerlo intencionalmente. Este error puede ser la causa. comportamiento extraño o la aparición de caracteres de terceros al trabajar con cadenas.

¿Comillas simples o dobles?

Las cadenas siempre se declaran entre comillas dobles ("Abc") y los caracteres siempre se declaran entre comillas dobles ("Abc"). comillas simples("A").

Envolviendo largas colas

Las líneas largas se pueden envolver así:

Char myString = "Esta es la primera línea" " esta es la segunda línea" "etcétera";

Matrices de cadenas

Al trabajar con grandes volúmenes texto (por ejemplo, en proyectos que trabajan con una pantalla LCD), a menudo es conveniente utilizar matrices de cadenas. Dado que las cadenas son en sí mismas matrices, este es efectivamente un ejemplo de una matriz bidimensional.

En el siguiente programa hay un asterisco después de la indicación del tipo carácter de datos"char*" indica que la variable es una matriz de "punteros". Todos los nombres de matrices son en realidad punteros, por lo que se necesita el asterisco para crear una matriz de matrices. Los punteros en C son una de las cosas más difíciles para los principiantes, pero en en este caso comprensión profunda de los consejos para su uso efectivo no es necesario en absoluto.

Ejemplo

char* myStrings=("Esta es la cadena 1", "Esta es la cadena 2", "Esta es la cadena 3", "Esta es la cadena 4", "Esta es la cadena 5", "Esta es la cadena 6"); configuración vacía())( Serial.begin(9600); ) bucle vacío())( para (int i = 0; i< 6; i++){ Serial.println(myStrings[i]); delay(500); } }

¡Buen día! Seguimos dominando la placa Ardiuno Uno. En el último artículo aprendimos cómo generar mensajes de información en la pantalla de su computadora/portátil.

Si recuerdas, tú y yo todavía tenemos asuntos pendientes. Es decir, el método de tarea. parámetros de entrada funciones De serie. imprimir() yDe serie. imprimirln(). Configuramos los parámetros de estas funciones directamente en las líneas donde fueron llamadas, en lugar de configurar parámetros a través de variables.

Primero, volvamos a montar el circuito con dos LED. Después de lo cual abrimos el programa que escribimos en la lección 5.

Como puede ver, completé el segundo con las líneas necesarias. Espero que también hayas completado esta tarea :) Si no, expande tu programa.

No debes copiar líneas de código del texto del artículo. Por ejemplo, las comillas en un documento no pueden interpretarse como "comillas" en un programa. entorno arduino IDE. También quiero decir lo siguiente: si no pudo cargar el programa en MK en el primer intento, debe intentarlo nuevamente (varias veces).

En uno de los artículos anteriores, ya mencioné cuestiones relacionadas con el uso de . Repito. Es mucho más práctico hacer cambios en parámetros requeridos a través de cambios en los valores de las variables que se encuentran al inicio del programa o en archivo separado que recorrer en busca de valores requeridos a lo largo del código.

Hasta ahora usábamos variables que eran de tipo entero. Estos números son convenientes para contar o indicar el número de pin del microcontrolador. Además, este tipo ocupa mucha menos memoria del microcontrolador en comparación con otros tipos. Sin embargo, al leer datos de sensores (por ejemplo, un sensor de temperatura), obtendremos valores que constan de un número entero y una parte fraccionaria. Para trabajar con tales números necesitamos un tipo flotar(números de punto flotante). este tipo se describirá por separado, ahora hablemos de tipo de cadena datos Cadena .

tipo de variable Cadena los datos contenidos en comillas dobles.

vamos a anunciar variables de tipo Cadena.

  • Cadena textoLedverde = “”;
  • Cadena textoLedrojo = “”;

En el código del programa reemplazaremos mensajes de texto a nombres de variables. Como puede ver, al escribir variables como parámetros de entrada a funciones, no se necesitan comillas dobles. Pero ¿qué pasa si escribimos el nombre de una de las variables entre comillas dobles? Ahora vamos a comprobar...

Descarguemos el programa y veamos el resultado. Una línea se muestra correctamente, pero se muestra la segunda línea en lugar de información necesaria muestra el nombre de la variable. Todo se debe a las comillas dobles.

La regla es la siguiente: si desea generar una cadena directamente entre paréntesis, coloque comillas dobles; si desea generar información asignada a una variable de cadena, no coloque comillas;

Creemos una variable local "saludo" en vacíoconfiguración. ¿Por qué locales? En primer lugar, ocupa mucho menos espacio en la memoria del microcontrolador. En segundo lugar, discutimos en vano las cuestiones de las variables locales y globales: necesitamos aplicar la teoría en la práctica. ¿Por qué estamos creando un “área local” en vacíoconfiguración, y todo porque se ejecuta una sola vez.

Declaramos y asignamos un valor a una variable.

Cadenaprimero_mensaje = “Hola";

Un “hola” no será suficiente, se necesita algo más. Escribamos algo como... 🙂 y dividámoslo en dos mensajes.

  • Cadena second_message = “Soy Migalka”;
  • String tercer_message = "Quiero parpadear";

Las llamadas a funciones deben realizarse después de la línea de habilitación (inicialización) del puerto serie.

  • Serial.println(primer_mensaje);
  • Serial.println(segundo_mensaje);


Descarguemos el programa y veamos el resultado. Como estaba previsto, el saludo se muestra una vez. ¿Pero de alguna manera no es agradable estar de acuerdo? 🙂 Para que el segundo y tercer mensaje estén en la misma línea, existen varias opciones:

  • Reemplazar función println(segundo_mensaje) en Serial.print(segundo_mensaje) . Para garantizar que el tercer mensaje no se superponga con el segundo después de... “Migalka”, coloque un espacio.
  • Conecte el segundo y tercer mensaje juntos. suma_mensaje =segundo_mensaje +tercero_mensaje;

Elegimos la segunda opción. Primero declaremos una nueva variable de cadena. Cadenasuma_mensaje;

Reemplazo del nombre « segundo_ mensaje" en « suma_ mensaje". Si usted reemplazó la función De serie.imprimir(segundo_mensaje) en De serie.imprimir( segundo_mensaje), cambie todo nuevamente para que el nuevo mensaje comience en una nueva línea y la línea " Serial.println(tercer_mensaje); » eliminado por inutilidad.

Descarguemos el programa y veamos el resultado.

Las cadenas de texto se pueden declarar de dos maneras: puede usar el tipo de datos String, que se incluye en el kernel desde la versión 0019; o declarar la cadena como una matriz de caracteres terminada en nulo. Esta página describe el segundo método. Para obtener más información sobre el objeto String, que proporciona más funcionalidad a costa de más memoria, consulte la página Objeto String.

Ejemplos

A continuación se muestran ejemplos de declaraciones de cadenas correctas.

Char Str1;

Operaciones permitidas al declarar cadenas

  • Declarar una matriz de caracteres sin inicializarla (Str1)
  • Declare una matriz de caracteres con un elemento redundante, el propio compilador agregará el carácter nulo requerido (Str2)
  • Agregar carácter nulo explícitamente (Str3)
  • char Str2 = ("a", "r", "d", "u", "i", "n", "o");
  • Inicialice una matriz usando una constante de cadena, especificando explícitamente su tamaño (Str5)
  • Inicialice una matriz de gran tamaño, dejando espacio para cadenas más largas (Str6)

Carácter de terminación nula

char Str3 = ("a", "r", "d", "u", "i", "n", "o", "\0");

Básicamente, esto significa que la longitud de su cadena debe ser 1 carácter más larga que el texto que desea almacenar en ella. Esta es la razón por la que Str2 y Str5 deben tener 8 caracteres, aunque la palabra "arduino" solo ocupa 7; la última posición se llena automáticamente con un carácter nulo. El tamaño de Str4 se convertirá automáticamente en 8: se requiere un carácter para el carácter nulo de terminación. En la cadena Str3, nosotros mismos especificamos el carácter nulo (indicado por "\0").

char Str4 = "arduino";

¿Comillas simples o dobles?

Las cadenas siempre se declaran entre comillas dobles ("Abc") y los caracteres siempre se declaran entre comillas simples ("A").

Envolviendo largas colas

Las líneas largas se pueden envolver así:

Char myString = "Esta es la primera línea" " esta es la segunda línea" "etcétera";

Matrices de cadenas

Cuando se trabaja con grandes cantidades de texto (por ejemplo, en proyectos que funcionan con una pantalla LCD), suele resultar conveniente utilizar matrices de cadenas. Dado que las cadenas son en sí mismas matrices, este es efectivamente un ejemplo de una matriz bidimensional.

En el siguiente programa, el asterisco después del tipo de datos char "char*" indica que la variable es una matriz de "punteros". Todos los nombres de matrices son en realidad punteros, por lo que se necesita el asterisco para crear una matriz de matrices. Los punteros en C son una de las cosas más difíciles para los principiantes, pero en este caso, no se requiere un conocimiento profundo de los punteros para usarlos de manera efectiva.

Ejemplo

char* myStrings=("Esta es la cadena 1", "Esta es la cadena 2", "Esta es la cadena 3", "Esta es la cadena 4", "Esta es la cadena 5", "Esta es la cadena 6"); configuración vacía())( Serial.begin(9600); ) bucle vacío())( para (int i = 0; i< 6; i++){ Serial.println(myStrings[i]); delay(500); } }

¿Qué se requería? Visualización de información y procesamiento de cadenas ingresadas por el usuario. Por ejemplo:

Controlador Ethernet - bien
modo ESTÁTICO
>tiempo
2015-11-16 22:35:27

En realidad, necesitas comparar los desagües. No, primero debes dividir el texto en fragmentos con un separador (por ejemplo, un espacio), pero luego comparar las líneas. Como los comandos eran "uno, dos, y estaba mal calculado", eliminé el desglose del texto en fragmentos. Debido al error anterior clase cadena No pude usarlo, ¿cómo puedo hacerlo de otra manera? Arduino utiliza la biblioteca AVR-libc, por lo que tiene sentido recurrir a ella primero.
¿Qué tenemos?

  1. stdlib.h: funciones para la conversión mutua de números y cadenas (en ambas direcciones).
  2. string.h: funciones para trabajar con cadenas. Nuestro principal interés.
  3. stdio.h: funciones estándar de entrada/salida.

La funcionalidad no se limita a esto. Se menciona algo que está relacionado con la tarea.

No. 2 - funciones de uso conjunto de memorias para llenar o borrar el buffer, memcmp- para comparar. strcmp No lo uso porque necesito limitar explícitamente la longitud del fragmento que se compara. No. 3 - para lectura y salida de formato: sprintf, sprint_P, sscanf, sscanf_P. Funciones con sufijo _PAG difieren en que la cadena de formato se toma de la memoria del programa PROGMEM, también conocida como macro F() en bibliotecas Arduino.

Por cierto

Por cierto, si implementas completamente las funciones de entrada y salida de un solo carácter getc Y putc, entonces recibirás flujos estándar entrada, salida, errores y para trabajar con archivos, si tiene alguno. A menudo puedes arreglártelas anulando macros ponerchar() Y obtenerchar(), trabajando con entrada estándar y conclusión.

Mi comparación de cadenas se ve así:

If (memcmp(str,"statlist",8)==0) (//tu código aquí)

Quizás valga la pena mencionar que se comparan los inicios de líneas. Para buscar fragmentos puedes usar memmem.

cuerdas para C

cuerdas para C cadena, ellos son carácter *- este es un enlace al comienzo de la secuencia carbonizarse, el último de los cuales importa 0x00. Esto significa que deben colocarse en algún lugar. Por ejemplo, en una matriz. O usar malloc, calloc, gratis. Lo que te impide cometer errores significa transfiriendo la responsabilidad al programador por su ubicación y control de longitud.

Es decir, la búsqueda de un comando podría verse así:

If (memcmp(str, "statclear", 9)==0) ( memset(diario, 0, sizeof(jrn_rec_t)*JRN_REC_NUM); Serial.println(F("ok")); )si no (memcmp(str ,"lista de estadísticas", 8)==0) ( funcStatlist(); )else if (memcmp(str, "cfgshow", 7)==0) ( funcCfgShow(); )else if (memcmp(str, "timeset" , 7)==0) ( funcTimeSet(str); // configura la fecha y hora AAAA-MM-DD hh:mm:ss )else if (memcmp(str,"cfgset", 6)==0) ( funcCfgSet( str); //funcPingdel(str); si no (memcmp(str,"time", 4)==0) ( funcTime(); // imprimir fecha y hora desde RTC) si no (memcmp(str)," help", 4)==0) ( // imprime ayuda breve Serial.println(F(" helprn statlist statclearrn time timesetrn cfgshow cfgset")); )else( Serial.print(F("unknown cmd> ")); Serial.println(cadena);

momento no obvio

Los comandos o líneas de mayor longitud deben aparecer primero en el fragmento anterior. Piénsalo, ¿por qué?

"Recopilo" las líneas de la siguiente manera: leo bytes del puerto hasta que se excede la longitud de línea permitida o hasta que se encuentra uno de los caracteres de avance de línea r o n.

leer linea

Sería mejor ultimarlo... Por ahora está como está. Llamado todo el tiempo en el ring principal. Si no hay trabajo, sal lo más rápido posible y devuélvelo. FALSO. si marcaste nueva linea - verdadero.

bool readln(HardwareSerial &uart, char *outbuf) // devuelve verdadero cuando se encuentra CR, LF o ambos y si el tamaño es límite ( static char mybuf = ( 0 ); static char idx = 0; while (uart.available()) ( if (uart.peek()!= "r" && uart.peek()!= "n") ( mybuf[ idx++ ] = uart.read(); ) else (// if CR uart.read(); if ( uart.peek()=="n" || uart.peek()=="r") uart.read(); si (idx == 0) (retorno 0; ) mybuf[ idx++ ] = ""; add 0 memcpy(outbuf, mybuf, idx); // copia idx = 0; return 1; if (idx >=(SBUF_SZ-1)) ( // verifica la longitud del buffer interno mybuf[ SBUF_SZ-1 ] = " "; // agrega 0 memcpy(outbuf, mybuf, 32); // copia idx = 0;

El formato de entrada/salida también es muy útil. Por ejemplo, analizar una cadena con la fecha y hora ingresadas se ve así:

Sscanf_P(str, (const char *)F("%*s %d-%d-%d %d:%d:%d"), &y, &m, &d, &hh, &mm, &ss)

Sprintf_P(buff, (const char *)F("Su IP: %d.%d.%d.%d"), ip, ip, ip, ip);

Eso es todo. espero que alguien este material te ayudará a “deshacerte” de Arduino o simplemente escribir tus programas mejor y en menos tiempo. pero mas situación típica- evitar restricciones Alambrado.

Las cadenas de texto se pueden declarar de dos maneras: puede usar el tipo de datos String, que se incluye en el kernel desde la versión 0019; o declarar la cadena como una matriz de caracteres terminada en nulo. Esta página describe el segundo método. Para obtener más información sobre el objeto String, que proporciona más funcionalidad a costa de más memoria, consulte la página String - Objeto.

Ejemplos

A continuación se muestran ejemplos de declaraciones de cadenas correctas.

Char Str1;

char Str2 = ("a", "r", "d", "u", "i", "n", "o");

char Str3 = ("a", "r", "d", "u", "i", "n", "o", "\0");

char Str4 = "arduino";

char Str5 = "arduino";

char Str6 = "arduino";

char Str1 [15];

Operaciones permitidas al declarar cadenas

  • Declarar una matriz de caracteres sin inicializarla (Str1)
  • Declare una matriz de caracteres con un elemento redundante, el propio compilador agregará el carácter nulo requerido (Str2)
  • Agregar carácter nulo explícitamente (Str3)
  • char Str2 = ("a", "r", "d", "u", "i", "n", "o");
  • Inicialice una matriz usando una constante de cadena, especificando explícitamente su tamaño (Str5)
  • Inicialice una matriz de gran tamaño, dejando espacio para cadenas más largas (Str6)

Carácter de terminación nula

char Str3 = ("a", "r", "d", "u", "i", "n", "o", "\0");

char Str2 [8] = ("a", "r", "d", "u", "i", "n", "o");

char Str4 = "arduino";

¿Comillas simples o dobles?

char Str3 [8] = ("a", "r", "d", "u", "i", "n", "o", "\0");

Envolviendo largas colas

Las líneas largas se pueden envolver así:

char Str4 = "arduino";

char Str5 [8] = "arduino";

char Str6 [15] = "arduino";

Básicamente, esto significa que la longitud de su cadena debe ser 1 carácter más larga que el texto que desea almacenar en ella. Esta es la razón por la que Str2 y Str5 deben tener 8 caracteres, aunque la palabra "arduino" solo ocupa 7; la última posición se llena automáticamente con un carácter nulo. El tamaño de Str4 se convertirá automáticamente en 8; se requiere un carácter para el carácter nulo de terminación. En la cadena Str3, nosotros mismos especificamos el carácter nulo (indicado por '\0').

Matrices de cadenas

Las cadenas siempre se declaran entre comillas dobles ('Abc') y los caracteres siempre se declaran entre comillas simples ('A').

char myString = "Esta es la primera línea" " esta es la segunda línea" "etcétera";

Ejemplo

char* myStrings=("Esta es la cadena 1", "Esta es la cadena 2", "Esta es la cadena 3", "Esta es la cadena 4", "Esta es la cadena 5", "Esta es la cadena 6"); configuración vacía())( Serial.begin(9600); ) bucle vacío())( para (int i = 0; i< 6; i++){ Serial.println(myStrings[i]); delay(500); } }

char * myStrings = ( "Esta es la cadena 1", "Esta es la cadena 2", "Esta es la cadena 3",




Arriba