Hola.
Hay que tener especial cuidado en la definicion de las subfunciones las cuales usan uno de los COM, el stream no mas no es suficiente (a mi me paso igual)
En el ejemplo del CCS EX_ENCRY.c esta el manejo de dos USART (una es por soft y la otra es por hard)
Adjunto parte del codigo que use en algo similar (basada en el manejo de interrupciones del gran RedRaven).
#include <18F452.h>
#device adc=10
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, BORV45, PUT, NOLVP
#use delay(clock=4M)
#include "DS1302.C"
#include "LCDD.C"
#include "KBDB.C"
#use rs232(baud=2400,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)// puerto 1 //////////////////////////////////////////////////////////////////////
int const lenbuff=32;
int xbuff=0x00; // Índice: siguiente char en cbuff
char cbuff[lenbuff]; // Buffer
char rcvchar=0x00; // último carácter recibido
int1 flagcommand=0; // Flag para indicar comando disponible
char bgetc1()
{
char c;
c=getc();
return(c);
}
void putc1(char c)
{
putc(c);
}
void inicbuff(void)// Inicia a \0 cbuff ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////-------------------
{
int i;
for(i=0;i<lenbuff;i++)
{ // Bucle que pone a 0 todos los
cbuff[i]=0x00; // caracteres en el buffer
}
xbuff=0x00; // Inicializo el índice de siguiente
// carácter
}
void addcbuff(char c)// Añade a cbuff ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////-----------------------
{
switch(c)
{
case '\r': // Enter -> Habilita Flag para procesar
flagcommand=true; // Comando en Main
break;
case '\n':
flagcommand=true;
break;
case ' ':
break;
default:
cbuff[xbuff++]=c; // Añade carácter recibido al Buffer
}
}
#int_rda
void serial_isr() // Interrupción recepción serie USART ///////////////////////////////////////////////////////////////////////////////////////////////
{
rcvchar=0x00; // Inicializo carácter recibido
if(kbhit())
{ // Si hay algo pendiente de recibir ...
rcvchar=bgetc1(); // lo descargo y ...
addcbuff(rcvchar); // lo añado al buffer
}
}
#use rs232(baud=9600, xmit=PIN_C4, rcv=PIN_C5, bits=8, parity=N)// puerto 2 //////////////////////////////////////////////////////////////////
char bgetc2()
{
char c;
while(!kbhit());
c=getc();
return(c);
}
void putc2(char c)
{
putc(c);
}
Ya en el main hago lo siguiente:
void main (void)
{
while(true)
{
printf(putc1,"com1\r\n");
printf(putc2,"com2\r\n");
}
}
Toca colocar despues de la directiva #use rs232... las funciones concernientes a ese stream.
La simulacion de todo el programa corre muy bien (lo estan montando en HW en estos dias, asi que no se si funcione en hard, pero, casi siempre, lo que me ha salido en proteus me ha salido en en hard, asi que estoy muuuuy confiado ......
la verdad espero que si salga!!!! si no, no hay pago!!!!!
)
La razon de que en hard te corra bien el COM_A, creo que es que la interrupcion esta conectada justamente a esos pines el c6 y el c7 y porque en soft corre al reves? creo que es porque despues de definir el #use rs232 para el COM_B, esta definido la funcion de interrupcion.
Prueba a ver y me cuentas.
Saludos