📄 sci.c
字号:
void sci_int(void) interrupt 4 using 3 //串行口0中断处理程序
{
uchar temp;
bit md_temp=1;
if(RI) //接收中断
{
RI=0;
temp=SBUF;
switch(re_temp)
{
case 0: //如果re_temp=0表示还没有收到同步字,判断是否为同步字
{
switch(re_temp1)
{case 0: {
if(temp==0xD7)
re_temp1=1;
else re_data();
} break;
case 1: {
if(temp==0x09)
{
re_temp1=0;
re_temp2++;
if(re_temp2==3)
re_temp=1;
}
else if(temp==0xD7)
{
re_temp1=1;re_temp2=0;
}
else re_data();
} break;
default:{re_data();}break;
}
} break;
case 1:
{
re_buf[re_no++]=temp; //如果re_temp=1表示已经收到同步字,对控制字进行处理
/***************判断6个数据是否收完********************/
if(re_no==6)
{
re_no=0;
if(!((re_buf[0]^0x01)&0x8e)) //控制字节低四位是否为0001,E=0? if1
{ //控制字正确,对控制字处理
L=(re_buf[0]&0x40);
S=(re_buf[0]&0x20);
D=(re_buf[0]&0x10);
if(D)
{
if(re_buf[4]!=sn)
{re_data();md_temp=0; }
}
if(md_temp)
{
temp=crc(re_buf);
if(re_buf[5]==crc(re_buf)) //收到一组6个数据以后crc校验
{
if(S) {re_yuan=re_buf[3];} //有源地址,反馈信息以此为目的地址
if(L) {re_xinxi=re_buf[2];re_temp=2;} //本帧有信息字
re_zlb=re_buf[1];
switch(re_zlb)
{
case 0x01:
{
tx_data(0x01,re_yuan);
re_data();
};break;
case 0xf0:{tx_data(tx_zlb_end,tx_add_end);re_data();} break;
default:break;
}
}
else
{ //校验错误,反馈信息给上位机
if((re_buf[3]==re_yuan)&&(re_yuan!=sn))
tx_data(0xf0,re_yuan);
re_data();
}
}
}
else {
re_data(); //不符合控制字节规则,else1
}
}
} break;
//*****************判断6个数据收完,何种命令结束***************************//
case 2: //如果re_temp=2表示帧中包含信息字,对信息字处理
{
re_buf[re_no++]=temp;
/***************判断6个数据是否收完********************/
if(re_no==6)
{
re_no=0;
temp=crc(re_buf);
if(re_buf[5]==crc(re_buf)) //收到一组6个数据以后crc校验
{
switch(re_zlb)
{
case 0x10:
{
if((re_buf[0]==0xf0)&&(re_buf[1]==re_buf[3])&&(re_buf[2]==re_buf[4])&&(re_xinxi==0x01))
{
re_xinxi=0;
set_ov[0]=re_buf[1];
set_ov[1]=re_buf[2];
sci_set1=1;
tx1_data(0x10,tx_mudi);
re_data();
}
}break;
case 0x12:
{
if((re_buf==0xf2)&&(re_buf[1]==re_buf[3])&&(re_buf[2]==re_buf[4])&&(re_xinxi==0x01))
{
re_xinxi=0;
set_lv[0]=re_buf[1];
set_lv[1]=re_buf[2];
sci_set2=1;
tx1_data(0x12,tx_mudi);
re_data();
}
}break;
case 0x14:
{
if((re_buf==0xf2)&&(re_buf[1]==re_buf[3])&&(re_buf[2]==re_buf[4])&&(re_xinxi==0x01))
{
re_xinxi=0;
set_ovv[0]=re_buf[1];
set_ovv[1]=re_buf[2];
sci_set3=1;
tx1_data(0x14,tx_mudi);
re_data();
}
}break;
case 0x30:tx1_data(0x30,tx_mudi);
case 0x32:tx1_data(0x32,tx_mudi);
case 0x34:tx1_data(0x34,tx_mudi);
default: {re_data();} break;
}
}
else //校验错误
{
re_data();
tx_data(0xf0,re_yuan);
}
} }break;
default: break;
}
}
else //发送中断
{
TI=0;
//DE=1;
switch(tx_temp)
{case 0: {
if(tx_temp1==0)
{SBUF=0xD7;tx_temp1=1;}
else
{
SBUF=0x09;tx_temp1=0;tx_temp2++;
if(tx_temp2==3)
{
tx_no=0;
tx_temp=1;
tx_temp2=0;
tx_buf[0]=0x01;
tx_buf[1]=tx_zlb;
switch(tx_buf[1])
{
case 0x01: {tx_buf[0]=(tx_buf[0]|0x40);tx_buf[2]=0x08;tx_xinxi=0x08;}break;
case 0x30: {tx_buf[0]=(tx_buf[0]|0x40);tx_buf[2]=0x01;tx_xinxi=0x01;}break;
case 0x32: {tx_buf[0]=(tx_buf[0]|0x40);tx_buf[2]=0x01;tx_xinxi=0x01;}break;
case 0x34: {tx_buf[0]=(tx_buf[0]|0x40);tx_buf[2]=0x01;tx_xinxi=0x01;}break;
default: tx_buf[2]=0x00;break;
}
if(S){tx_buf[0]=(tx_buf[0]|0x20);tx_buf[3]=sn;}
else tx_buf[3]=0x00;
if(D){tx_buf[0]=(tx_buf[0]|0x10);tx_buf[4]=tx_add;}
else tx_buf[4]=0;
tx_buf[5]=crc(tx_buf);
}
}
} break;
case 1: {
SBUF=tx_buf[tx_no++];
if(tx_no==6)
{
tx_no=0;
switch(tx_zlb)
{case 0x01:{tx_temp=2;
data_no=0;
tx_xinxi=0x08;
get_tx();} break;
case 0x30:{tx_temp=2;
tx_buf[0]=0xf0;
tx_buf[1]=o_v[0];
tx_buf[2]=o_v[1];
tx_buf[3]=o_v[0];
tx_buf[4]=o_v[1];
tx_buf[5]=crc(tx_buf);} break;
case 0x32:{tx_temp=2;
tx_buf[0]=0xf2;
tx_buf[1]=l_v[0];
tx_buf[2]=l_v[1];
tx_buf[3]=l_v[0];
tx_buf[4]=l_v[1];
tx_buf[5]=crc(tx_buf);} break;
case 0x34:{tx_temp=2;
tx_buf[0]=0xf4;
tx_buf[1]=ov_v[0];
tx_buf[2]=ov_v[1];
tx_buf[3]=ov_v[0];
tx_buf[4]=ov_v[1];
tx_buf[5]=crc(tx_buf);} break;
default: tx_temp=3; break; }
}
} break;
case 2: {
SBUF=tx_buf[tx_no++];
if(tx_no==6)
{
tx_no=0;
if(--tx_xinxi)
get_tx();
else
tx_temp=3;
}
} break;
case 3: {
tx_flag=0;
tx_temp=0;
tx_temp1=1;
tx_temp2=0;
if(tx_zlb!=0xf0) //如果帧类别不为0xf0,则将最终发送的帧类别代码暂存tx_zlb_end
{
tx_zlb_end=tx_zlb; //如果收到校验错误帧类别,以该帧类别发送数据
tx_add_end=tx_add;
}
if(tx_fifo)
{tx_fifo=0;tx_data(tx_zlb_temp,tx_add_temp);}
else DE=1;
} break;
default: break;
}
}
}
void sci1_int(void) interrupt 7 using 3 //串行口1中断处理程序
{
uchar temp,temp2,i;
bit md1_temp=1;
if(RI1) //接收中断
{
RI1=0;
temp=SBUF1;
switch(re1_temp)
{
case 0: //如果re1_temp=0表示还没有收到同步字,判断是否为同步字
{ switch(re1_temp1)
{case 0: {if(temp==0xD7)
re1_temp1=1;
else {re1_temp=0;re1_temp1=0;re1_temp2=0;}} break;
case 1: {if(temp==0x09)
{
re1_temp1=0;
re1_temp2++;
if(re1_temp2==3)
re1_temp=1;
}
else if(temp==0xD7)
{
re1_temp1=1;re1_temp2=0;
}
else{re1_temp=0;re_temp1=0;re_temp2=0;}} break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -