Tratar cadena recibida mediante RF (VirtualWire)

Hola.

Mi duda es que no sé tratar la cadena que recibo desde el transmisor. El código del receptor es éste:

void loop()
{
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;
    
    if (vw_get_message(buf, &buflen)) // Non-blocking
    {
	int i;

        digitalWrite(13, true); // Flash a light to show received good message
	// Message with a good checksum received, dump it.
	Serial.print("Recibido: ");

	for (i = 0; i < buflen; i++)
	{
	    Serial.print(buf[i], BYTE);
	}
        Serial.println("");
        digitalWrite(13, false);
    }
}

Uploaded with ImageShack.us

Necesitaría tratar la cadena para que dependiendo de la frase que reciba controlar distintos servos.

El buf[ i ] que recibes es una String, investiga un poco haber como puedes tratarla para tener solo el valor que quieres. Revisa los ejemplos de Strings del IDE de arduino.

Un saludo.

Necesito toda la cadena completa.

crea variables con los comandos que recibas por ejemplo char comando[]="Izquierda"

luego compara cada uno de los caracteres de ambas cadenas en pseudocodigo

i desde 0 a longitud_de_comando{
si comando[i] == recivido[i] incrementa contador}
si contador == longitud_de_comando entonces has recivido el comando correcto

recomendaciones.

por que envias una cadena ? envía tan solo un caracter, es decir, U para arriba, D para abajo, L para izquirda y Rpara derecha por ejemplo, asi solo tienes que comparar un caracter y no una cadena y con un swich lo tienes solucionado

un saludo

edito pues me he dado cuenta que no salia todo lo que escribia. saludos

No se que querras hacer, pero te recomendaria que armes un "protocolo" claro con palabras de tamaño fijo. De esta forma lees por ejemplo solo 5 bytes (Si definis el tamaño del protocolo en 5), y actuar al respecto. Luego los próximos 5 bytes, y asi sucesivamente.

La otra forma de hacerlo, si es que no tenes forma de coordinar la comunicación, es enviar toda la información pertinente, y luego separarlos, para trabajar con ellos. ¿Quieres hacer esto?

Bueno.. Primer consejo, tene cuidado con el uso de la memoria. ;) Luego, la forma de lograrlo es intercalar entre palabra y palabra útil un carácter conocido, CONOCIDO!, pero que nunca vallas a encontrar dentro de las palabras. Bueno. Luego podes separar lo resibido por el puerto serial buscando ese caracter conocido dentro de tu string.

Hay diferentes formas de separarlos, pero recomendaria la funcion strtok, que es estandar y esta en AVR lib-c. Los interpretes de gcode hace esto por ejemplo.

Basicamente, le pasas el string a separar, y el caracter delimitador, y te devuelve un array con las palabras separadas.

strtok lib-c doc: http://www.nongnu.org/avr-libc/user-manual/group__avr__string.html#ga6ace85338eafe22a0ff52c00eb9779b8 EJemplo interprete gcode: http://code.google.com/p/rsteppercontroller/source/browse/trunk/parser.pde?r=7 Avr freaks tiene un buen ejemplo ahi: http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=79220

A todo esto.. no se si te diste cuenta, pero entre palabra y palabra ya estas recibiendo un caracter conocido, que es el caracter de fin de linea. '\n' ;)

Saludos. Matias.

No importa de cuánto sea el tamaño del array, sigo sin poder hacer nada más que presentarlo por pantalla. Mi problema es que no sé cómo coger eso que recibo y compararlo con otras cadenas, para imprimirlo bien, pero compararlo me da fallos.

Edito: No importa, trataré de enviar un solo carácter porque así sí que me deja comparar. Yo intentaba mandar la cadena de caracteres para que quede más legible las órdenes código.

te he dicho como hacerlo, un for para recorrer el array y comparar char a char , si la suma de las comparaciones buenas = longitud del arrray es que todos los caracteres son iguales. de esta manera lo sabes

queda implementarlo en codigo que opor cierto en los ejemplos dekl IDE vienen un saludo

mmm.. ¿El problema es q no sabes como comparar los string?

Lo que te dice SrDonGato es correcto, pero si no tienes claro el concepto de una "cadena de caracteres" puede complicarte.

Podes usar eso (Aunque es una manganeta de arduino): http://arduino.cc/en/Tutorial/StringComparisonOperators O el clasico strcmp de C: http://www.nongnu.org/avr-libc/user-manual/group__avr__string.html#ga46f3cbd2de457c0fb340a1f379fc33ba

Saludos.

Hola, ¿Tienes una lista de las posibles frases que se puedan recibir? char frase1[] = "primera frase"; char frase2[] = "segunda frase";

Para evitar sorpresas de cadenas inacabadas, yo primero haría: buf[buflen] = '\0';

Y luego ir comparando: if(strcmp(buf, frase1) == 0) { // ... } else if(strcmp(buf, frase2) == 0)) { // ... }