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

📄 commup.c

📁 电力行业必备。有错的地方
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************Copyright (c)**************************************************
**                               	江苏广一科技有限公司
**                                     研    发    部
**                                        浙江配变
**
**                                 
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: commup.c
**创   建   人: 
**最后修改日期: 2008年08月30日
**描        述: 
**              
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 
** 版  本: 
** 日 期: 
** 描 述: 
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
** 描 述: 
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define  COMMUP_GLOBALS
#include "commup.h"
#include "powerram.h"
#include "global.h"
#include "main.h"


//extern OS_EVENT	* Gprs_Set_Ack;
//extern uint8	GprsCommBuf[256];										// 终端与GPRS模块间通讯缓冲区
//extern uint8 GprsInitFlag;
//extern RCV_BUF		Rs232_Buf;					// 本地通讯接口缓冲区
//extern RCV_BUF		Rs232_Buf;					// 本地通讯接口缓冲区
//extern RCV_QUE 		Rcv_Q[16];					// 接收队列

/*typedef struct	{								// 接收队列数据结构
					uint8	state;				// 0:为空 1:有数据待处理
					uint8  	*read;
					uint8  	*write;
					uint8	chtype;				// 01:短信 02:GPRS 05:红外 06:RS232
					uint8	addr[6];			// 主站通讯地址
					uint8	concode;			// 控制码
					uint8	datalen[2];			// 数据长度
					uint16	bufsize;			// 缓冲区尺寸
					uint8	buf[1024];			// 数据区
					//uint8	chkcode[2];			// 校验码	
				} RCV_QUE;	*/					// 说明:在POWERRAM.C中定义一个16的结构数组		
				/*uint8	*read;				// 接收缓冲区的读指针
					uint8	*write;				// 接收缓冲区的写指针
					uint32	len;				// 接收缓冲区的数据长度
					uint32	size;				// 接收缓冲区的尺寸
					uint8	buf[2048];*/	
/*********************************************************************************************************
** 函数名称: InitRcvBuf()
** 功能描述: 初始化接收缓冲区函数
**
** 输 入: 无
**
** 输 出: 无
**         
** 全局变量: Rs232_Buf:	接收缓冲区
**			 Rcv_Q:		接收队列
**			 Send_Q:	发送队列
** 调用模块: 
**
** 作 者: 
** 日 期: 
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/	
void InitRcvBuf(void)	
{	
	uint8 i;
	if ((Rs232_Buf.InitFlag[0] != 0x0B) &&
		(Rs232_Buf.InitFlag[1] != 0xAA))
	{	
		for (i=0;i<16;i++)
		{
			Rcv_Q[i].state = 0;										// 将接收队列状态初始化为空
			//Rcv_Q[i].bufsize = 1024;
			//Rcv_Q[i].read  = Rcv_Q[i].buf;
			//Rcv_Q[i].write = Rcv_Q[i].buf;
		}
		for (i=0;i<64;i++)
		{
			Send_Q[i].state = 0;									// 将发送队列状态初始化为空
		}
		for (i=0;i<60;i++)
		{
			ProgramLog[i].mp_num = 0xFF;
		}
		
		p_ProgramLog = 0;
		Rs232_Buf.InitFlag[0] = 0x0B;
		Rs232_Buf.InitFlag[1] = 0xAA;
	}
	else
	{
		;
	}
	Rs232_Buf.read  = Rs232_Buf.buf;							// 将指针指向接收缓冲区首地址(RS232)
	Rs232_Buf.write = Rs232_Buf.buf;
	Rs232_Buf.size	= RCV_BUF_SIZE;
	Rs232_Buf.len   = 0;
	
	Gprs_Buf.read  	= Gprs_Buf.buf;								// 将指针指向接收缓冲区首地址(GPRS)
	Gprs_Buf.write 	= Gprs_Buf.buf;
	Gprs_Buf.size	= RCV_BUF_SIZE;
	Gprs_Buf.len  	= 0;
}	
/*********************************************************************************************************
** 函数名称: ReadBuf
** 功能描述: 读底层缓冲区函数
**
** 输 入: port:端口号
**
** 输 出: 读出的字节数
**         
** 全局变量: 无
** 调用模块: ReadCommMs()
**
** 作 者: 
** 日 期: 
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint32 ReadBuf(uint8 port)
{
	uint8 	uc_rxbuf[128];
	uint32	len,len1;
	uint32	i;
	len = 0;
	switch (port)
	{
		case COMM1:	
			while(CommOverTimes<5)
			{
				len1 = ReadCommMs(COMM1,uc_rxbuf,128,40, 100);
				if (len1!=0)
				{
					len = len + len1;
					for (i=0;i<len1;i++)										// 将读到的数据放到本地接收缓冲区
					{
						*Rs232_Buf.write = uc_rxbuf[i];
						Rs232_Buf.len ++;
						Rs232_Buf.write ++;
						if (Rs232_Buf.write>(Rs232_Buf.buf + Rs232_Buf.size))
						{
							Rs232_Buf.write = Rs232_Buf.buf;
						}
					}
					waitms(20);
				}
				else
				{
					break;
				}
			}
			return(len);
			break;
		case COMM2:
			while (CommOverTimes<5)	
			{	if (GprsInitFlag==1)												// GPRS在初始化,此处不接收
				return(0);							
				len1 = ReadCommMs(COMM2,uc_rxbuf,128,40, 100);						// 读底层接收缓冲区
				if (len1!=0)														// 将读到的数据放到本地接收缓冲区
				{
					len = len + len1;
					for (i=0;i<len1;i++)											// 将读到的数据放到本地接收缓冲区
					{
						*Gprs_Buf.write = uc_rxbuf[i];
						Gprs_Buf.len ++;
						Gprs_Buf.write ++;
						if (Gprs_Buf.write>(Gprs_Buf.buf + Gprs_Buf.size))
						{
							Gprs_Buf.write = Gprs_Buf.buf;
						}
					}
					waitms(20);
				}
				else
				{
					break;
				}
			}
			return(len);
			break;
		default:
			return(0);
			break;
	}
	
}

/*********************************************************************************************************
** 函数名称: ReadRcvBuf
** 功能描述: 读接收缓冲区函数
**
** 输 入: port
**
** 输 出: data
**         
** 全局变量: 
** 调用模块: 
**
** 作 者: 
** 日 期: 
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 ReadRcvBuf(uint8 port)
{
	uint8	data;
	switch (port)
	{
		case COMM1:
			if (Rs232_Buf.len != 0)
			{
				data = *Rs232_Buf.read;
				Rs232_Buf.read ++;
				Rs232_Buf.len --;
			}
			if (Rs232_Buf.read>(Rs232_Buf.buf+Rs232_Buf.size))
			{
				Rs232_Buf.read = Rs232_Buf.buf;
			}
			return(data);
			break;
		
		case COMM2:
			if (Gprs_Buf.len != 0)
			{
				data = *Gprs_Buf.read;
				Gprs_Buf.read ++;
				Gprs_Buf.len --;
			}
			if (Gprs_Buf.read>(Gprs_Buf.buf+Gprs_Buf.size))
			{
				Gprs_Buf.read = Gprs_Buf.buf;
			}
			
			/*if (Rs232_Buf.len != 0)
			{
				data = *Rs232_Buf.read;
				Rs232_Buf.read ++;
				Rs232_Buf.len --;	
			}*/
			return(data);
			break;
		default:
			return(NULL);
			break;	
	}
}

