///////////////////////Transmisor:
#use delay (clock=4000000)
#use rs232 (baud=9600, xmit=PIN_C6, rcv=PIN_C7)
int c=0x00;
void main(){
while(true){
printf("%U",c);
++c;
delay_ms(500);
}
}
/////////////////////Receptor:
#use delay (clock=4000000)
#use rs232 (baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#define LCD_DB4 PIN_d0
#define LCD_DB5 PIN_d1
#define LCD_DB6 PIN_d2
#define LCD_DB7 PIN_d3
#define LCD_RS PIN_d4
#define LCD_RW PIN_d5
#define LCD_E PIN_d6
#include <flex_lcd.c>
void main(){
lcd_init();
int rec=0x00;
while (TRUE) {
//rec=0x00;
if (kbhit()) {
rec=getc();}
printf(lcd_putc,"\fAn = %U" ,rec);
delay_ms(200);
}
}
El problema puede ser que estas enviando más de 1 byte y solo recibes 1. Si las dos posiciones del registro RCREG están llenas y se detecta el bit de Stop de un tercer dato de recepción, se activará el indicador de sobreescritura OERR (RCSTA<1>).
La única manera de limpiar el bit OERR una vez que ha sido activado es reseteando el módulo de recepción, si no se limpia OERR se bloquea la transferencia de datos de RSR a RCREG y no puede haber más recepción de datos.
////////////////////////////////////////////TX///////////////////////////////////
#include <16f876A.h>
#device ADC=8
#FUSES NOWDT, XT, NOPUT, NOLVP
#use delay (clock=4000000)
#use rs232 (baud=9600, xmit=PIN_C6, rcv=PIN_C7)//, bits=8, parity=N)
void main(){
int ejex,ejey;
long eje_xy;
setup_adc_ports(AN0_AN1_AN3);
setup_adc(ADC_CLOCK_INTERNAL); // Trabajo con reloj interno
while(true){
set_adc_channel(0); //Selecciono canal 0 de ADC
delay_us(30);
ejex=read_adc(); //Leo el ADC0 y ejey toma su valor
delay_us(50);
set_adc_channel(1); //Selecciono canal 1 de ADC
delay_us(30);
ejey=read_adc(); //Leo el ADC1 y ejex toma su valor
ejex=make8(eje_xy,0);
ejey=make8(eje_xy,1);
printf("%lu\n",eje_xy);
delay_ms(300);
/////////////////////////////////////////RX////////////////////////////////////////
void main(){
lcd_init();
int ejex,ejey;
char rec[3],k;
k=0;
while (TRUE) {
if (kbhit()) {
rec[k]=getc();
if(rec[k]=='\n'){
rec[k]=0;
}
else {
if(k==0) ejex=rec[k];
if(k==1) ejey=rec[k];
k++;
}
printf(lcd_putc,"\fAn = %U" ,ejex);
printf(lcd_putc,"\nAn = %U" ,ejey);
TX
putc(0x0d);
putc(ejex);
putc(ejey);
RX
while (TRUE) {
if (kbhit()) {
rec=getc();
if(rec==0x0d){
for(k=0;k<=1;k++){
recf[k]=getc();
}
}
}
ejex=recf[0];
ejey=recf[1];
printf(lcd_putc,"\fAn = %U" ,ejex);
printf(lcd_putc,"\nAn = %U" ,ejey);