📄 ser_com.c
字号:
#define CALL 0x24 //主机呼叫
#define BUSY 0x15 //从机忙
#define OK 0x00 //从机准备好
#define SUCC 0x2A //接收成功
#define ERR 0xF0 //接收错误
#define MAXLEN 32 //缓冲区最大长度
unsigned char buf[MAXLEN]={"AN"};
unsigned char buf_length=0;
void init_serial(void)
{
TMOD=0x20;
TH1=0xFD;
TL1=0xFD;
PCON=0x80;
TR1=1;
SCON=0x50;
}
void send_data(unsigned char *buf,unsigned char lenth)
{
unsigned char i;
unsigned char len;
unsigned char ecc;
len=lenth;
ecc=len;
/*发送数据长度*/
TI=0;
SBUF=len; //发送长度
while(!TI);
TI=0;
/*发送数据*/
for(i=0;i<len;i++)
{
SBUF=*buf;
ecc=ecc^(*buf);
buf++;
while(!TI);
TI=0;
}
/*发送校验字节*/
SBUF=ecc;
while(!TI);
TI=0;
}
void send_packet(void)
{
unsigned char tmp;
tmp=BUSY;
while(tmp!=OK)
{
/*发送呼叫信号CALL*/
TI=0;
SBUF=CALL;
while(!TI);
TI=0;
/*接收从机应答*/
RI=0;
while(!RI);
tmp=SBUF;
RI=0;
}
tmp=ERR;
while(tmp!=SUCC)
{
send_data(buf,buf_length);
RI=0;
while(!RI);
tmp=SBUF;
RI=0;
}
}
unsigned char recive_data(unsigned char *buf)
{
unsigned char i;
unsigned char tmp;
unsigned char ecc;
/*接收数据长度字节*/
RI=0;
while(!RI);
buf_length=SBUF;
RI=0;
/*使用len的值为校验字节ecc赋初值*/
ecc=buf_length;
/*接收数据*/
for(i=0;i<buf_length;i++)
{
while(!RI);
*buf=SBUF;
ecc=ecc^(*buf);
RI=0;
buf++;
}
/*接收校验字节*/
while(!RI);
tmp=SBUF;
RI=0;
/*进行数据校验*/
ecc=tmp^ecc;
if(ecc!=0) //如果校验错误
{
/*发送校验错误信号ERR*/
TI=0;
SBUF=ERR;
while(!TI);
TI=0;
return 0xFF; //返回0xFF表示校验错误
}
else
{
/*发送校验成功信号SUCC*/
TI=0;
SBUF=SUCC;
while(!TI);
TI=0;
return 0; //校验成功,返回0
}
}
void recive_packet(void)
{
unsigned char tmp=0;
/*如果接收到的数据不是CALL,则继续等待*/
while(tmp!=CALL)
{
RI=0;
while(!RI);
tmp=SBUF;
RI=0;
}
/*发送OK信号,表示从机可以接收数据*/
TI=0;
SBUF=OK;
while(!TI);
TI=0;
/*接收数据*/
tmp=0xFF;
while(tmp==0xFF)
tmp=recive_data(buf);//校验失败返回0xFF,接收成功返回0
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -