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

📄 rscomm.c

📁 串口通讯程序,这个程序给出一个参考,并且带645协议部分
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <msp430x42x.h>
#include <string.h>
#include "inc\Port.h"
#include "inc\Common.h"
#include "inc\Type.h"
#include "inc\Interrupt.h"
#include "inc\General.h"
#include "inc\Mem.h"
#include "inc\Data.h"
#include "CDdata.c"

/*****************************************************************
	判断是否是广播操作 99999999
*****************************************************************/
int Addr_9_9( void )          
{
	char	i;
	for( i=2; i<6; i++ )
	     if( Comm.Buf[i] != 0x99 )    return -1; 
	return 0;
}
/*****************************************************************
	判断是否为非法表号00000000
*****************************************************************/
int Addr_0_0( void )          
{
	char	i;
	for( i=2; i<6; i++ )
	     if( Comm.Buf[i] != 0x00 )    return -1; 
	return 0;
}
/*****************************************************************
	Get Communication Variable  获取DI0,DI1对应的数据地址和长度
*****************************************************************/
int GetComVar( int* Addr, int* Info )
{
	int i, Tmp;

  	Tmp = ((int)Rs_IDH<<8)+ (int)Rs_IDL;      //D10,D11
  	for( i = 0 ; i < CommNum ; i++ )
		if( Tmp == ComTab[i].ComID )
		{
			*Addr = (int)ComTab[i].Addr;
			*Info = ComTab[i++].ComInfo;
			return 0;
		}
	return -1;
}
/*****************************************************************
	Read Data to 
*****************************************************************/
unsigned char Com_Read(void)
{
	int 	Addr, Info,Tmp;
	char	Len,MemType,EventNum,Total;
  	unsigned char Err_Byte=0;
 
        Tmp = ((int)Rs_IDH<<8)+ (int)Rs_IDL; 
        if( GetComVar( &Addr, &Info ) == -1 )     //数据标识错     
        {
            Err_Byte |= RS_State_IVID;
            return  Err_Byte;
	}
        if( ( Info & EN_R ) == 0 )             //权限不够,不可读
	{
	    Err_Byte |= RS_State_RgtE;
	    return  Err_Byte;
	}     
        switch( Tmp )
        {
             case 0x7010:           //事件记录
             case 0x7020: 
             case 0x7030: 
             case 0x7040: 
             case 0x7050: 
             case 0x7060: 
             case 0x7070: 
             case 0x7080: 
             case 0x7090: 
	               Len = Info & RS_LEN;
	               MemType = (Info>>6)&0x07;
                       MEM_Read( (char*)&Total, (long)Addr+1, 1, MemType );
                       if( Total==0 )
                       {
                            memset( (char*)&Comm.Buf[15], 0xFF, Len );	
                       }  
                       if( Total==1 )
                       {
                            E2P_Read( (char*)&EventNum, (long)Addr, 1 ); 
                            if( EventNum==0 )  EventNum=19;
                            else   EventNum-=1;
                            TempAddr=(long)Addr+EventNum*Len/2+2;    
                            AT24C_Read( &Comm.Buf[15],TempAddr,Len/2 );
                            memset( (char*)&Comm.Buf[15+Len/2], 0xFF, Len/2 );	
                       }
                       if( Total>1)
                       {
                            E2P_Read( (char*)&EventNum, (long)Addr, 1 ); 
                            if( EventNum<2 )   EventNum+=20;
                            EventNum-=2;
                            TempAddr=(long)Addr+EventNum*Len/2+2;    
                            AT24C_Read( &Comm.Buf[15],TempAddr,Len );
                       }
                       break;
             case 0xC330:
             case 0xC340: 
             case 0xC350:
             case 0xC360:
             case 0xC370: 
             case 0xC380:
             case 0xC390:
             case 0xC320:
             case 0xC410:
                       E2P_Read( (char*)&Len,(long)Addr+22,1);  
                       if( Len > MaxSeg ) Len = MaxSeg;
                       Len = 2*Len;
	               AT24C_Read( &Comm.Buf[15], (long)Addr, Len );
                       break;
             case 0xC41E:
                       E2P_Read( (char*)&Len,SeasNum,1);  
                       if( Len > MaxSeg ) Len = MaxSeg;
                       Len = Len+1;
	               AT24C_Read( &Comm.Buf[15], (long)Addr, Len );
                       Comm.Buf[15] &=0x7F;
                       break;
             case 0xC035:        //继电器操作  需要密码支持的命令 relay operation
                       Len = Info & RS_LEN;
                       if( P1IN & P_RelayAsk )
                           Comm.Buf[15]=0x5F;
                       else
                           Comm.Buf[15]=0x50;
                       break;
             case 0xA000:       // read all parameters
                       Len = Info & RS_LEN;
                       FRAM_Read( (char*)&Comm.Buf[15], EC_Pp0,20);
                       memcpy( (char*)&Comm.Buf[35], Energy.Real_VRMS,2);
                       memcpy( (char*)&Comm.Buf[37], Clk.Sec,7);
                       E2P_Read( (char*)&Comm.Buf[44], LatchEvents,1);
                       if( P1IN & P_RelayAsk )
                           Comm.Buf[45]=0x5F;
                       else
                           Comm.Buf[45]=0x50;
                       break;
             default:
	               Len = Info & RS_LEN;
	               MemType = (Info>>6)&0x07;
	               MEM_Read( &Comm.Buf[15], (long)Addr, Len, MemType );
                       break;
        }
        Rs_Len = 7+Len;
        memcpy( (char*)&Buffer,   &Rs_Addr0, 4 );
        memcpy( (char*)&Rs_Addr0, &Comm.Buf[10], 4 );
        memcpy( (char*)&Comm.Buf[10], &Buffer, 4 );
        Comm.Buf[14]=Flag.Meter;
	return Err_Byte;
}
/*****************************************************************
 	write data into meter
*****************************************************************/
unsigned char Com_Write(void)
{
	int	Addr, Info,Tmp;
	char	MemType,Len;
	unsigned char Err_Byte=0;

        Tmp = ((int)Rs_IDH<<8)+ (int)Rs_IDL; 
        if( GetComVar( &Addr, &Info ) == -1 )     //数据标识错     
        {
            Err_Byte |= RS_State_IVID;
            return  Err_Byte;
	}
        if( ( Info & EN_W ) == 0 )             //权限不够,不可写
	{
	    Err_Byte |= RS_State_RgtE;
	    return  Err_Byte;
	}   
        FRAM_Read( (char*)&Buffer[0],Meter_Pass,4);
        if( memcmp( &Comm.Buf[14], Buffer, 4 ) != 0 ) 
        {
            Err_Byte |= RS_State_PswE;
	    return  Err_Byte;
        }  
        switch( Tmp )
        {
             case 0xC035:        //继电器操作  需要密码支持的命令
                       if( Comm.Buf[18]==0x50 )   Flag.Relay |= F_Off;
                       if( Comm.Buf[18]==0x5F )   Flag.Relay |= F_On;
                       break;
             case 0xC330:
             case 0xC340: 
             case 0xC350:
             case 0xC360:
             case 0xC370: 
             case 0xC380:
             case 0xC390:
             case 0xC320:
             case 0xC410:
                       Len = Rs_Len-10;
                       if( Len>20 ) Len=20;
                       AT24C_Read( (char*)&Buffer[0],Addr,20);
                       memcpy( (char*)&Buffer[0],(char*)&Comm.Buf[18],Len);
	               MEM_DBWrite( Addr, (char*)&Buffer[0], 20,Mem_E2PROM);
                       Len = Len/2;
                       E2P_Write( Addr+22, (char*)&Len, 1);
                       E2P_Write( Addr+E2PROMBAK+22, (char*)&Len, 1);
                       break;
             case 0xC41E:
                       Len = Info & RS_LEN;
	               MEM_DBWrite( Addr, (char*)&Comm.Buf[18], 11,Mem_E2PROM);
                       break; 
             case 0xC011:        //Soft Time
                       MEM_DBWrite( Addr, (char*)&Comm.Buf[18], 7 ,Mem_FRAM);   //FRAM
	               memcpy( (char*)&Clk.Sec[0], (char*)&Comm.Buf[18], 7);   //RAM
                       break;
             default:
                       Len = Info & RS_LEN;
	               MemType = (Info>>6)&0x07;
	               MEM_DBWrite( Addr, &Comm.Buf[18], Len ,MemType);
                       break;
        }
        Rs_Len = 5;
        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;
	return Err_Byte;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -