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

📄 commup.c

📁 电力行业必备。有错的地方
💻 C
📖 第 1 页 / 共 2 页
字号:
	uint32	ul_mm;
	uint8	ch;
								
	if (Rs232_Buf.len != 0)										// 完整帧的处理							
	{
		ul_mm = Rs232_Buf.len;
		for (i=0;i<ul_mm;i++)
		{
			uc_data = ReadRcvBuf(COMM1);
			if (uc_data == 0x68)								// 查询第一个0x68
			{
				uc_rs232mbuf[0] = 0x68;
				u_len  = 0;
				u_tlen = 1;
				break;
			}
			else
			{
				continue;								
			}
		}
	}
	else return(1);
	
	if (i==ul_mm)
	{
		u_len  = 0;
		u_tlen = 1;
		return(1);												// 未收到第一个0x68直接返回
	}
		
	/*while (Rs232_Buf.len < 10)									// 接收0x68后的10字节,不满10字节,要接收满10字节
	{
		ReadBuf(COMM1);											// 直接读底层
	}*/
		
	for (i=0;i<6;i++)
	{
		uc_rs232mbuf[u_tlen] = ReadRcvBuf(COMM1);				// 接收6字节地址
		u_tlen ++;
	}
		
	uc_data = ReadRcvBuf(COMM1);								// 判断第二个0x68
	if(uc_data != 0x68)
	{
		u_len  = 0;
		u_tlen = 1;												// 如果第二个0x68不正确,抛掉
		return(1);
	}
	else												
	{
		uc_rs232mbuf[u_tlen] = uc_data;
		u_tlen ++;	
	}
		
	for(i=0;i<3;i++)
	{
		uc_rs232mbuf[u_tlen] = ReadRcvBuf(COMM1);				// 接收控制码和数据长度
		u_tlen ++;	
	}
		
	u_len = uc_rs232mbuf[u_tlen - 1];							// 计算整个DATA域的长度
	u_len = (u_len << 8);
	u_len = u_len + uc_rs232mbuf[u_tlen - 2];				
		
	if(u_len>1024)												// 如果DATA域过长,抛掉
	{
		u_tlen = 0;												
		u_len  = 0;
		return(1);
	}
		
	/*while (Rs232_Buf.len < (u_len + 2))							// 接收剩余的全部数据
	{
		ReadBuf(COMM1);											// 直接读底层
	}*/
	
	while (u_len>0)
	{
		uc_rs232mbuf[u_tlen] = ReadRcvBuf(COMM1);				// 接收DATA域
		u_tlen ++;
		u_len --;
	}
		
	uc_chkcode = ReadRcvBuf(COMM1);								// 接收校验码
	uc_rs232mbuf[u_tlen] = uc_chkcode;	
	u_tlen ++;
	uc_data = ReadRcvBuf(COMM1);								// 接收0x16
	if (uc_data == 0x16)
	{
		uc_rs232mbuf[u_tlen] = uc_data;				
	}
	else
	{
		u_tlen = 0;												// 帧尾不正确,抛掉
		u_len  = 0;
		return(1);
	}
	
	uc_chkcode = AddData(uc_rs232mbuf, u_tlen-1);				// 校验
	if (uc_chkcode != uc_rs232mbuf[u_tlen - 1])
	{
		u_tlen = 0;										
		u_len  = 0;
		return(1);
	}
	u_tlen = 0;										
	u_len  = 0;
	
	/*if (ReadCpuIoStatus(IO_SEL_SMS))							// 判断通道
	{
		ch = 0x05;												// 红外通讯
	}
	else
	{
		ch = 0x06;												// 232状态
	}*/
	ch = 0x06;
	if (PushRcvToQue(6,uc_rs232mbuf) != 0)						// 将缓冲区数据写入接收队列
	{
		return(1);
	}
	return(0);													// 接收成功返回0
}

