tengo un proyecto de domotica que usa módulos rf para comunicarse. desde la pc envió parámetros que los arduinos leen y luego actúan sobre esos datos. esa parte funciona perfecto, el problema es cuando los arduinos envían datos a la pc.
al enviar datos de la pc al arduino lo envio de esta forma:
nombre-accion-encender-nombredelpin
ej
cocina-acc-onn-id13
el arduino lee y si ese arduino se llama cocina actúa encendiendo el pin 13
otro parámetro es:
cocina-inf-pin-temp
y es aquí donde esta el problema, ya que el arduino lee y si es cocina actúa devolviendo la temperatura
28.7-T
pero los demás arduinos también leen estos datos y se quedan esperando para llenar la variable parámetro (longitud de 20 caracteres)
entonces nunca actúa bien, alguna duda como solucionarlo?
Creo que deberías refinar un poco tu protocolo de comunicación. Por ejemplo; si cuando el pc manda algo al arduino lo "nombra" en primer lugar, ¿por qué cuando un arduino responde al pc no comienzas nombrándolo y así los demás descartan el mensaje?
esta bien es un buen punto, pero el problema radica en llenar el espacio que dejan las variables, ya q si no hay 20 caracteres en el buffer no se llena la variable y no hace nada
Cuando el arduino contesta, puede devolver la temperatura incluyendo antes un destinatario, como por ejemplo "PC".
De igual manera que los arduinos saben si la pregunta iba para ellos y solo contesta "cocina", de esta manera deben de discriminar y no hacer nada pues el mensaje no es para ellos.
Si no vas a enviar datos de un tamaño igual siempre, ¿Por qué usas la longitud como separador de comandos?
Yo lo que haría sería definir un caracter de inicio de comando y uno de separador de parámetros, y:
Desechar lo recibido, hasta recibir el caracter de inicio de comando (p. ej. \n).
Leer secuencialmente hasta encontrar el caracter separador (por tus comandos podría ser el guión).
Comparo lo recibido, desechando el guión, con mi id de dispositivo.
Si es mi id de dispositivo, leo hasta el siguiente guión y tendré el primer parámetro, leo hasta el segundo, y tendré el siguiente parámetro, y así sucesivamente.
Si no era para mí, vuelvo al punto 1. El caracter de inicio de comando, deberá hacer saltar el código en cualquer momento al punto 2 (así, si por ejemplo no se recibio bien algo, al menos saldrá del bucle cuando comience un nuevo comando