Buenas a tod@s. Aquí os presento un problema con el que llevo varios días liado y no logro solucionar, a ver si alguno de ustedes tiene alguna experiencia similar y me puede arrojar alguna luz.
Compilador CCS C 4.093. No puedo migrar a versiones mayores, salvo como último recurso, ya que tengo un firmware bastante complejo que no es compatible con la 4.140, por ejemplo, y preferiría mantenerlo, salvo que descubramos que lo que me pasa es exactamente un bug de esta versión.
PIC 18F4550 corriendo a 48 MHz, con una sola USART dedicada a una conexión serie que no puedo tocar.
Se me ha planteado la necesidad de recibir información de uno o dos dispositivos serie nivel TTL y por lo tanto he añadido dos #use rs232() adicionales, éstos por Software obviamente. Para minimizar los riesgos he decidio bajar la velocidad de estos dispositivos a tan solo 1200 baudios, es suficiente para las pruebas y no me hace falta más velocidad.
#use rs232(baud=115200, xmit=EM202_RX, rcv=EM202_TX, ERRORS, RESTART_WDT, stream=MAINCOM)
#use rs232(baud=1200, rcv=PIN_B5, FORCE_SW, INVERT, RESTART_WDT,stream=COMH1)
#use rs232(baud=1200, rcv=PIN_B4, FORCE_SW, INVERT, RESTART_WDT,stream=COMH2)
El MAINCOM es la USART y los COMH1 y COMH2 los canales serie por Software. COMH1 lee el PIN_B5 y COMH2 lee el PIN_B4 que son los únicos que tengo libres, no tengo posibilidades por hardware de utilizar ningún otro, aunque en principio esto no debería de influir.
Para la recepción de ambos canales serie virtuales tengo el correspondiente código dentro de bucle infinito:
void main(void){
int1 Ever=true;
main_on_reset();
do{
restart_wdt();
/////////////////////////////////////////////////////////////////////////////////////////////
//
// Tratamiento de lecturas TTL Serie en H1 y H22
//
/////////////////////////////////////////////////////////////////////////////////////////////
// SERIAL COM HEAD 1
if(kbhit(COMH1)){
c_H1 = fgetc(COMH1);
if(c_H1!=0x00){
Code1[Next_byte1++]=c_H1;
}
}
// SERIAL COM HEAD 2
if(kbhit(COMH2)){
c_H2 = fgetc(COMH2);
if(c_H2!=0x00){
Code2[Next_byte2++]=c_H2;
}
}
/////////////////////////////////////////////////////////////////////////////////////////////
// Aquí mucho más código ....
/////////////////////////////////////////////////////////////////////////////////////////////
}while(Ever);
}
Como véis están perfectamente separados ambos canales, con pines distintos, con variables de recogida y almacenamiento distintos ....
Pues bien, funciona perfectamente, maravillosamente, espectacularmente ... pero ... pero solo el que esté en primer lugar.
Me explico: En el caso del código de arriba recibo perfectamente sobre Code1 lo que transmita por PIN_B5 ¡¡¡ y por PIN_B4 !!! Conecte donde conecte mi dispositivo, en PIN_B5 ó en PIN_B4 siempre recibo por PIN_B5

Ahora si modifico el orden de las recogidas, y pongo el de PIN_B4 antes que el de PIN_B5
:
void main(void){
int1 Ever=true;
main_on_reset();
do{
restart_wdt();
/////////////////////////////////////////////////////////////////////////////////////////////
//
// Tratamiento de lecturas TTL Serie en H1 y H22
//
/////////////////////////////////////////////////////////////////////////////////////////////
// SERIAL COM HEAD 2
if(kbhit(COMH2)){
c_H2 = fgetc(COMH2);
if(c_H2!=0x00){
Code2[Next_byte2++]=c_H2;
}
}
// SERIAL COM HEAD 1
if(kbhit(COMH1)){
c_H1 = fgetc(COMH1);
if(c_H1!=0x00){
Code1[Next_byte1++]=c_H1;
}
}
/////////////////////////////////////////////////////////////////////////////////////////////
// Aquí mucho más código ....
/////////////////////////////////////////////////////////////////////////////////////////////
}while(Ever);
}
entonces sobre Code2 recibo perfectamente lo que transmita por PIN_B4 ¡¡¡ y por PIN_B5 !!! Conecte donde conecte mi dispositivo, en PIN_B4 ó en PIN_B5 siempre recibo por PIN_B4

Monitorizo Code1 y Code2 tras concluir la recepción y siempre se carga el primero que coloque de ambos. Como os digo ya no tengo idea de qué mas pruebas hacer ... estoy ligeramente desesperado

¿Alguna idea?