/*********************************************************************************************************
** 函数名称: WriteRcvQue1
** 功能描述: 从GPRS接收缓冲区找出一个完整幀并写入接收队列
**
** 输 入: 无
**
** 输 出: 0:成功将数据写入接收队列 1:未有数据写入
**         
** 全局变量: 
** 调用模块: PushRcvToQue
**
** 作 者: 
** 日 期: 
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 WriteRcvQue1(void)
{	
	static	uint8   uc_gprsmbuf[1400];
	static	uint16  u_tleng;
	static	uint16	u_leng;
	
	uint32  i;
	uint8	ch;
	uint8   uc_data;
	uint8	uc_chkcode;
	uint32	ul_mm;
	//uint8	len;
								
	if (Gprs_Buf.len != 0)										// 完整帧的处理							
	{
		ul_mm = Gprs_Buf.len;
		for (i=0;i<ul_mm;i++)
		{
			uc_data = ReadRcvBuf(COMM2);
			if (uc_data == 0x68)								// 查询第一个0x68
			{
				uc_gprsmbuf[0] = 0x68;
				u_leng  = 0;
				u_tleng = 1;
				break;
			}
			else
			{
				continue;								
			}
		}
	}
	
	else return(1);
	
	if (i==ul_mm)
	{
		u_leng  = 0;
		u_tleng = 1;
		return(1);												// 未收到第一个0x68直接返回
	}
		
	/*while (Gprs_Buf.len < 10)									// 接收0x68后的10字节,不满10字节,要接收满10字节
	{
		ReadBuf(COMM2);											// 直接读底层
	}*/
		
	for (i=0;i<6;i++)
	{
		uc_gprsmbuf[u_tleng] = ReadRcvBuf(COMM2);				// 接收6字节地址
		u_tleng ++;
	}
	
	uc_data = ReadRcvBuf(COMM2);								// 判断第二个0x68
	if(uc_data != 0x68)
	{
		u_leng  = 0;
		u_tleng = 1;											// 如果第二个0x68不正确,抛掉
		return(1);
	}
	else												
	{
		uc_gprsmbuf[u_tleng] = uc_data;
		u_tleng ++;	
	}
	
	/*if ((uc_gprsmbuf[1]==0x0E) && (uc_gprsmbuf[2]==0x00) &&		// 判断是否是GPRS本地通讯
		(uc_gprsmbuf[3]==0x00) && (uc_gprsmbuf[4]==0x00) &&
		(uc_gprsmbuf[5]==0x00) && (uc_gprsmbuf[6]==0x00) )
		{
			for (i=0;i<8;i++)
			{
				GprsCommBuf[i] = uc_gprsmbuf[i];
			}
			GprsCommBuf[8] = ReadRcvBuf(COMM2);					// 接收控制码
			GprsCommBuf[9] = ReadRcvBuf(COMM2);					// 接收数据长度
			len = GprsCommBuf[9];
			for (i=0;i<len;i++)
			{
				GprsCommBuf[10+i] = ReadRcvBuf(COMM2);			// 接收其他数据
			}
			GprsCommBuf[10+len] = ReadRcvBuf(COMM2);
			uc_chkcode = AddData(GprsCommBuf, len+10);
			if (uc_chkcode==GprsCommBuf[10+len])
			{
				GprsCommBuf[10+len+1] = ReadRcvBuf(COMM2);
				OSSemPost(Gprs_Set_Ack);
			}
			u_tleng = 0;										
			u_leng  = 0;
			return(0);
		}
	*/	
		
	for(i=0;i<3;i++)
	{
		uc_gprsmbuf[u_tleng] = ReadRcvBuf(COMM2);				// 接收控制码和数据长度
		u_tleng ++;	
	}
		
	u_leng = uc_gprsmbuf[u_tleng - 1];							// 计算整个DATA域的长度
	u_leng = (u_leng << 8);
	u_leng = u_leng + uc_gprsmbuf[u_tleng - 2];				
		
	if(u_leng>1024)												// 如果DATA域过长,抛掉
	{
		u_tleng = 0;												
		u_leng  = 0;
		return(1);
	}
		
	/*while (Gprs_Buf.len < (u_leng + 2))							// 接收剩余的全部数据
	{
		ReadBuf(COMM2);											// 直接读底层
	}*/
	
	while (u_leng>0)
	{
		uc_gprsmbuf[u_tleng] = ReadRcvBuf(COMM2);				// 接收DATA域
		u_tleng ++;
		u_leng --;
	}
		
	uc_chkcode = ReadRcvBuf(COMM2);								// 接收校验码
	uc_gprsmbuf[u_tleng] = uc_chkcode;	
	u_tleng ++;
	uc_data = ReadRcvBuf(COMM2);								// 接收0x16
	if (uc_data == 0x16)
	{
		uc_gprsmbuf[u_tleng] = uc_data;				
	}
	else
	{
		u_tleng = 0;											// 帧尾不正确,抛掉
		u_leng  = 0;
		return(1);
	}
	
	uc_chkcode = AddData(uc_gprsmbuf, u_tleng-1);				// 校验
	if (uc_chkcode != uc_gprsmbuf[u_tleng - 1])
	{
		u_tleng = 0;										
		u_leng  = 0;
		return(1);
	}
	u_tleng = 0;										
	u_leng  = 0;
	
	
	if (ReadCpuIoStatus(IO_SEL_SMS))							// 判断通道
	{
		ch = 0x02;												// GPRS通讯
	}
	else
	{
		ch = 0x01;												// 短信状态
	}
	
	if (PushRcvToQue(ch,uc_gprsmbuf) != 0)						// 将缓冲区数据写入接收队列
	{
		return(1);
	}
	return(0);													// 接收成功返回0
}

/*********************************************************************************************************
** 函数名称: AddData()
** 功能描述: 校验和累加函数
**
** 输 入: 
**
** 输 出: 校验码
**         
** 全局变量: 
** 调用模块: 
**
** 作 者: 
** 日 期: 
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 AddData(uint8 *buf, uint16 len)
{
	uint16 u_addata;
	uint8  *pt;
	uint16 i;
	uint8  uc_data;
	u_addata = 0;
	pt = buf;
	for (i=0;i<len;i++)
	{
		u_addata = (u_addata & 0x00FF) + *pt;
		pt ++;
	}
	uc_data = (uint8)u_addata;
	return(uc_data);
}


/*********************************************************************************************************
** 函数名称: PushSendQue()
** 功能描述: 写发送队列函数
**
** 输 入:	*buf 发送缓冲区地址
**			len	 发送数据长度	
**			ch	 发送通道
** 输 出: 	0:成功 1:失败
**         
** 全局变量: 
** 调用模块: 
**
** 作 者: 
** 日 期: 
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 PushSendQue(uint8 *buf,uint32 len, uint8 ch)
{
	uint8	i;
	uint32	j;
	
	for (i=0;i<64;i++)
	{
		if (i==64)
		return(1);
		if (Send_Q[i].state==0)
		{
			Send_Q[i].state = 1;
			Send_Q[i].count = 0;
			Send_Q[i].ch = ch;
			Send_Q[i].len = len;
			
			for (j=0;j<len;j++)
			{
				Send_Q[i].buf[j] = buf[j];
				//Send_Q[i].len ++;
			}
			break;
		}		
		else continue;
	}
	return(0);
}



⌨️ 快捷键说明

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