Hola Expertos,
Necesito ayuda de alguien experimentado en el tema.
Trato de comunicar un PIC por rs232 con varios dispositivos, en un principio con 3 diferentes (puede que mas adelante sean mas) donde cada dispositivo funciona a una velocidad diferente. Mi problema está al detectar por donde me viene la informacion, de que dispositivo. El pic se encuentra haciendo sus cosas, y en un determinado momento me vendrán datos de uno de los dispositivos y he de tratarlos.
En un principio habia pensado hacerlo por interrupciones, pero segun he leido en numerosos post, a lo maximo que llego es a tratar dos interrupciones, una por (#int_rda) asginandola a un pueto serie, y el otro puerto serie a una interrupcion externa (#int_EXT) por RB0. Pero... ¿Y el tercer puerto que necesito que hago?
He intentado hacer el programa sin interrupciones, (tal y como esta abajo), pero no me termina de funcionar bien. En un principio me recibe el dato, el puerte correspondiente por donde venga, pero al enviar el segundo, por el mismo puerto o por otro, no hace caso, necesito enviar dos o tres veces para que reaccione, y encima, al estar haciendolo asi, no puedo tener al PIC haciendo otras cosas mientras no vengan datos.
Entre los diferentes dispositivos se comunicaran con tramas "largas" (15 ó 20 bytes cada una), donde el primer byte de cada trama me dira que debo hacer en cada caso con el resto de esa trama.
¿Se os ocurre alguna idea?
#include <18F2550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)
#include <stdio.h>
#include <string.h>
//________________________________________________________________________________________________
#use rs232(baud=115200,parity=N,xmit=PIN_C6,bits=8, ERRORS, stream=Canal_PC_TX)
#use rs232(baud=115200,parity=N,rcv=PIN_C7,bits=8, ERRORS, stream=Canal_PC_RX)
#use rs232(baud=9600,parity=N,xmit=PIN_B6,bits=8, ERRORS, stream=Canal_WC_TX)
#use rs232(baud=9600,parity=N,rcv=PIN_B7,bits=8, ERRORS, stream=Canal_WC_RX)
#use rs232(baud=38400,parity=N,xmit=PIN_B4,bits=8,stream=Canal_GP_TX)
#use rs232(baud=38400,parity=N,rcv=PIN_B5,bits=8, ERRORS, stream=Canal_GP_RX)
#define Enciende Output_High
#define Apaga Output_Low
//________________________________________________________________________________________________
void main(){
unsigned int miBuffer[10];
unsigned int16 miCrc;
int i=0, j=0;
Enciende(PIN_A1);
delay_ms(500);
Apaga(PIN_A1);
fprintf(Canal_PC_TX,"\r\nINICIO");
while(TRUE){
if(kbhit(Canal_PC_RX) == TRUE && getchar(Canal_PC_RX) == 0x01){
fprintf(Canal_PC_TX,"\r\nRecibido comando 1 de PC");
}else if(kbhit(Canal_PC_RX) == TRUE && getchar(Canal_PC_RX) == 0x02){
fprintf(Canal_PC_TX,"\r\nRecibido comando 2 de PC");
}else if(kbhit(Canal_WC_RX) == TRUE){
fprintf(Canal_PC_TX,"\r\nRecibo por WC");
}else if(kbhit(Canal_GP_RX) == TRUE){
fprintf(Canal_PC_TX,"\r\nRecibo por GP");
}
}
}
Esto es un pequeño ejemplo de lo que pretendo. Esto me funciona, pero como os he dicho, aveces me falla, se queda atascado y necesito enviar varias veces para que se entere de que le estoy enviando.
A ver si alguien me podeis hechar un cable, salu2 a tod@s