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

📄 comm.c

📁 该程序完成了c8051外围电路的驱动和串口协议的编写。希望能给大家学习51单片机带来帮助
💻 C
📖 第 1 页 / 共 2 页
字号:
					{
						*(unsigned int xdata *)&pOutput->uiTripValue[pInput[4] - 1] = *(unsigned int *)&pInput[5];
					 	WriteSystemPara(0,(unsigned char xdata *)pOutput, PARALENGTH*2);
					}
					else if ((pInput[4] == 3) || (pInput[4] == 4))
					{
						*(unsigned int xdata *)&pOutput->uiTripValue[pInput[4] - 3] = *(unsigned int *)&pInput[5];
					 	WriteSystemPara(0,(unsigned char xdata *)pOutput, PARALENGTH*2);				
					}
					else if (pInput[4] == 0xff)
					{
						*(unsigned int xdata *)&pOutput->uiTripValue[0] = *(unsigned int *)&pInput[5];
						*(unsigned int xdata *)&pOutput->uiTripValue[1] = *(unsigned int *)&pInput[5];
						WriteSystemPara(0,(unsigned char xdata *)pOutput, PARALENGTH*2);
					}
				}
				break;

			case READ_MODULE_STYLE :     //0x10    读模块类型
				 ReportModuleType(MODULE20, ReadCANAddress());
				 break;

			case SYSTEMSELFTEST:		//0x30   系统自检测试
				SetSelfTestControlStatusMain(*(unsigned int *)&pInput[4]);
				break;

			default :
				break;
		}
	}
}

//--------------------------------------------------------------------------------------------------
//函数名称:void JudgeChannelTypePara(void)
//功    能:判断通道类型的参数,如果通道类型不正确,则默认通道类型
//输入参数:无
//返    回:无
//--------------------------------------------------------------------------------------------------
void JudgeChannelTypePara(void)
{
	if (((uiForeChannelType > 12) && (uiForeChannelType < 19)) || (uiForeChannelType == 21) || (uiForeChannelType == 22)
		|| (uiForeChannelType == 28))
	{
		;
	}	
	else
	{
		uiForeChannelType = 13;
	}	
}

//----------------------------------------------------------------------------------------------
//函数名称:void SetModuleStatusCOMM(unsigned char uchModuleFlag)
//功    能:从框架模块中将模块状态设置到通信模块中
//输入参数:模块状态
//返    回:无
//完成日期:4/16/2007
//---------------------------------------------------------------------------------------------
void SetModuleStatusCOMM(unsigned char uchModuleFlag)
{
	uchModuleConfigStatus = uchModuleFlag;	
}
//--------------------------------------------------------------------------------------------------
//函数名称:void ReportAlertEvent(unsigned char uchCh,unsigned int uiAlert)
//功    能:上报报警事件
//输入参数:通道,报警状态
//返    回:无
//完成日期:4/16/2007
//--------------------------------------------------------------------------------------------------
void ReportAlertEvent(unsigned char uchCh,unsigned int uiAlert)
{
	uchSendBuf[0] = 0;
	uchSendBuf[1] = 0;
	uchSendBuf[2] = 4;
	uchSendBuf[3] = 0x22;

	if (uchCPUAddressStatus == 0)	//上CPU上报数据
	{
		uchSendBuf[4] = uchCh;	
	}
	else if (uchCPUAddressStatus == 1)		//下CPU上报数据通道加2	 因为之前的计算减了2,减少程序代码
	{
		uchSendBuf[4] = uchCh + 2;
	}
	
	*((unsigned int*)&uchSendBuf[5]) = uiAlert;

	SendPackage(0,1,uchSendBuf);
	return;
}

/*****************************************************
* 函数介绍: 处理地址偏移量
* 输入参数: 偏移量
* 输出参数: 数据地址
* 返回值 :	 无
*****************************************************/
unsigned int AddrMap(unsigned int uiOffset)
{
	if(uiOffset < 40237) 
	{
		return (uiOffset - 40200);
	}
	if(uiOffset < 40253)
	{
		return (uiOffset - 40251);
	}
	if(uiOffset >= 40296)
	{
		return (uiOffset - 40291);
	}
	return 0; //error, should not come here
} 
//--------------------------------------------------------------------------------------------------
//函数名称:void ReportChannelCurrentStatus(unsigned char uchCh,unsigned char uchStatus,unsigned int uiValue,int uiGap)
//功    能:上报通道的状态,实时测量值和间隙电压
//输入参数:通道,状态,实时测量值和间隙电压
//返    回:无
//完成日期:4/16/2007
//--------------------------------------------------------------------------------------------------
void ReportChannelCurrentStatus(unsigned char uchCh,unsigned char uchStatus,unsigned int uiValue,int uiGap)
{
	static unsigned char uchCountData = 0;

	uchCountData++;
	if (uchCountData == 3)
	{
		RunLEDStartControl();    //灯控制
	}
	else if (uchCountData >= 6)
	{
		RunLEDStopControl();
		uchCountData = 0;
	} 								//CAN运行灯控制临时添加,判断分析通信上报的状态
		
	uchSendBuf[0] = 0;
	uchSendBuf[1] = 0;
	uchSendBuf[2] = 7;
	uchSendBuf[3] = 0x21;
	uchSendBuf[4] = uchCh;
	uchSendBuf[5] = uchStatus; 
	*((unsigned int*)&uchSendBuf[6]) = uiValue;
	*((unsigned int*)&uchSendBuf[8]) = uiGap;

	if (uchCPUAddressStatus == 0)
	{
		uchCh = uchCh;
	}
	else if (uchCPUAddressStatus == 1)
	{
		uchCh = uchCh - 2;
	}

	if (uchAlarmStatusJudge[uchCh - 1] == uchAlarmStatusJudgeBAK[uchCh - 1])
	{
		SendPackage(3,0x01,uchSendBuf);
	}
	else if (uchAlarmStatusJudge[uchCh - 1] != uchAlarmStatusJudgeBAK[uchCh - 1])
	{
		SendPackage(1,0x01,uchSendBuf);	
		uchAlarmStatusJudgeBAK[uchCh - 1] = uchAlarmStatusJudge[uchCh - 1];
	} //状态不相等,则优先级提高
}

