📄 rs232.c
字号:
#include "reg66x.h"
#include "668i2c.h" /*包含VI2C软件包*/
#define uchar unsigned char
#define CSI24WC02 0xA0 /*定义器件地址*/
uchar *temp,j=0,i;
uchar rec_com[64];//接收缓冲区
bit timeout=0; //接收超时标志
bit rec_ok=0; //接收成功标志
main()
{
TMOD=0X21;
TH1=0XFA;
TL1=0XFA;
S0CON=0X50;
PCON=0;
TR1=1;
ET0=1;
ES0=1;
EA=1;
while(1)
{
while(timeout==0&&rec_ok==0);
if(timeout)//超时处理
{
//send error for commad
rec_com[0]=0x12;
rec_com[1]=0xa1;
rec_com[2]=2;
rec_com[3]=0;
rec_com[4]=rec_com[0]^rec_com[1]^rec_com[2]^rec_com[3];
ES0=0;
for(i=0;i<5;i++)
{
S0BUF=rec_com[i];
while(TI==0);
TI=0;
}
ES0=1;
timeout=0;
rec_com[0]=0;
rec_com[1]=0;
}
if(rec_ok) //接收成功!
{
if(rec_com[1]!=0x20&&rec_com[1]!=0x21)//命令错误!
{
rec_com[0]=0x12;
rec_com[1]=0xa1;
rec_com[2]=2;
rec_com[3]=0;
rec_com[4]=rec_com[0]^rec_com[1]^rec_com[2]^rec_com[3];
ES0=0;
for(i=0;i<5;i++)
{
S0BUF=rec_com[i];
while(TI==0);
TI=0;
}
ES0=1;
//send error for command
}
else if(rec_com[1]==0x20)//收到读命令
{
i=rec_com[5];
if(IRcvStr(CSI24WC02,rec_com[3],&rec_com[3],rec_com[5]))//读成功
{
rec_com[0]=0x12;
rec_com[1]=0xa0;
rec_com[2]=i+2;
for(j=0;j<(i+3);j++)
rec_com[i+4]=rec_com[j]^rec_com[j+1];
ES0=0;
j=j+2;
for(i=0;i<j;i++)
{
S0BUF=rec_com[i];
while(TI==0);
TI=0;
}
ES0=1;
}
//send read ok;
else//send read error读失败
{
rec_com[0]=0x12;
rec_com[1]=0xa1;
rec_com[2]=2;
rec_com[3]=1;
rec_com[4]=rec_com[0]^rec_com[1]^rec_com[2]^rec_com[3];
ES0=0;
for(i=0;i<5;i++)
{
S0BUF=rec_com[i];
while(TI==0);
TI=0;
}
ES0=1;
}
}
else if(rec_com[1]==0x21)//收到写命令
{
j=rec_com[2]-4;
if(ISendStr(CSI24WC02,rec_com[3],&rec_com[5],j))//写成功
{
rec_com[0]=0x12;
rec_com[1]=0xa0;
rec_com[2]=1;
rec_com[3]=rec_com[0]^rec_com[1]^rec_com[2];
ES0=0;
for(i=0;i<4;i++)
{
S0BUF=rec_com[i];
while(TI==0);
TI=0;
}
ES0=1;
}
else//写失败
{
rec_com[0]=0x12;
rec_com[1]=0xa1;
rec_com[2]=3;
rec_com[3]=0;
rec_com[4]=0;
rec_com[5]=rec_com[0]^rec_com[1]^rec_com[2]^rec_com[3];
ES0=0;
for(i=0;i<6;i++)
{
S0BUF=rec_com[i];
while(TI==0);
TI=0;
}
ES0=1;
}
}
rec_com[0]=0;
rec_com[1]=0;
rec_ok=0;
}
}
}
void int_com() interrupt 4
{
uchar * tmp,counter;
if(RI==1)
{
TR0=1;
TH0=-60000/256;
TL0=-60000/256;
rec_com[0]=S0BUF;
RI=0;
while(RI==0&&timeout==0);
rec_com[1]=S0BUF;
RI=0;
while(RI==0&&timeout==0);
rec_com[2]=S0BUF;
RI=0;
tmp=&(rec_com[3]);
counter=rec_com[2];
do
{
while(RI==0&&timeout==0);
*tmp=S0BUF;
tmp++;
counter--;
RI=0;
}
while(timeout==0&&counter!=0);
if(!timeout)
rec_ok=1;
TR0=0;
}
if(TI==1)
{
TI=0;
}
}
void int_t0() interrupt 1
{
static counter=0;
counter++;
TH0=-60000/256;
TL0=-60000%256;
if(counter==5)
{
timeout=1;
counter=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -