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 + -
显示快捷键?