//--------------------------------------------------------------------------------------------------
//函数名称:void ReportModuleType(unsigned char uchModuleType, unsigned int uchAddress)
//功    能:每个槽地址为偶数的CPU上报模块类型
//输入参数:模块类型,Can通讯地址
//返    回:无
//完成日期:6/22/2007
//--------------------------------------------------------------------------------------------------
void ReportModuleType(unsigned char uchModuleType, unsigned int uchAddress)
{
	unsigned int xdata i;
	if(uchAddress % 2 == 0)
	{
		uchSendBuf[0] = 0;
		uchSendBuf[1] = 0;
		uchSendBuf[2] = 3;
		uchSendBuf[3] = 0x11;
		*(unsigned int *)&uchSendBuf[4] = uchModuleType;
		SendPackage(1,1,uchSendBuf);
	}
	if (uchAddress % 2 == 1)
	{
		for (i=0; i<250; i++)
		{
			;
		}
	}	
}

//--------------------------------------------------------------------------------------------------
//函数名称:void SetAlarmStatusCOMM(unsigned char uchChannel, unsigned char uchAlarmStatus)
//功    能:将报警模块的报警状态设置到通信处理模块中来
//输入参数:通道号,报警状态
//返    回:无
//完成日期:6/22/2007
//--------------------------------------------------------------------------------------------------
void SetAlarmStatusCOMM(unsigned char uchChannel, unsigned char uchAlarmStatus)
{
	uchAlarmStatusJudge[uchChannel - 1] = uchAlarmStatus;
}

//--------------------------------------------------------------------------------------------------
//函数名称:void InitCOMMModulePara(void)
//功    能:初始化通信模块中的变量参数
//输入参数:无
//返    回:无
//完成日期:6/22/2007
//--------------------------------------------------------------------------------------------------
void InitCOMMModulePara(void)
{
	uchModuleConfigStatus = 0x00;
}

//--------------------------------------------------------------------------------------------------
//函数名称:void SetCPUAddressFlagCOMM(unsigned char uchCPUAddressFlag)
//功    能:将CPU地址的状态设置到通信模块中
//输入参数:CPU地址状态
//返    回:无
//完成日期:6/22/2007
//--------------------------------------------------------------------------------------------------
void SetCPUAddressFlagCOMM(unsigned char uchCPUAddressFlag)
{
	uchCPUAddressStatus = uchCPUAddressFlag;
}

//--------------------------------------------------------------------------------------------------
//函数名称:void ReportSystemEvent(unsigned char uchChannel,unsigned int uiSystemEvent)
//功    能:上报系统事件
//输入参数:系统事件
//返    回:无
//完成日期:6/22/2007
//--------------------------------------------------------------------------------------------------
void ReportSystemEvent(unsigned char uchChannel,unsigned int uiSystemEvent)
{
	uchSendBuf[0] = 0;
	uchSendBuf[1] = 0;
	uchSendBuf[2] = 4;	  //数据长度
	uchSendBuf[3] = 0x0E;

	if (uchChannel == 0)			   //通道号为零,则是普通系统事件,不区分上下CPU
	{
		uchSendBuf[4] = uchChannel;
	}
	else							   //通道号不为零,则是特殊系统事件,要区分上下CPU
	{
		if (uchCPUAddressStatus == 0)	//放在这判断是为了压缩程序代码
		{
			uchSendBuf[4] = uchChannel;
		}
		else if (uchCPUAddressStatus == 1)
		{
			uchSendBuf[4] = uchChannel + 2;	
		}

	}

//	uchSendBuf[4] = uchChannel;			//后删除20080514

	*((unsigned int*)&uchSendBuf[5]) = uiSystemEvent;

	SendPackage(0,1,uchSendBuf);
	return;
}

//--------------------------------------------------------------------------------------------------
//函数名称:void SetConfigChannelStatus(unsigned char uchChannel,unsigned char uchChannelStatusFlag)
//功    能:判断通道参数配置是否正确
//输入参数:通道号,通道配置标志   0:没配置过 1:配置不正确 2:配置正确 3:通道不存在
//返    回:无
//完成日期:6/22/2007
//--------------------------------------------------------------------------------------------------
/*void SetConfigChannelStatus(unsigned char uchChannel,unsigned char uchChannelStatusFlag)
{
	uchConfigChannelStatus[uchChannel - 1] = uchChannelStatusFlag;
} */



































⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -