//////////////////////////////////////
// for serial communication
// haobo 8.20
// single-slave|with buffer|sum check
//////////////////////////////////////
#include<absacc.h>
#include<reg51.h>
#define uchar unsigned char
//////////////////////////////////////
uchar com_buffer[16];
uchar sum;
/////////////////////////////////////
void com_init(void);
void buf_send(uchar len);
void buf_receive(uchar len);
//////////////////////////////////////
void main(void)
{
com_init();
buf_send(8);
buf_receive(8);
}
//////////////////////////////////////
void com_init(void)
{ TMOD=0x20; //T1 mode 2
TH1=0xe8; //T1 init value(determine baud rate)
TL1=0xe8; //baud rate 1.2k
PCON=0x00;
SCON=0x50; //(sm0 sm1 sm2 ren|tb8 rb8 t1 r1),mode 1
TR1=1; //T1 start
}
//////////////////
void buf_send(uchar len)
{ uchar i; //index of "for"
do{
SBUF=0xaa; //detect with 0xaa
while(TI==0) ;
TI=0; //wait sending
while(RI==0) ;
RI=0; //wait echo
}while(SBUF!=0xbb); //check.IF no correct echo(0xbb) received,send again and again
do{
sum=0;
for(i=0;i<len;i++) //send bufferrd data
{ SBUF=com_buffer[i];
sum+=com_buffer[i]; //sum buffered data
while(TI==0) ;
TI=0;
}
SBUF=sum; //send check sum
while(TI==0) ;
TI=0;
while(RI==0) ;
RI=0;
}while(SBUF!=0xcc); //echo!=0xcc if communication failed,so resend buf
}
/////////////////////////
void buf_receive(uchar len)
{ uchar i;
do{
while(RI==0) ;
RI=0; //wait 0xaa
}while(SBUF!=0xaa);
SBUF=0xbb; //send echo 0xbb
while(TI==0) ;
TI=0;
while(1)
{ //receive buf data
sum=0;
for(i=0;i<len;i++)
{ while(RI==0) ;
RI=0;
com_buffer[i]=SBUF;
sum+=com_buffer[i];
}
while(RI==0) ; //wait sum
RI=0;
if(SBUF==sum) //sum is correct,send 0xcc
{ SBUF=0xcc;break;}
else{
SBUF=0xff;
while(TI==0) ;
TI=0;
}
}
}