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

📄 amr_cctr.c

📁 此源码为商用的电力抄表系统的主机端源程序。通过电力载波模块
💻 C
字号:
/*=============================================================================*/
// amr_cctr.c  - source file for lme2200 API
// 
// Copyright 2005, Leaguer MicroElectronics Co., Ltd
// www.leaguerme.com
/*=============================================================================*/

#include <REG922.H>

#include "sart.h"
#include "plc.h"
#include "string.h"
#include "amr_cctr.h"
#include "amr_config.h"
#include "wr_flash.h"
//#include "pc_com.h"
#include "timer.h"
#define uint unsigned int
#define uchar unsigned char


extern idata uchar amr_frame[];  // AMR frame buffer
extern idata uchar plc_frame[18];
extern uchar code return_frame[] = {0xfe,0xfe,0xfe,0xfe,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x01,0x02,0x43,0xc3,0xd9,0x16}; //18bybe;
extern code uchar  METER_ADDR[6];
extern bit  NO_METER;

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

void amr_init()
{
test_meter();
}

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

// Check the checksum of the frame
uchar amr_check_cs(uchar frame[],bit Q)
{
   uchar i;
   uchar len;
   uchar cs = 0xd0; ///2 * 68

  if(Q) len = frame[1] + 2;  //*<---1* 
  else  len = frame[AMR_OS_L] + 8;  //*<---7*
  

   for(i = 0; i < len; i++)
   	   cs += frame[i];

   return cs;//(cs == frame[i]); 
}
/*=============================================================================*/


uchar amr_calcu_cs(uchar frame[], uint len,uchar i)
{
 uchar cs;
 uchar j;
  cs = 0;
  for (j = i; j < len; j++)
    cs += frame[j];

  return cs;
}

/*=============================================================================*/
/*						   数据发送到PC									   */
/*=============================================================================*/

void amr_send_frame(uchar addr[6], uchar buf[])
{
  idata uchar frame[23];
  uchar  i;
  uchar  En;
   
     En = buf[AMR_OS_L] +2;
    for (i = 0; i < En+1; i++)
        frame[i] = buf[6 + i];//从C开始存放
  // preamble
  for (i = 0; i < 4; i++)  amr_frame[i] = AMR_PREAMBLE;	//放入0xFE

  // address
  amr_frame[4] = AMR_FRAMESYNC;		//0x68
  clr_wdt();
  for (i = 5; i < 11; i++)   amr_frame[i] = addr[i-5];	   //6位地址

  amr_frame[11] = AMR_FRAMESYNC;
  
// C, L and data including CS	
  for (i = 0; i < En+1; i++) amr_frame[12+i] = frame[i];
 
  amr_frame[13 + En] = 0x16;  //多补16h
  
  uart_sendblock(amr_frame, 14 + En); //串口送至表
  clr_wdt(); 
}

/*=============================================================================*/
void test_meter()
{ 
  uchar chr = 0;
  uint i,cone; 
  for(i = 0; i < 18; i++)
   plc_frame[i] = return_frame[i];

  for(i = 0;i < 6;i ++)
   plc_frame[5+i]  =  METER_ADDR[i];

  plc_frame[16] =  0x00;
  plc_frame[16] = amr_calcu_cs(plc_frame, 16,4);   //校验和

  uart_sendblock(plc_frame, 18);

  while(1){// 
	 if(uart_recved()) {  // AMR frame recved from meter
		  if (recv_amr_frame())	{ 
		     for(i = 0; i < 14; i++)chr += amr_frame[i]; 
	          chr += 0xd0;
		 	 if( amr_frame[14] == chr){
	             NO_METER = 1;//有表	 	
	         }
		 }
		} 
	 if(cone++ > 25000)return;//已定好时间
  }

}

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

/*$$$$$$$$$$$$$$$$$$$$$$$$$$$$<<<<<软件说明>>>>>$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$* /
                               软件修改说明在main.c,敬请留意

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

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





⌨️ 快捷键说明

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