📄 amr_cctr.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 + -