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

📄 or100_sw.c

📁 用STC单片机实现光发射机的自动增益控制
💻 C
📖 第 1 页 / 共 2 页
字号:

	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 + -