Pregunta:
El envío de estructuras grandes a través de nrf24l01 conduce al recorte de algunos miembros de estructuras
user241281
2015-02-08 16:41:12 UTC
view on stackexchange narkive permalink

Comencé con la construcción de las sondas inalámbricas temp / hygro / otros valores. Utilizo 2 arduinos, ambos con transceptores inalámbricos nf24l01 +, la biblioteca utilizada es rf24.h ( https://github.com/maniacbug/RF24). Básicamente, la prueba de ping / pong funciona para mí, por lo que cada arduino se comunica correctamente a través de nrf24l01 +. Agregué el sensor de temperatura dht22 y solo para probar comencé con la estructura de envío:

  typedef struct {int A; // solo contrarresta para ver si recibe nuevos datos flotante B; // temperatura} datos; carga útil de datos;  

Lo envío desde Arduino1 así:

  radio.write (&payload, sizeof (payload)); 

Otro Arduino2 recibe la carga útil:

  radio.read (&payload, sizeof (carga útil));  

Esto funciona perfectamente y puedo imprimir el valor del contador así como el valor de la temperatura en la pantalla OLED o Arduino2. El problema es cuando agrego float C a la estructura para enviar / recibir valores de higrómetro. Entonces Arduino2 no recibe / muestra ningún valor de higro válido, pero solo hay un valor de 0.00.

Creo que sé dónde está mi problema - nrf24.h tiene la posibilidad de establecer el tamaño de carga útil para nrf24l01 + - ambos Arduinos tienen que usar el mismo tamaño de carga útil (el valor predeterminado es 16, el mínimo es 8, el máximo es 32). Yo uso 8, ya que este parece ser el valor más confiable cuando se usan distancias más grandes entre Arduinos. Cuando intenté establecer el tamaño de carga útil en 32 en ambos Arduinos:

  radio.setPayloadSize (32); 

Entonces funciona y puedo recibir y mostrar los valores de contador, temperatura e higro. Así que parece que el nrf24l01 + envía una carga útil de 8 o 32 bytes y al enviar una estructura con INT, FLOAT, FLOAT: 8 bytes no son suficientes y se necesitan 32 bytes de carga útil. Pero cuando usaré muchos otros valores, también puedo alcanzar el límite de carga útil de 32 bytes.

No tengo muchas habilidades en programación en C y tampoco entiendo completamente cómo se transfieren los paquetes de datos entre los módulos nrf24l01 +; tal vez solo necesito adaptar mi código de envío / recepción para manejar el envío de estructuras más grandes. Quizás alguien pueda darme una pista.

Parece que ha respondido a su propia pregunta: el tamaño de la carga útil es la clave; no puede transmitir paquetes más grandes que el tamaño de la carga útil. Si sus paquetes superan el tamaño máximo de 32 bytes, tendrá que dividirlos en paquetes más pequeños y transmitirlos uno por uno.
Pensé que el nrf24 se encargaría y si envío más del tamaño de carga útil, lo enviará pieza por pieza hasta que se envíen todos los datos. Y luego el lado receptor lo recibirá pieza por pieza hasta que esté completo. ¿Así que de ninguna manera? ¿Tengo que dividir los datos manualmente en varias "partes" y luego enviar más veces?
Ok, claro. Lo encontré explicado aquí también -http: //arduino.stackexchange.com/questions/8185/increasing-payload-size-above-32-bytes-using-nrf24l01
correcto, debes dividirlo
Dos respuestas:
Avamander
2015-08-18 04:10:37 UTC
view on stackexchange narkive permalink

Tu carga útil es demasiado grande. Tendrá que dividirlo en partes más pequeñas.

NOTA: Si usa una biblioteca como RF24Mesh, no tendrá que preocuparse por ello.

user15574
2015-12-14 15:17:27 UTC
view on stackexchange narkive permalink

como se indicó anteriormente, todo tiene que ver con el tamaño de su carga útil. Para aclarar las cosas, debe tener en cuenta cuántos bytes usa / necesita un determinado tipo de datos:

char: 1 byteint: 2 bytesfloat 4 bytes

(lo anterior se basa en el Referencia de Arduino, consulte https://www.arduino.cc/en/Reference/Float)

Por lo tanto, si establece el tamaño de carga útil en 8 bytes en el NRF24L01 y luego intenta para enviar una estructura con int, float, float, tendrá 2 + 4 + 4 = 10 bytes, que no se ajusta al tamaño de la carga útil.



Esta pregunta y respuesta fue traducida automáticamente del idioma inglés.El contenido original está disponible en stackexchange, a quien agradecemos la licencia cc by-sa 3.0 bajo la que se distribuye.
Loading...