⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rscomm.c

📁 串口通讯程序,这个程序给出一个参考,并且带645协议部分
💻 C
📖 第 1 页 / 共 2 页
字号:
/*****************************************************************
	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 + -