El método de comunicación inalámbrica de trabajo más rápido entre dos dispositivos

Intenté hacer esta pregunta en el foro de ingeniería de redes, pero los mods allí piensan que superuser.com es un mejor lugar para eso, pero cuando publiqué allí, piensan que este es el mejor lugar para este tipo de preguntas. así que aquí va:

Estoy creando un juego en el que varios dispositivos deben comunicarse de forma inalámbrica entre sí mediante el módulo de radio HM-TRP. Las especificaciones para ese módulo se pueden encontrar aquí: http://www.hoperf.de/rf/fsk/HM-TRP.htm . Por ahora, estoy trabajando en la comunicación entre solo dos dispositivos.

Solo para estar seguro, me apegué a la velocidad predeterminada de 9600 bps y configuré ambos módulos HM-TRP para hablar con el procesador a 9600 bps y para hablar con el mundo inalámbrico a 9600 bps.

Actualmente tengo un dispositivo que transmite la secuencia correcta de caracteres a una velocidad relativamente alta con quizás un descanso de 1 microsegundo en el medio. El HM-TRP responde correctamente con una luz roja parpadeante.

Aquí es donde se pone interesante...

En el lado del receptor, cuando no quiero transmitir, parece reconocer la señal remota a través de una luz verde parpadeante; sin embargo, cuando intento recibir datos y luego, un microsegundo después de procesar el byte completo, intento transmitir datos. , noté el HM-TRP solo en modo de transmisión (la luz roja parpadea, pero la luz verde no). Una vez que dejé de transmitir, la luz verde parpadea de nuevo.

Esto me hace pensar que necesito inventar un mejor protocolo para evitar colisiones, pero al mismo tiempo no quiero que la velocidad de comunicación sea demasiado lenta o que el juego se retrase seriamente.

Mis ideas

¿Configuro el módulo HM-TRP?

Una idea con la que no he jugado es configurar el propio módulo HM-TRP para que su velocidad de E/S inalámbrica sea de 115 kbps y la velocidad de E/S de Uart sea de 9600 bps, pero no estoy seguro de si eso funcionará. o si el módulo tuviera un problema con la gestión de datos debido a dos configuraciones de velocidad diferentes dentro del mismo módulo.

¿Aumento los retrasos en valores fijos?

Podría aumentar la demora entre el momento en que se recibe un carácter y el momento en que se transmite un carácter. Si sigo esta opción, ¿cuánto tiempo mínimo debo esperar? ¿Podría esperar el tiempo que tarda un bit en transferirse a la velocidad de 9600 bps?

¿O ir al estilo round-robin?

La opción bastante cruda que podría tener que elegir es darle a cada dispositivo un número único y hacer que se ejecute un temporizador de modo que cuando el temporizador alcance el mismo número que tiene un dispositivo, ese dispositivo pueda transmitir hasta que el temporizador cambie el número.

Entonces, ¿cuál sería la mejor salida aquí en términos de velocidad y poder transmitir/recibir caracteres con éxito?

Para aquellos que preguntan sobre los factores de la señal inalámbrica, todas las pruebas se realizaron con los chips inalámbricos ubicados a menos de 6 pulgadas entre sí, por lo que las probabilidades de interferencia son inferiores al 0,01 %.

EDITAR

Para mayor claridad, agregué un diagrama de una configuración típica que tendré. Cada caja (excepto la computadora real) tendrá un AT89S52 como el corazón de todo el procesamiento. La computadora real se conectará a la estación central para descargar los datos del juego. Los datos se almacenan en la ram extendida de la estación central y se acumulan a medida que las unidades individuales envían y reciben datos desde y hacia ella, de ahí las líneas verde y roja. Sí, sé que esas líneas podrían mejorarse, pero espero ser más claro.

explicación

ACTUALIZAR

Probablemente aceptaré la sugerencia de ir por turnos, pero este es el problema. La temporización:

9600 8N1 baud
bit delay = 104.17uS
byte delay = 1041.67uS (Start bit + 8 bits + Stop bit)

Parece bien, pero al final tendré que lidiar con 40 o 50 jugadores. Para simplificar, optaré por 50. Luego, para los datos, decidí secuenciar cada paquete y estampar el número de secuencia en cada mordisco para evitar la corrupción de datos. Aquí hay un ejemplo de datos (convertidos aquí en hexadecimal) que un jugador quiere enviar y asume que el número de jugador es 35h y el jugador remoto es 46h:

30h 63h 75h 12h 94h 82h

Entonces los datos a la línea serial inalámbrica serán:

30h 51h 42h 63h 34h 05h 66h 37h 78h 59h 1Ah 2Bh 9Ch 4Dh 8Eh 2Fh

Lo que hice fue tomar los nibbles (de mayor a menor) del número de jugador local y luego remoto y luego hacer lo mismo con 6 bytes de datos. Podría hacer una suma de comprobación, pero eso significa más trabajo para el procesador y la eliminación de otro byte.

Ahora, si hiciera algunos cálculos aquí, creo que el tiempo de retraso para cada jugador sería:

byte delay = 1041.67uS times 32 bytes (16 for transmit, 16 for receive)
=33.3mS

Luego puede volverse loco por el tiempo de espera ya que cada jugador siempre transmitirá algo cuando sea su turno. Entonces, el tiempo de procesamiento para los 49 jugadores restantes es:

=1631.7mS

Lo que significa que tengo que esperar un segundo para transmitir y recibir 32 bytes de datos.

Tal vez haya un mejor protocolo de datos que pueda implementar para reducir el tiempo total de procesamiento.

En una nota al margen, tengo curiosidad. con 9600 baudios en un 8051 con cristal de 22.1184Mhz, la calculadora de tasa de baudios de Keil sugiere que use 0F4h para un valor de temporizador. pero, ¿estoy en lo cierto al suponer que se necesitan 96 ciclos de reloj para que se procese esa velocidad de micro y cristal para que se procese un byte en serie? o realmente toma 192? Si toma 192, entonces puedo hacer que mi tasa de baudios sea de 19.2K sin perder caracteres.

¿Alguna otra idea de cómo puedo mejorar esto? No quiero que los jugadores esperen 1 segundo para enviar nuevos datos.

"9600 baudios" y "un descanso de 1 microsegundo" no pertenecen a la misma oración. Cada carácter tomará del orden de 1040 microsegundos. Pero no se limite a cambiar la velocidad en baudios: es probable que la radio tenga varios retrasos y latencias de respuesta que figuran en su hoja de datos.
Lo siento, no tengo tiempo para escribir una respuesta adecuada, pero en realidad su estilo de todos contra todos no es crudo en absoluto. Se llama Acceso Múltiple por División de Tiempo TDMA y así es exactamente como funciona GSM. Siempre que cada unidad tenga datos para enviar durante cada uno de sus espacios, ¡esta es la forma más eficiente de hacerlo! Sin embargo, si cada unidad solo tiene datos para enviar ocasionalmente y en momentos aleatorios, entonces algo como CSMA/CD podría funcionar, pero cada transmisión tendría que tener un acuse de recibo correspondiente y retransmisiones potenciales, y esto puede causar variaciones de velocidad intermitentes.
Puedo optar por TDMA. También actualicé mi pregunta para ilustrar el problema que tengo en este momento.
Voto para cerrar esta pregunta como fuera de tema porque es una pregunta de uso fuera de tema, no especificada y ha sido abandonada durante dos años.

Respuestas (1)

Parece que el transceptor es semidúplex y desea usarlo para comunicaciones de dúplex completo. Entonces, la respuesta que se me sugiere es usar dos módulos. Uno para recepción dedicada y el otro para transmisión dedicada. Luego diseñe su protocolo de paquete para incluir la identificación de la estación para que pueda descartar cualquier paquete que se origine en localhost.

O use una placa diseñada para operación full dúplex.

Creo que también es semidúplex y, por supuesto, usaré un módulo de radio para todo lo que esté destinado a conectarse a la red. Ya estoy planeando hacer un dispositivo principalmente para transmisión y los dispositivos restantes como esclavos, pero estoy más interesado en la mejor manera de sincronizar eficientemente para que las personas que juegan no experimenten retrasos debido a la transmisión/recepción inalámbrica.
Si el juego se ejecuta en una PC, usaría tarjetas de red inalámbrica para ser honesto. Escribir código WINSOCK no es tan difícil.
No exactamente. Solo uno de los dispositivos inalámbricos está conectado a la PC. El corazón de los dispositivos inalámbricos restantes funciona con microcontroladores 8051. Los sockets de Windows/Linux realmente no ayudarán aquí ya que estoy llevando el 8051 al límite. El chip real que estoy usando para interactuar directamente con el HM-TRP es AT89C4051 con un xtal de 22.1184Mhz.