Recibir datos simultaneamente de multiples RS232 con PIC

Hola que tal amigos del foro, me gustaria que me ayuden con este problemita que tengo, aqui va.

Me encuentro realizando un proyecto en el cual tengo que recibir datos por 3 puertos RS232, el problema yace en que en algun momento 2 o 3 puertos enviaran sus datos al mismo tiempo o simultaneamente, en caso de presentarse este problema me gustaria recibir todos los datos sin perder ninguno, adjunto una imagen para que me comprendan mejor.

Estube pensando en estos 2 diagramas, pero cada uno tiene problemas.
Usart por harware:
1º - colision de datos

Usart por software:
1º - en cuanto estoy recibiendo 1 dato, pierdo el otro.


Espero q me puedan ayudar, de antemano muchas gracias:)
 

Adjuntos

  • Diagrama.jpg
    Diagrama.jpg
    35.7 KB · Visitas: 49
Olvida la usart por software, es absolutamente inútil para cosas serias

Puedes apñliar cuantas usart quieras externamente. Hay dispositivos SPI con buffer FIFO
 
En serio; las uart software solo sirven para jugar, sus dos características fundamentales son:
Velocidad ridícula y 100% de cpu ocupada
Con esas dos premisas, sobre todo la segunda, ya no puedes hacer absolutamente NADA mas, el sistema está totalmente MUERTO mientras esperas datos.

Uart software de salida para tráfico muy muy ligero, aún se puede plantear: Como tu sabes cuando emites decides si hacerlo o no. Si estás esperando datos y no sabes exáctamente cuando entran no puedes hacer nada mas que esperar...
 
La idea de usar un spi es muy buena, particularmente no conozco ningun dispositivo de ese tipo para comunicación serial, si he trabajado con seriales/paralelo, pero para comunicación rs232 no, en caso no consigas ese dispositivo, puedes usar un pic para recibir cada dato, pics baratos como el 16f88, serian 3, y estos se comunicaria con un pic principal, que podria ser un 16f88 también u otro el que gustes, y la comunicación entre ellos lo puedes hacer por i2c teniendo al princial como maestro i2c y a los otros 3 como esclavos, de esa maner también puedes determinar exactatmente quien envia que dato y podrias organizarlo mucho mejor.
 
Hola:

Estoy tratando de conectar 3 Pic entre sí usando la usart. El sistema se compone de una placa con un PIC que hará de "maestro" y será el que reciba y envíe datos al pc, y a la vez envía ciertos datos recibidos del PC a otros 2 PIC en otras placas. Esto me funciona bien, los otros 2 Pic reciben los datos correctamente. Lo que no me funciona nada bien es cuando alguno de estos dos "esclavos" mandan algo al maestro, muchas veces no llegan estos datos, seguramente por problemas de colisiones o no se.

Las placas están bastante cerca y no utilizo max232, va conectado directamente uno a otro. ¿Cómo puedo controlar que no está enviando ninguno para poder utilizar el bus?

Un saludo y gracias
 
El 232 no es multipunto así que mejor usa el RS485 que si que lo es.
Eso o tener dos uart en el maestro.,

Bueno, si están tan cerca que es conexión directa, pon una linea de "enable" a cada esclavo para darle permiso para hablar, eso o usa un I²C o SPI que si que son buses multipunto
 
I2C ya lo probé otra vez y me daba problemas con no muy buenos cables y a cierta distancia. 20 cm no llegaba ya. La librería de RS485 de CCS no la entiendo, y con las pruebas que hice no logré sacar nada en claro.
¿La línea de "enable" vale definirla en el "#use rs232.......enable=..." o te refieres a que la programe yo?
Había pensado en utilizar un pin para ponerlo a nivel alto justo antes del "putc()" y a nivel bajo después, pero no sé si en la usart hay otro tráfico después de estas instrucciones que hable entre ellos.
 
lo mas practico para no usar otro cable ademas de los de transmision y recepcion es usar un enable mediante firme, lo que harias es que a cada pic esclavo le daras un nombre y que el maestro este constantemente preguntando a cada pic su status, por ejemplo al primer esclavo le llamas A y al segundo le llamas B.
cuando los esclavos reciban el caracter responderan ya sea activando una salida o enviando su status al maestro.

Algo asi como lo que haria un escaner CAN, deberias rebizar las librerias CAN son bastante buenas.
 
Voy a simular esto último con el proteus, que ahora no me encuentro en casa. He probado en proteus tambien lo de una linea de enable, y no se porque, uno de ellos no envia si el otro está conectado. El programa está bien, porque por separado funciona, pero juntos, siempre es el mismo el que no envía



Lo estoy simulando y llamando a los Pic "A" (maestro) "B" y "C", el C no responde si está conectado el TX del B. ¿Será un fallo del proteus? En cuanto suelto la linea TX del B, el C empieza a enviar. (O a recibir el maestro)
 
Última edición:
¿Estás usando uarts software?

Lo del enable me refería a usar un pin cualquiera y antes de empezar a transmitir comprobar ese pin a ver como está.
 
Que quiere decir que un UART no transmita? Hasta donde yo se un UART no puede entrar en estado de alta impedancia. Para mi lo mas logico es que cada esclavo se conecte al master por lineas separadas, un Tx y Rx dedicado por cada eslavo, y no hay necesidad de lineas enable.
 
Lo uso por hardware, y ya he probado que poniendo la opción "enable=..." en el #use rs232 hace eso, pone el pin a 1 cuando va a transmitir y lo pone a 0 al terminar. Probaré mañana en casa con el circuito real a ver si funciona, porque con el proteus no, hace cosas raras. Y si no funciona en el circuito, tendré que plantearme el i2c.
Saludos
 
Exactamente, eso es hacer disable en 232, poner la linea a 1. No podes hacer bus con 232, para mi le tenes que dar a cada uno su conexion dedicada.
 
Puedes poner unos buffer triestado en los tx de los emisores. Cuando el maestro habla habla para todos y cada uno sabe si le interesa o no, para contestar los esclavos que solo contesten cuando se les pregunte y entonces se activan su buffer triestado para hablar. Eso o algún juego con resistencias para que no choquen las líneas.
 
Atrás
Arriba