📄 zb_to_dlt645.c
字号:
/********************************************************************
包含头文件
********************************************************************/
#include "PL3200.H"
#include "CONST.H"
#include "RAM.H"
#include "IO.H"
/********************************************************************
函数名称: void com0_send(uint8 dat)
功 能: 串口1发送子程序,偶校验
入 口: 无
出 口: 无
********************************************************************/
void com0_send(uint8 dat)
{
uint8 i ;
uint8 temp ;
bit crc_bit=0 ;
soft_bit = 1 ;
ETB8 = 0 ;
temp = dat ;
for(i=0;i<8;i++)
{
if(temp&0x01)
crc_bit = !crc_bit ;
temp = temp>>1 ;
}
if(crc_bit) ETB8 = 1 ;
ETI = 0 ;
SBUF1 = dat ;
while(!ETI) ;
ETI = 0 ;
}
/********************************************************************
函数名称: void ZB_To_DLT645(void)
功 能: 把载波数据转化为DLT645数据格式,并发送给上位机
入 口: 无
出 口: 无
********************************************************************/
void ZB_To_DLT645(void)
{
uint8 i ;
uint8 temp_crc=0 ;
for(i=0;i<3;i++) //载波接收的目的地址为BB,BB,BB时才上传
{
if(zb_rece_buf_bak[i]==0xbb)
continue ;
else
return ;
}
led_time = BASE_LED_TIME ;
UP_OK_IO = 0 ; //置向上一级芯片传送指示
for(i=0;i<255;i++) //使上一级芯片有充分时间能检测到此管脚为低,进入串口转发
{
UP_OK_IO = 0 ;
}
ES1 = 0 ; //关闭串口中断,禁止串口接收
SCON1 = 0xc0 ;
com0_send(0xff) ;
com0_send_buf[0] = 'D' ;
com0_send_buf[1] = 'A' ;
com0_send_buf[2] = 'T' ;
com0_send_buf[3] = zb_rece_buf_bak[4]+2+5 ;//+2 ;
//com0_send_buf[4] = 0x09 ;
//com0_send_buf[5] = 0xaf ;
for(i=0;i<(zb_rece_buf_bak[4]+7);i++)
{
com0_send_buf[4+i] = zb_rece_buf_bak[i] ;
}
for(i=0;i<(com0_send_buf[3]+4);i++)
{
com0_tmr = 60 ;
com0_send(com0_send_buf[i]) ;
}
com0_send('A') ;
UP_OK_IO = 1 ; //清向上一级芯片传送指示
SCON1 = 0xd0 ;
ES = 1 ;
}
/********************************************************************
函数名称: void Series_Data_Upload(void)
功 能: 把DLT645数据以数据流的方式向上转发
入 口: 无
出 口: 无
********************************************************************/
void Series_Data_Upload(void)
{
ES1 = 0 ; //关串口中断,串口停止接收
EIE = 0 ;
EA = 0 ;
WDT_RST = 0xa1 ;
if(!BELOW_OK_IO)
{
UP_OK_IO = 0 ; //置向上一级芯片传送指示
while(!BELOW_OK_IO)
{
if(UP_DATA_IO)
TXD_IO = 1 ;
else
TXD_IO = 0 ;
}
UP_OK_IO = 1 ; //清向上一级芯片传送指示
}
ES1 = 1 ; //开串口中断,串口允许接收
EIE = 1 ;
EA = 1 ;
}
/********************************************************************
函数名称: void VersionAnswer(void)
功 能: 特殊应答,回复厂商代码 'I' 'D' 0x30 0x31 0x0d 0x0a
入 口: 无
出 口: 无
********************************************************************/
void VersionAnswer(void)
{
uint8 i ;
uint8 temp_crc=0 ;
ES1 = 0 ;
SCON1 = 0xC0 ; //禁止接收
com0_send(0xff) ;
com0_send_buf[0] = 'I' ;
com0_send_buf[1] = 'D' ;
com0_send_buf[2] = 0x30 ;
com0_send_buf[3] = 0x31 ;
com0_send_buf[4] = 0x0d ;
com0_send_buf[5] = 0x0a ;
for(i=0;i<6;i++)
{
com0_tmr = 20 ;
com0_send(com0_send_buf[i]) ;
}
SCON1 = 0xd0 ;
ES1 = 1 ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -