📄 rscomm.c
字号:
/*****************************************************************
Communication control code describe
*****************************************************************/
void Comm_Ctrl(void)
{
char Tmp;
int i,DD;
////////////////////////////////////////////////////////////////////////////////
if( Addr_0_0() == 0)
{
Rs_Head1 = 0xFF;
return;
}
if( Addr_9_9() == 0 ) //广播通讯
{
DD = ((int)Rs_IDH<<8) + (int)Rs_IDL;
switch( DD )
{
case 0xC011: //校时
MEM_DBWrite( Meter_Time, &Buffer[0], 7 ,Mem_FRAM); //FRAM
memcpy( (char*)&Clk.Sec[0], &Buffer[0], 7); //RAM
break;
case 0xC032: //写表地址
MEM_DBWrite( Meter_Addr, (char*)&Comm.Buf[14], 4,Mem_FRAM );
break;
case 0xE010: //冻结命令
Flag.BillRst |= F_Brday;
break;
default:
break;
}
Rs_Head1 = 0xFF;
}
else
{
FRAM_Read( (char*)&Buffer, Meter_Addr, 4 );
if( memcmp( &Rs_Addr0, Buffer, 4 ) == 0 )
{
////////////////////////////////////////////////////////////////////////////////
if( Rs_Ctl & 0x80 ) //由从站发出的应答帧
{
if( Comm.flag!=0 ) //上传标志位
{
memcpy( (char*)&Rs_Addr0,&Comm.Addr,4);
}
else Rs_Head1 = 0xFF;
}
////////////////////////////////////////////////////////////////////////////////
else //由主站发出的命令帧
{
if( Rs_Ctl & 0x40 ) //带中继命令
{
i=(Rs_Ctl>>4)&0x03;
switch( i)
{
case 0:
Rs_Ctl &=~0x40;
memcpy( (char*)&Buffer, &Rs_Addr0, 4 );
memcpy( (char*)&Rs_Addr0, &Comm.Buf[10], 4 );
memcpy( (char*)&Comm.Addr, &Comm.Buf[14], 4 );
memcpy( (char*)&Comm.Buf[10], &Buffer, 4 );
memcpy( (char*)&Buffer, &Comm.Buf[18], Rs_Len-10 );
memcpy( (char*)&Comm.Buf[14], &Buffer, Rs_Len-10 );
Rs_Len -= 4;
Comm.RpTmr=TM_5000ms;
break;
case 1:
Rs_Ctl &=~0x10;
memcpy( (char*)&Buffer, &Rs_Addr0, 4 );
memcpy( (char*)&Rs_Addr0, &Comm.Buf[10], 4 );
memcpy( (char*)&Comm.Buf[10], &Comm.Buf[14], 4 );
memcpy( (char*)&Comm.Addr, &Comm.Buf[18], 4 );
memcpy( (char*)&Comm.Buf[14], &Buffer, 4 );
memcpy( (char*)&Buffer, &Comm.Buf[22], Rs_Len-14 );
memcpy( (char*)&Comm.Buf[18], &Buffer, Rs_Len-14 );
Rs_Len -= 4;
Comm.RpTmr=TM_10000ms;
break;
case 2:
Rs_Ctl ^=0x30;
memcpy( (char*)&Buffer, &Rs_Addr0, 4 );
memcpy( (char*)&Rs_Addr0, &Comm.Buf[10], 4 );
memcpy( (char*)&Comm.Buf[10], &Comm.Buf[14], 4 );
memcpy( (char*)&Comm.Buf[14], &Comm.Buf[18], 4 );
memcpy( (char*)&Comm.Addr, &Comm.Buf[22], 4 );
memcpy( (char*)&Comm.Buf[18], &Buffer, 4 );
memcpy( (char*)&Buffer, &Comm.Buf[26], Rs_Len-18 );
memcpy( (char*)&Comm.Buf[22], &Buffer, Rs_Len-18 );
Rs_Len -= 4;
Comm.RpTmr=TM_15000ms;
break;
case 3:
Rs_Ctl &=~0x10;
memcpy( (char*)&Buffer, &Rs_Addr0, 4 );
memcpy( (char*)&Rs_Addr0, &Comm.Buf[10], 4 );
memcpy( (char*)&Comm.Buf[10], &Comm.Buf[14], 4 );
memcpy( (char*)&Comm.Buf[14], &Comm.Buf[18], 4 );
memcpy( (char*)&Comm.Buf[18], &Comm.Buf[22], 4 );
memcpy( (char*)&Comm.Addr, &Comm.Buf[26], 4 ); //保存主叫地址
memcpy( (char*)&Comm.Buf[22], &Buffer, 4 );
memcpy( (char*)&Buffer, &Comm.Buf[30], Rs_Len-22 );
memcpy( (char*)&Comm.Buf[26], &Buffer, Rs_Len-22 );
Rs_Len -= 4;
Comm.RpTmr=TM_20000ms;
break;
default:
Rs_Head1 = 0xFF;
break;
}
Comm.flag=0xFF;
}
////////////////////////////////////////////////////////////////////////////////
else //无中继命令
{
switch( Rs_Ctl & 0x0F )
{
case RS_CTL_Read: // 读数据
Tmp = Com_Read();
if( Tmp == 0 ) Rs_Ctl = 0x81;
else
{
Rs_Ctl = 0xC1; //异常应答
Rs_Len = 6;
memcpy( (char*)&Buffer, &Rs_Addr0, 4 );
memcpy( (char*)&Rs_Addr0, &Comm.Buf[10], 4 );
memcpy( (char*)&Comm.Buf[8], &Buffer, 4 );
Comm.Buf[12]=Flag.Meter;
Comm.Buf[13]=Tmp;
}
break;
case RS_CTL_Write: // 写数据
Tmp = Com_Write();
if( Tmp == 0 ) Rs_Ctl = 0x84;
else
{
Rs_Ctl = 0xC4;
Rs_Len = 6;
memcpy( (char*)&Buffer, &Rs_Addr0, 4 );
memcpy( (char*)&Rs_Addr0, &Comm.Buf[10], 4 );
memcpy( (char*)&Comm.Buf[8], &Buffer, 4 );
Comm.Buf[12]=Flag.Meter;
Comm.Buf[13]=Tmp;
}
break;
default: Rs_Head1 = 0xFF;
break;
}
}
}
} else Rs_Head1 = 0xFF;
}
}
/*****************************************************************
The state of communication access
*****************************************************************/
void Proc_Comm(void)
{
int check;
char tmpL,tmpH;
switch(Comm.Mode)
{
case 0:
U0TCTL= 0X10;
U0BR0 = 0X1A; //波特率1219bps
U0BR1 = 0X00;
U0MCTL = 0X7F;
IFG1&=~URXIFG0;
IE1 |= URXIE0 ; //进入接收状态
IE1 &= ~UTXIE0;
Flag.Run &= ~R_ComOK;
Comm.Mode++;
Comm.Ptr = 0;
break;
case 1:
if( Comm.Ptr != 0 )
{
if( Flag.Run & R_ComOK )
{
Comm.MdTmr = TM_50ms;
check = ChkNum( &Comm.Buf[2], Rs_Len+6 ) - CHECKWORD;
tmpL=(char)check;
tmpH=(char)(check>>8);
if( (Rs_CSL == tmpL) && (Rs_CSH == tmpH) ) //判断校验有无出错
{
Comm_Ctrl();
if( Rs_Head1 == 0x09 )
{
check = ChkNum( &Comm.Buf[2], Rs_Len+6 ) - CHECKWORD;
Rs_CSL=(char)check;
Rs_CSH=(char)(check>>8);
Comm.Mode++;
IFG1&=~UTXIFG0;
IE1 |= UTXIE0 ; //进入发送状态
IE1 & ~URXIE0;
}
else Comm.Mode = 0;
}
else Comm.Mode = 0;
}
else if( Comm.MdTmr==0 ) Comm.Mode = 0;
}
break;
case 2:
if( Comm.MdTmr==0 )
{
Flag.Run &= ~R_ComOK;
Comm.Mode++;
Comm.Ptr = 1;
U0TXBUF=Rs_Head1;
Comm.MdTmr = TM_2500ms;
}
break;
case 3:
if( Flag.Run & R_ComOK )
{
Comm.Mode = 0;
}
else if( Comm.MdTmr==0 ) Comm.Mode = 0;
break;
default:
Comm.Mode = 0;
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -