Cómo encontrar la línea UART es gratis para enviar datos


8

Tengo varias placas que se comunican juntas con Rs485. Tienen ATMegamicrocontroladores en serie como atmega168po atmega8. Cada placa es libre de enviar datos en cualquier momento y tengo limitaciones que conducen a que no pueda usar Modbus . El número de tableros puede variar de 5 a 10.

Mi problema es: ¿cómo puede encontrar una placa si la línea UART es libre de enviar datos, y si detecta que el bus está ocupado, espere hasta que el bus esté libre y luego envíe sus propios datos?

¿Hay un indicador o registro especial que pueda cambiarlo automática o manualmente y dejar que la otra placa encuentre que la Línea está ocupada ?


2
Situaciones como esta serían una de las muchas razones por las cuales RS485 se está eliminando gradualmente a favor de CAN.
Lundin

1
Deberías haber usado el bus CAN. Ahora debe realizar un seguimiento del estado del bus de capa 2 .
Jeroen3

Respuestas:


22

Bienvenido al mayor desafío con los sistemas de comunicaciones half-duplex.

RS-485 no es un protocolo, es un estándar que define las propiedades eléctricas para un enlace diferencial half-duplex (*). No hay nada en la especificación sobre cómo se enviarán los datos a través de ese enlace, o de hecho cómo se usa el enlace.

Como tales transceptores RS-485 no tienen señal automática / línea "bandera ocupada" / lo que sea, ni los microcontroladores que tienen controladores RS-485 incorporados, ni los que usan un núcleo UART conectado a un transceptor externo.

Toda implementación de control de flujo y control de dirección se deja a cualquier protocolo que utilice. Existen varios protocolos bien conocidos que utilizan controladores RS-485, como Modbus. También puede implementar cualquier protocolo que se le ocurra.

Para ayudarlo, estas son algunas ideas para protocolos:

  1. Tiene un protocolo de tipo maestro-esclavo. En esto hay un nodo maestro que coordina el bus y nodos esclavos, cada uno de los cuales tiene un identificador único.

    Los nodos esclavos no pueden enviar ningún dato hasta que el nodo maestro envíe específicamente comandos dirigidos a ellos. Una vez que se direcciona un esclavo, puede responder a cualquier comando de alguna manera predefinida, digamos un paquete de respuesta de longitud fija.

    En este caso, evita los problemas de varios dispositivos que desean hablar al mismo tiempo porque el maestro está allí para coordinar todo.

  2. Podría usar alguna forma de programación mediante la cual cada dispositivo en el bus tiene una ranura fija en la que enviar datos a cualquier otro dispositivo. Una vez que se agota su ranura, debe dejar de enviar y permitir que el siguiente dispositivo hable.

    La programación podría ser realizada por los propios dispositivos sin coordinación externa. El primer dispositivo habla y luego envía un mensaje diciendo que está hecho. El siguiente dispositivo (por ejemplo, el que tiene la siguiente ID más alta) sabría que podría funcionar. En caso de que un dispositivo no responda, podría tener un tiempo de espera por el cual cada dispositivo posterior en el cronograma podría decir: bueno, no he sabido nada del dispositivo antes que yo, por lo que debe ser mi turno.


(*) Creo que también define una versión full-duplex usando dos enlaces diferenciales.


Creo que en una configuración multimaestro ya que el OP tiene el mayor desafío es sincronizar las estaciones nuevas / reconectadas con las existentes, incluida una posible división de red.
Janka

Gracias Tom ... creo que tu forma sugerida de 2 conduce a 1 cosa ... enfoque Master Slave ... es una buena manera si el remitente y el receptor tienen suficientes recursos ... mientras usa un atmega8microcontrolador, creo que conduce a la inestabilidad en el dispositivo actuación
Ali

1
Pero creo que si uso SOF y EOF para una bandera para notificar a todos los miembros de la junta que la línea está ocupada , podría ayudar. pero debe poner una ID de placa de destino para decirle a una placa especial que el paquete es para usted , ¿cuál es su apertura?
Ali

