📄 or100_sw.c
字号:
trans_buff = netlayer_buff_G[2]+3; //netlayer_buff_G[2]是网络层数据的长度,加3(网络层命令+起始地址+读出字节数)就是整个净负荷(网络层)长度
check_sum += trans_buff;
while(!TI);
TI = 0;
SBUF = trans_buff; //MAC包长度
//================= 以下为网络层 ==============
trans_buff = netlayer_buff_G[0]+0x80; //网络层命令,加0x80区别上下行数据包
check_sum += trans_buff;
while(!TI);
TI = 0;
SBUF = trans_buff;
trans_buff = netlayer_buff_G[1]; //网络层起始地址
check_sum += trans_buff;
while(!TI);
TI = 0;
SBUF = trans_buff;
trans_buff = netlayer_buff_G[2]; //网络层读出数据的长度
check_sum += trans_buff;
while(!TI);
TI = 0;
SBUF = trans_buff;
if(netlayer_buff_G[0] == 0x1) addr = ConstSelf;
else addr = value_G;
addr += netlayer_buff_G[1];
do
{
trans_buff = *addr; //网络层读出的数据
check_sum += trans_buff;
while(!TI);
TI = 0;
SBUF = trans_buff;
if(trans_buff==0xA5) //如果是0xA5则再发送一次
{ //我们分析,在MAC层全部以及网络层的前部分都不可能出现0xA5,唯一有可能出现0x5A的情况只在网络层读出的数据中
while(!TI);
TI = 0;
SBUF = trans_buff;
}
addr++;
netlayer_buff_G[2] = netlayer_buff_G[2]-1;
} while(netlayer_buff_G[2]>0);
//==============================================
trans_buff = -check_sum; //校验和
while(!TI);
TI = 0;
SBUF = trans_buff;
while(!TI);
TI = 0;
//==============================================
enES_un485trans(); //禁止发送并允许串口中断
return(OK);
}
//由于事先写入或默认初始写入的数据已经字节倒序了,所以本程序不用再字节倒序
/* MAC包结构为:同步(1byte)+MAC地址(1byte)+长度(1byte)+净负荷(n byte)+校验(1byte) */
/* 其中网络包结构为:命令(1byte)+起始地址(1byte)+字节数(1byte)+网络层数据(n byte) */
//输入:无,但实际上用了全局变量netlayer_buff_G
//输出:无
//本程序中同时完成了串口上传数据
unsigned char RdSet(void)
{
//unsigned char offset,lenth;
unsigned char trans_buff, check_sum;
unsigned char *addr;
unsigned char temp;
//union { float flt; unsigned char bytes[4]; } float2byte ;
temp = netlayer_buff_G[1]+netlayer_buff_G[2];
if( temp>SET_AREA_LEN || netlayer_buff_G[2]==0x0) //按照通讯协议,控制量边界不能超过88
return(FAULS); //如果写范围超出变量区的范围则返回错误
unES_en485trans(); //禁止串口中断并允许发送
//==============================================
SBUF = 0xA5; //同步头
trans_buff = SELF_MAC_ADDR ; //取本机地址
check_sum = trans_buff;
while(!TI);
TI = 0;
SBUF = trans_buff;
trans_buff = netlayer_buff_G[2]+3; //netlayer_buff_G[2]是网络层数据的长度,加3(网络层命令+起始地址+读出字节数)就是整个净负荷(网络层)长度
check_sum += trans_buff;
while(!TI);
TI = 0;
SBUF = trans_buff; //MAC包长度
//================= 以下为网络层 ==============
trans_buff = netlayer_buff_G[0]+0x80; //网络层命令,加0x80区别上下行数据包
check_sum += trans_buff;
while(!TI);
TI = 0;
SBUF = trans_buff;
trans_buff = netlayer_buff_G[1]; //网络层起始地址
check_sum += trans_buff;
while(!TI);
TI = 0;
SBUF = trans_buff;
trans_buff = netlayer_buff_G[2]; //网络层读出数据的长度
check_sum += trans_buff;
while(!TI);
TI = 0;
SBUF = trans_buff;
//--------------------以下取网络层数据-----------------
addr = CurrentSet + netlayer_buff_G[1];
do
{
trans_buff = *addr; //网络层读出的数据
check_sum += trans_buff;
while(!TI);
TI = 0;
SBUF = trans_buff;
if(trans_buff==0xA5) //如果是0xA5则再发送一次
{ //我们分析,在MAC层全部以及网络层的前部分都不可能出现0xA5,唯一有可能出现0x5A的情况只在网络层读出的数据中
while(!TI);
TI = 0;
SBUF = trans_buff;
}
addr++;
netlayer_buff_G[2] = netlayer_buff_G[2]-1;
} while(netlayer_buff_G[2]>0);
//==============================================
trans_buff = -check_sum; //校验和
while(!TI);
TI = 0;
SBUF = trans_buff;
while(!TI);
TI = 0;
//==============================================
enES_un485trans(); //禁止发送并允许串口中断
return(OK);
}
//写变量
/* 网络包结构为:命令(1byte)+起始地址(1byte)+字节数(1byte)+网络层数据(n byte) */
//变量区共21字节://当前告警的数量//当前保护状态//其它状态//保护使能设置//其它设置//4组采样浮点数
/* 只有对//保护使能设置//其它设置//的写才是有效的,对其它变量的写(可以)不动作但做出正确响应*/
//输入:无,但实际上用了全局变量value_G和netlayer_buff_G
//输出:写成功与否
unsigned char WriteValue(void)
{
unsigned char offset, lenth, temp;
offset = netlayer_buff_G[1]; //起始地址
lenth = netlayer_buff_G[2]; //字节数
temp = offset+lenth; //终止地址
if(temp>68 || lenth==0x0) return(FAULS); //如果写范围68超出变量区的范围或长度为0则返回错误
if(lenth > 4) return(FAULS); //如果写长度过长会引起缓冲区溢出(协议规定一次不能超过4字节)也直接返回错误
// if(offset > 4 || temp <3 ) //如果写范围未覆盖第3,4字节(保护使能设置//其它设置)
// return(RIGHT); //直接返回正确不操作
for(temp=0;temp<lenth;temp++)
*(value_G+offset+temp) = netlayer_buff_G[3+temp];
return(RIGHT);
}
/* 恢复出厂设置 */
unsigned char ResetDefault(void)
{
extern unsigned char code DefaultSet[]; //保存在代码段的出厂默认设置
if(CurrentSet[0]==0x55) return(RIGHT); //如果当前本来就是默认设置,则直接返回成功
wr_eeprom(SET_AREA_LEN,DefaultSet);
return(RIGHT);
}
//写控制量:包括“输出衰减”与"其它设置",都是unsigned char型的
/* 网络包结构为:命令(1byte)+起始地址(1byte)+字节数(1byte)+网络层数据(n byte) */
//根据通讯协议,每次只能对完整的一组数据进行更新(写),所有只有三种情况:其它设置、输出RF衰减1、输出RF衰减2
//都是unsigned char,实际上输出RF衰减是signed char,只是在存贮和读取时当作unsigned的
//输入:无,但实际上用了全局变量netlayer_buff_G
//输出:写成功与否
/* 目前预留
unsigned char WriteSet(void)
{
unsigned char temp;
//unsigned char offset,wr_data;
if(netlayer_buff_G[2]!=0x1 ) //按照通讯协议,一次只能写完整一个组,即只能1个字节
return(FAULS); //如果写范围超出变量区的范围则返回错误
//----------对于仿真情况下:直接用下传网络层的数据将SIMULATE_EEP相应地址的数据覆盖掉----------
#ifdef DEBUG
SIMULATE_EEP[0] = 0xAA; //用户设置标记:一旦用户进行了改写,这个字节都为0xAA
temp = netlayer_buff_G[1];
SIMULATE_EEP[temp] = netlayer_buff_G[3]; //解释+3:netlayer_buff_G前3个字节是command,offset,lenth,从下面起才是数据
//----------------------对于真实应用-------------------------
#else
//--------------先将eeprom中的数据取出存到一个缓冲区eep_buff中--------------
for(temp=0;temp<SET_AREA_LEN;temp++)
eep_buff[temp]=CurrentSet[temp];
//--------------以下先将下行包中的数据覆盖eep_buff中相应的门限组--------------
eep_buff[0] = 0xAA; //用户设置标记:一旦用户进行了改写,这个字节都为0xAA
temp = netlayer_buff_G[1]; //起始地址
eep_buff[temp] = netlayer_buff_G[3];
//-------------最后将数组netlayer_buff_G的内容写回eeprom里去-------------------
wr_eeprom(SET_AREA_LEN,eep_buff);
#endif
//-------------------------------------------------
return(RIGHT);
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -