main.c

来自「此源码为商用的电力抄表系统的从机端源程序。通过电力载波模块」· C语言 代码 · 共 507 行 · 第 1/2 页

C
507
字号
	}setup_t4(40, timeout_t4);delay_tx = 1;	 		
}
 /*=============================================================================*/
/*						   数据发送到PC									   */
/*=============================================================================*/

void amr_send_frame(uchar ibuf[])
{
 // idata uchar o_frame[26];
  uchar  i;
  uchar  En;

       En = ibuf[AMR_OS_L] + 11;  //串口返回	

	clr_wdt();
    // preamble
    for (i = 0; i < 5; i++) amr_frame[i] = mcu_pc[i];	//放入0xFE	68
     clr_wdt();  
	for (i = 0; i < ibuf[AMR_OS_L]+6; i++)amr_frame[5+i] = ibuf[i];  //从C开始存放	        

    amr_frame[En] = 0x16;  //多补16h    
    uart_sendblock(amr_frame, En+1); //串口送至PC
    clr_wdt(); 
}
/*=============================================================================* /
						   信息返回
/*=============================================================================*/

void return_inf(uchar frame,uchar inf_buf[],uchar dat)
{	
    uchar con;
    uchar buf[18];
	clr_wdt();
	buf[0] = frame;
    buf[1] = ADDR[0];
	buf[2] = ADDR[1];
	buf[3] = ADDR[2];
	buf[4] = ADDR[3];
    buf[AMR_OS_L] = dat;
    for(con = 0;con < buf[AMR_OS_L];con ++)     
	    buf[6+con] = inf_buf[con];	//放入状态信息

	amr_send_frame(buf);//串口返回PC

}
/*=============================================================================* /
						串口发到2200C
/*=============================================================================*/

void uart_tx_mode(uchar i_buf[])
{  
    uchar i,tom;
	uchar no_all = 0;
	uchar o_buf[18];
     tom = i_buf[AMR_OS_L] + 6;
     for (i = 0; i < tom; i++) //C, A,A,A,A,L, DATA
	   o_buf[i]	 = 	i_buf[i];//放入DATA数据

	 if(tom < 18){		  //不够18个数据后补0
	   no_all = 18 - tom;
	   for (i = 0; i < no_all; i++)
	   o_buf[tom+i]	 = 	0x00; 
	 }

	 if(i_buf[AMR_OS_L] > 18)i_buf[AMR_OS_L] = 18;//超过18个数只认18个数


	 write_txbuffer(o_buf);	//写入2200c
	 sync_sendchar(0x7e);
}
/*=============================================================================* /
						接收数据重组
/*=============================================================================*/

void rx_return(bit y,uchar R_data[])
{
 uchar i;
 uchar o_buf[26];

   for (i = 0; i < 18; i++)
	   o_buf[i]	 = 	R_data[i];
   if(y)
	 o_buf[0] = 0x40 + 0x04; //本地上传收到的CRC正确数据  B7B6 =bit-01,B5~B0 = 0x04h
   else
     o_buf[0] = 0x40 + 0x05; //本地上传收到的CRC错误数据  B7B6 =bit-01,B5~B0 = 0x05h

   amr_send_frame(o_buf);
}

/*=============================================================================*/
void adss_crc(uchar buf[])
{
  //0x99 为公共广播地址
 if((buf[1] == ADDR[0])&&(buf[2] == ADDR[1])&&(buf[3] == ADDR[2])&&(buf[4] == ADDR[3]))
    adss_ok = 1;  //本地址
 else adss_ok = 0;

 if( (buf[1] == 0x99)&&(buf[2] == 0x99)&&(buf[3] == 0x99)&&(buf[4] == 0x99))
    public_addr = 1;  //公用地址
 else public_addr = 0;
 
}
/*=============================================================================*/
/*=============================================================================*/

void write_addr (bit y,uchar frame[])
{
  //frame[] = C(B7B6 01,B5~B0 0x3f), x,x,x,x,L(1), (x+x+x+x)地址校验和,

  uchar add_buf[4];
  uchar ame;

  if(frame[AMR_OS_L] == 0x01)
  if((frame[1] + frame[2] + frame[3] + frame[4]) ==  frame[6]){
   for(ame = 0;ame < 4; ame ++)
   add_buf[ame] = frame[1+ame];
   Rxok   = 0; //完成任务亮!
   while(~switd){
   if(~switd){  //开关触动才可写入FLASH
	   EA = 0; 
	   FLASH_WriteNByte((int code *)ADDR, add_buf, 6);
	   EA = 1;
       
    } }
   add_buf[0] = frame[6];
  if(y)
   Remote_Replies(frame);//回复
   else return_inf(0x3f,add_buf,1);
  }
}


/*=============================================================================* /
                        数据接收处理
/*=============================================================================*/
void processing_unit(uchar frame[])
{
     uchar top;
   
     uchar pro_buf[7];
     if(((frame[AMR_OS_C] & 0xc0)>>6)== 0x02) //B7B6  控制字
     switch(frame[AMR_OS_C] & 0x3f){//B5~B0 命令字
      
       case 0x01:{reply = 1;}break;

       case 0x02:{reply = 0;}break;
 
       case 0x3f:{  // 远程改地址命令
         if(public_addr){   //公共地址正确
          if(frame[11] == 0x16){//结束语
          for(top = 1;top < 5; top ++) //地址数据导入
           pro_buf[top] = frame[5+top];  
           pro_buf[0] = frame[0];
           pro_buf[AMR_OS_L] = 0x01;//
           pro_buf[6] = frame[10];  //地址校验和
           write_addr (1,pro_buf);
          }//pro_buf[] = C, x,x,x,x,L(1), (x+x+x+x)地址校验和,0x16
         }}break;
     }
}

/*=============================================================================*/
/*=============================================================================* /



/*=============================================================================*/
/*=============================================================================* /

/*=============================================================================*/
/*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$<<<<<软件说明>>>>>$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$*/
/*=============================================================================* /
    家电智能控制统一程序(根据UPLM2200 API协议设定)
软件说明:

   1.更新的版本,支持电力线和PC通讯协议,
   2.可读写FLASH作为地址掉电保存,写时通过串口发地址数据,掉电后地址在片内保存.
   3.当写FLASH时,RXOK会闪动,之后返回一帧数据.表示已写入FLASH,
   4.该程序设有看门狗,添加新组件时注意时间差.
   5.如无接表时,可返回一帧仿真数据< *\   /* >
   6.该串口的波特率为9600,偶校验,      -
   7.可通过PC或电力线上改变速率寄存器的值,并写入 FLASH  ~
   
更新项目表:
------------------------------------------------------------------------------------------
|更新人   |   模块组件       |       更新时间   |    更新内容
--------------------------------------------------------------------------------------
| liangfq |     全部         | 2006-02-17       |    程序设计第一版
|         |                  |                  |  
--------------------------------------------------------------------------------------
| liangfq |           |  | 
|         |                  |                  |
--------------------------------------------------------------------------------------
| liangfq |            |  | 
|         |                  |                  |
--------------------------------------------------------------------------------------
| liangfq |                  |                  |
|         |                  |                  |
--------------------------------------------------------------------------------------
| liangfq |                  |                  |
|         |                  |                  |
--------------------------------------------------------------------------------------
| liangfq |                  |                  |
|         |                  |                  |
--------------------------------------------------------------------------------------
| liangfq |                  |                  |
|         |                  |                  |
--------------------------------------------------------------------------------------
| liangfq |                  |                  |
|         |                  |                  |
--------------------------------------------------------------------------------------
| liangfq |                  |                  |
|         |                  |                  |
--------------------------------------------------------------------------------------

!!!!!!重复特别注意:写模块的地址必须从串口写入才有效!!!!!                  

!!!!!!重复特别注意:写模块的地址必须从串口写入才有效!!!!!
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
!!!!!!重复特别注意:写模块的地址必须从串口写入才有效!!!!!
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
!!!!!!重复特别注意:写模块的地址必须从串口写入才有效!!!!!
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
!!!!!!重复特别注意:写模块的地址必须从串口写入才有效!!!!!
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

/*$$$$$$$$$$$$$$$$$$$$$$$$$$$$<<<<<软件说明>>>>>$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$*/








         
















⌨️ 快捷键说明

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