@combo_ci puede usar marcadores de paquetes (por ejemplo, un byte agregado al inicio para indicar SOF y un byte al final para EOF), que ayuda a mantener a todos notificados de que el bus está en el medio de un marco. Pero también debe agregar el manejo de errores / tiempo de espera para decir: bueno, obtuve un SOF hace unos segundos / minutos / años, pero todavía no tengo un EOF. También debe encontrar una manera de asegurarse de que dos dispositivos no intenten hablar al mismo tiempo.
Tom Carpenter

_También necesitas encontrar una manera de asegurarte de que dos dispositivos no intenten hablar al mismo tiempo. _ es mi pregunta :) Creo que no hay una forma estándar de encontrar que .maybe debe implicarme solo
Ali

9

Es muy similar a la comunicación por radio de los militares o la policía. Se requiere un protocolo. Master Slave es fácil y bueno para la mayoría de los casos. Pero otra opción es hacerlo como lo hacen los humanos:

  1. Escucha.
  2. Si alguien habla, espera.
  3. Si crees que nadie habla, puedes hablar.
  4. Espera la confirmación.
  5. Si no se recibe confirmación, hable nuevamente.
  6. Si desea transmitir, solicite a todas las estaciones que confirmen la escucha.
  7. Si desea hablar con alguien que no puede escucharlo, pregunte si hay alguien más que pueda transmitir.

Y así. Puede ser muy interesante de implementar. ¡Buena suerte!


Esto también se utiliza para la creación de redes: en.m.wikipedia.org/wiki/…
Marty

esta es una buena manera, pero tengo el problema de que si (por alguna razón) una placa no puede decir que he terminado, el autobús está ocupado para siempre ... y si usa un temporizador para detectar que no está ocupado, fuerza un sobrecarga adicional al microcontrolador, Tienes una manera de resolver este problema?
Ali

1
También existe la posibilidad de que un niño brutal golpee tu dispositivo en pedazos. Lo siento, no dije que todo es solucionable.
Gregory Kornblum

😊 Por cierto, eso es mucho Gregory
Ali

Una forma interesante de pensar sobre el problema, particularmente el enrutamiento.
Bajista

3

Aquí hay un par de posibilidades para resolver su dilema.

  1. Implemente un sistema de paso de tokens. Cuando un dispositivo tiene el token, se le permite transmitir por un período de tiempo limitado. Luego pasa el token al siguiente dispositivo. Deben hacerse las provisiones para los nodos faltantes que no pueden recibir y pasar el token.
  2. Mira la línea de recepción. Si está ocupado, genere un retraso aleatorio e intente nuevamente. El retraso aleatorio ayuda a garantizar que ningún nodo pueda monopolizar las ventanas de transmisión. Todavía pueden ocurrir colisiones, pero una función de suma de verificación puede determinar si el paquete recibido está intacto. Si no está intacto, el receptor puede solicitar una retransmisión.

para la salida número 1, un token debe enviarse desde una placa que funciona como Maestro ... en un solo bus, todas las placas reciben la ficha, ¿cómo podría una ficha mantenerse en una placa?
Ali

@combo_ci puede designar un maestro o puede negociar el creador del token determinando la dirección de bus más baja o similar.
Glenn W9IQ

@combo_ci podría intentar pasarlo a un dispositivo en particular en la línea, uno establezca la red
seetharaman

2

¿Cómo puede encontrar un tablero si la línea UART es libre de enviar datos,

la respuesta general es que sin algún tipo de protocolo, no puede hacerlo de manera confiable. normalmente confía en un controlador o árbitro para ver si una línea está ocupada o no. Uno simple sería un pin OD tirando una línea indicadora hacia abajo antes de la transmisión y soltándola después. Al leer esa línea, un transmisor puede determinar si el bus está disponible o no.

Un sistema menos confiable pero más simple es integrar el voltaje del bus (a través de la red ar / c, por ejemplo).

y si detecta que el bus está ocupado, espere hasta que el bus esté libre y luego envíe sus propios datos.

El enfoque general es esperar un período de tiempo aleatorio y volver a intentarlo.


2

Resuelvo este problema con mis diseños de esta manera:

en lugar de usar 2 pines para comunicación, uso 3 pines. A distancias cortas funciona. El tercer pin es el indicador de línea ocupada. Este pin se levanta del lado maestro. Cuando alguien (MCU o lo que sea) quiere hablar:

  • comprueba este estado del pin (ENTRADA).
  • si el pin es ALTO, entonces hace que el pin sea bajo (SALIDA)
  • y habla
  • Cuando se transfiere el mensaje, se libera el pin (ENTRADA) (alta impedancia) y el pin se pone alto.
  • Si el pin está bajo, espera un tiempo y luego regresa para verificar el ciclo del pin.

Esta es una implementación de la respuesta de Gregory Kornblum.



2

Software de control de flujo

Tanto el software como el control de flujo de hardware necesitan software para realizar la tarea de reconocimiento. Esto hace que el término control de flujo de software sea algo engañoso. Lo que se quiere decir es que con el control de flujo de hardware, hay líneas adicionales en el cable de comunicación que indican condiciones de comunicación. Con el control de flujo de software, que también se conoce con el nombre de control de flujo XON-XOFF, los bytes se envían al remitente utilizando las líneas de comunicación estándar.

El uso del control de flujo por hardware implica que deben existir más líneas entre el emisor y el receptor, lo que conduce a un cable más grueso y costoso. Por lo tanto, el control de flujo de software es una buena alternativa si no es necesario para obtener el máximo rendimiento en las comunicaciones. El control de flujo de software hace uso del canal de datos entre los dos dispositivos, lo que reduce el ancho de banda. Sin embargo, en la mayoría de los casos, la reducción del ancho de banda no es tan sorprendente como una razón para no usarla.

Se han predefinido dos bytes en el juego de caracteres ASCII para usar con el control de flujo de software. Estos bytes se denominan XOFF y XON, porque pueden detener y reiniciar la transmisión. El bytevalue de XOFF es 19, se puede simular presionando Ctrl-S en el teclado. XON tiene el valor 17 asignado que es equivalente a Ctrl-Q.

Usar el control de flujo de software es fácil. Si se debe posponer el envío de caracteres, se envía el carácter XOFF en la línea, para reiniciar la comunicación nuevamente se utiliza XON. El envío del carácter XOFF solo detiene la comunicación en la dirección del dispositivo que emitió el XOFF.

Este método tiene algunas desventajas. Uno ya se discutió: el uso de bytes en el canal de comunicación ocupa algo de ancho de banda. Otra razón es más severa.

El protocolo de enlace se utiliza principalmente para evitar una saturación del búfer del receptor, el búfer en la memoria utilizado para almacenar los bytes recibidos recientemente. Si ocurre un desbordamiento, esto afecta la forma en que se manejan los nuevos caracteres en el canal de comunicación. En el peor de los casos en que el software se ha diseñado mal, estos caracteres se descartan sin verificarlos. Si dicho personaje es XOFF o XON, el flujo de comunicación puede sufrir daños graves. El remitente proporcionará continuamente nueva información si se pierde el XOFF, o nunca enviará nueva información si no se recibió XON.

Esto también es válido para las líneas de comunicación donde la calidad de la señal es mala. ¿Qué sucede si el mensaje XOFF o XON no se recibe claramente debido al ruido en la línea? También es necesaria una precaución especial para que la información enviada no contenga los caracteres XON o XOFF como bytes de información.

Por lo tanto, la comunicación en serie utilizando el control de flujo de software solo es aceptable cuando las velocidades de comunicación no son demasiado altas, y la probabilidad de que se produzcan desbordamientos del búfer o daños en los datos es mínima.

CSMA de alta velocidad

Para la alta velocidad como la detección de portadora CSMA de ethernet , se ha analizado el acceso múltiple, detección / evitación de colisión, con temporizadores de retroceso aleatorio para determinar la probabilidad estocástica de optimización.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.