Bienvenido al mayor reto de los sistemas de comunicación semidúplex.
RS-485 no es un protocolo, es una norma que define las propiedades eléctricas de un enlace diferencial semidúplex(*). No hay nada en la especificación sobre cómo se deben enviar los datos a través de ese enlace, o de hecho cómo se utiliza el enlace.
Los transceptores RS-485 no tienen una señal/bandera/lo que sea de "línea ocupada" automática, ni tampoco los microcontroladores que tienen controladores RS-485 incorporados, ni los que utilizan un núcleo UART conectado a un transceptor externo.
Toda la implementación del control de flujo y del control de dirección se deja al protocolo que se utilice. Existen varios protocolos muy conocidos que utilizan controladores RS-485, como el Modbus. También puedes implementar cualquier protocolo que se te ocurra.
Para ayudarte, estas son un par de ideas de protocolos:
-
Tienes un protocolo de tipo maestro-esclavo. En éste hay un nodo maestro que coordina el bus, y nodos esclavos que tienen cada uno 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 un esclavo está dirigido, puede responder a cualquier comando de una manera predefinida, por ejemplo, un paquete de respuesta de longitud fija.
En este caso se evitan los problemas de que varios dispositivos quieran hablar al mismo tiempo porque el maestro está ahí para coordinarlo todo.
-
Se podría utilizar alguna forma de programación por la que cada dispositivo del bus tenga un slot fijo en el que enviar datos a cualquier otro dispositivo. Una vez que su ranura se agota, debe dejar de enviar y permitir que el siguiente dispositivo hable.
La programación podría ser realizada por los propios dispositivos sin necesidad de coordinación externa. El primer dispositivo habla y envía un mensaje diciendo que ha terminado. El siguiente dispositivo (por ejemplo, el de mayor ID) sabría entonces que puede ir. En caso de que un dispositivo no responda, se podría tener un tiempo de espera por el que cada dispositivo posterior en el programa podría decir: bueno, no he oído nada del dispositivo anterior a mí durante un tiempo, así que debe ser mi turno.
(*) Creo que también define una versión full-duplex utilizando dos enlaces diferenciales.
4 votos
Situaciones como ésta serían una de las muchas razones por las que el RS485 está siendo eliminado en favor del CAN.
1 votos
Debería haber utilizado el bus CAN. Ahora tienes que llevar la cuenta de capa 2 estado del autobús.
0 votos
¿cómo se trata la comunicación de 9 bits en este caso?