/*********************************************************************************************************
** 函数名称: PushRcvToQue
** 功能描述: 将接收到的完整帧写入接收队列
**
** 输 入: ch:  通道类型  
**         *buf:接收缓冲区地址
**
** 输 出: 0:成功 1:失败 2:队列已满
**         
** 全局变量: 
** 调用模块: 
**
** 作 者: 
** 日 期: 
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 PushRcvToQue(uint8 ch, uint8 *buf)
{
	uint8	i;
	uint8	*point;
	//uint8	*qpoint;
	uint16  len;
	static uint8 que_num;
	
	for (i=0;i<16;i++)										// 找出空闲的接收队列
	{
		if (que_num==16)
		{
			return(2);										// 接收队列已满									
		}
		if (Rcv_Q[i].state == 0)
		{
			que_num = i;
			break;
		}
		else continue;	
	}
	
	
		
	point = buf;
	Rcv_Q[que_num].chtype = ch;
	point ++;
	for (i=0;i<6;i++)										// 保存地址
	{
		Rcv_Q[que_num].addr[i] = *point;
		point ++;
	}
	point ++;
	Rcv_Q[que_num].concode = *point;						// 保存控制码
	point ++;
	Rcv_Q[que_num].datalen[0] = *point;						// 保存数据长度
	point ++;
	Rcv_Q[que_num].datalen[1] = *point;
	point ++;
	len = Rcv_Q[que_num].datalen[1]; 
	len = (len << 8)+ Rcv_Q[que_num].datalen[0];
	if (len>1024)
	{
		Rcv_Q[i].state = 0;
		return(1);
	}
	for (i=0;i<len;i++)										// 保存数据
	{
		Rcv_Q[que_num].buf[i] = *point;
		point ++;
	}
	Rcv_Q[que_num].state = 1;		
	return(0);
}

/*********************************************************************************************************
** 函数名称: WriteRcvQue
** 功能描述: 将两个接收缓冲区的数据写入接收队列
**
** 输 入: 无
**
** 输 出: 0:成功将数据写入接收队列 1:未有数据写入
**         
** 全局变量: 
** 调用模块: 
**
** 作 者: 
** 日 期: 
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 WriteRcvQue(void)
{
	if (WriteRcvQue0() == 0)
	return(0);
	if (WriteRcvQue1() == 0)
	return(0);
	else
	return(1);
}

/*********************************************************************************************************
** 函数名称: WriteRcvQue0
** 功能描述: 从RS232接收缓冲区找出一个完整幀并写入接收队列
**
** 输 入: 无
**
** 输 出: 0:成功将数据写入接收队列 1:未有数据写入
**         
** 全局变量: 
** 调用模块: PushRcvToQue
**
** 作 者: 
** 日 期: 
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 WriteRcvQue0(void)
{	
	static	uint8   uc_rs232mbuf[1400];
	static	uint16  u_tlen;
	static	uint16	u_len;
	
	uint32  i;
	uint8   uc_data;
	uint8	uc_chkcode;

⌨️ 快捷键说明

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