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

📄 recv.c

📁 freescale crc模块驱动 经调试
💻 C
📖 第 1 页 / 共 2 页
字号:
	// CMSioRecvPackLenMin = 8
	if(cSioRecvBufEnd < CMSioRecvPackLenMin)
		return 0;
	// 强制类型转换
	pack = (SioPackHead *)&SioRecvBuf;
	type = pack->type.types.type;
	len = 15;
	if(cSioRecvBufEnd < CMSioLeadLen+len)                  // 如果SioRecvBuf.buf中不够18个字节
		return 0;                                          // 返回0!
	cp = SioRecvBuf.buf+CMSioLeadLen;                      // cp指向包的第1个有效字节(类型+序列)
	
	/* 收到"调试"包后的处理模块 */
	if(type == CMSioTypeDebug)                             // 包类型为"调试"
	{
		RecvMOnTimeDebug();
		return -7;                                         // 返回-7!
	}
	
	/* CRC校验模块 */
	Rc = CRCChk((char *)cp,len-CMSioCRCLen);
	if(Rc != 1)
	{
		cgflgD4Flash = 0;
		cgflgD5Flash = 1;
		cgflgD6Flash = 0;
		return -8;                                         // 如果CRC校验未通过,返回-8!
	}
	
	/* 地址校验模块 */
	Ra = MachineAddrChk(pack->addr,Rc);
	if(!Ra)                                                // Ra=0,机器地址校验出现错误
	{
		cgflgD4Flash = 0;
		cgflgD5Flash = 0;
		cgflgD6Flash = 1;
		return -9;                                         // 返回-9!
	}

	cRecvBufType = type;                                   // 接收包的类型
	return 1;                                              // 一切正常,返回1!
}

/******************************************************************************
 * 函数原形: void UrgencyStop(void);                                          *
 * 功能: 紧急停车函数                                                         *
 * 说明: 1.禁止一切控制动作                                                   *
 *       2.切断B5,SI1和-24V电源                                               *
 ******************************************************************************/
void UrgencyStop (void)
{
	RecvMsgFailShow();
}

/******************************************************************************
 * 函数原型: int RecvMOnTimeDataDispatch(void);                               *
 * 功能: 判断接收包的类型并做相应的解包处理                                   *
 * 说明: 正常情况下返回值为包的类型                                           *
 ******************************************************************************/
int RecvMOnTimeDataDispatch (void)
{
	int type;
	static unsigned char cRightPackCounter;
	if(!cRecvBufType)                                      // 如果cRecvBufType未被赋值,说明收到的包
		                                                   // 未能通过CRC校验或机器地址校验
		return 0;                                          // 返回0!
	type = cRecvBufType;
	cRecvBufType = 0x00;                                   // 注意清0

	/* 系统恢复模块 */
	if(cflgCommDatOvertime)
	{
		switch(type)
		{
		case CMSioTypeCtrlData:
		case CMSioTypeSetCurrent:
		case CMSioTypeSetOilFlow:
			cRightPackCounter ++;
			nflgCommDatRight = CommDatRightTime;
			if(cRightPackCounter >= ConsecutiveRightPack)
			{
				cRightPackCounter = 0;
				cflgCommDatOvertime = 0;
				cflgUrgencyStop &= ~UrgStopTransMsgFail;
				cgflgD4Flash = 1;
				cgflgD5Flash = 0;
				cgflgD6Flash = 0;
				cgflgD11Flash = 0;
				RecvMsgNormalShow();
			}
			return type;
		default:
			cRightPackCounter = 0;
			return -1;
		}
	}

	/* 正常处理模块 */
	switch(type)
	{
	case CMSioTypeCtrlData:                                // 包类型为"普通级控制数据"
		nflgCommDatRight = CommDatRightTime;
		cgflgD4Flash = 1;
		cgflgD5Flash = 0;
		cgflgD6Flash = 0;
		cgflgD11Flash = 0;
		return type;                                       // 返回包的类型!
	case CMSioTypeSetCurrent:
	case CMSioTypeSetOilFlow:
		nflgCommDatRight = CommDatRightTime;
		cgflgD4Flash = 1;
		cgflgD5Flash = 0;
		cgflgD6Flash = 0;
		cgflgD11Flash = 0;
		return type;                                       // 返回包的类型!
	}
	return 0;                                              // 接收包的类型出现错误,返回0!
}

/******************************************************************************
 * 函数原型: void RecvMOnTimeDeleteLead(void);                                *
 * 功能: 删除包头                                                             *
 * 说明: 无                                                                   *
 ******************************************************************************/
void RecvMOnTimeDeleteLead (void)
{
	int n;
	n = cSioRecvBufEnd-CMSioLeadLen;                       // n > 0
	__memmovebuf(SioRecvBuf.buf,CMSioLeadLen,n);           // 除包头外的所有数据向前移动3个字节
	cSioRecvBufEnd -= CMSioLeadLen;                        // 更新cSioRecvBufEnd的值
}

/******************************************************************************
 * 函数原型: void CheckRecvRight(void);                                       *
 * 功能: 保证2s内从发射机接收到正确的包                                       *
 * 说明: 在2s内收不到正确的包,禁止一切控制动作                                *
 ******************************************************************************/
void CheckRecvRight (void)
// called at 100Hz
{
	if(nflgCommDatRight)
	{
		nflgCommDatRight --;
		return;
	}
	// 如果在2s内未收到正确的包,做如下处理
	cflgUrgencyStop |= UrgStopTransMsgFail;
	cflgCommDatOvertime = 1;
	cgflgD4Flash = 0;
	cgflgD5Flash = 0;
	cgflgD6Flash = 0;
	cgflgD11Flash = 1;
}

/******************************************************************************
 * 函数原型: void RecvMOnTime(void);                                          *
 * 功能: 实时接收发射机的数据                                                 *
 * 说明: 注意函数执行的次序                                                   *
 ******************************************************************************/
void RecvMOnTime (void)
// called at 100Hz
// * 数据发送
// * 检查数据包
// * 检查通讯
{
	int lead, data, r;
	CheckRecvRight();
	RecvMOnTimeReadRxBuf();
	lead = RecvMOnTimeCheckLead();
	RecvMOnTimeNormalBuf(lead);
	if(lead == 0)                                          // 如果未能在SioRecvBuf.buf中找到包头
		return;                                            // 返回
	data = RecvMOnTimeCheckData();
	if(data == 0)                                          // 如果SioRecvBuf.buf中数据不够18个字节
		return;                                            // 返回
	r = RecvMOnTimeDataDispatch();
	RecvMOnTimeDeleteLead();
}

⌨️ 快捷键说明

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