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

📄 portdirection.c

📁 基于ARM7的ucos-ii移动收发通信编程ADS开发源码
💻 C
📖 第 1 页 / 共 5 页
字号:
		}
	}
	if(rec_count>0)
	{
		cnt =1;
	}
	return(rec_count);
}
//读取南向通信数据
INT32U GetSouthingData(void)
{
	INT32U st = 0;
	INT32S recchar = 0;
	INT32U rec_count = 0;
	INT8U  recdata = 0;
	INT8U  rec_step = 0;
	INT8U  loopflag = 1;
	INT8U  loopcount = 0;
	INT16U  data_count = 0;
	INT8U  check_flag = 0x55;
	
	INT8U  read_flag = 0;
	
	while (loopflag)
	{
nextlocal:	
		recchar = uartgetc(Com_Southing);
		
		if(recchar == -1)
		{
		    if( ++read_flag == 1 )
		    {loopflag = 0;
		    st = 0;
		        break;
		    }
		    
			 OSTimeDly(1);
			 if(loopcount++>10)
			 {
			   	loopflag = 0;
			   	st = 0;		   	 		
			 }	
			 else
			 {
			   	goto nextlocal;	
			 }
		}
		else
		{
			loopcount=0;
		    read_flag = 2;
		   	recdata = (INT8U)recchar;
				
			switch( rec_step )
			{			
				case 0:
				{
					if( recdata == 0x7E )
					{
						RecSouthPortData[rec_count++] = recdata;
						rec_step = 1;
					}
					else
					{
						rec_step = 0;
						rec_count = 0;	
						data_count = 0;						
					}
				}
				break;									
				case 1:
				{
					RecSouthPortData[rec_count++] = recdata;
					
					if( rec_count == 7 )
					{
						data_count = RecSouthPortData[5]+(RecSouthPortData[6]<<8);				// 命令体长度
						check_flag = 0xaa;
					}
					if( check_flag == 0xaa )
					{
						if( rec_count == (10 + data_count) )
						{
							if( recdata == 0x7F )
							{
								st = rec_count;
								loopflag = 0;
								check_flag = 0x55;					
							}
						}
					}
				}	
				break;								
				default:
				break;
			}
		}
	}	
	return st;
}

INT32U TD_GetNorthData(void)
{
	INT32S recchar = 0;
	INT32U rec_count = 0;
	INT8U  recdata = 0;
	INT8U  rec_step = 0;
	INT8U  loopflag = 1;
	INT16U	datalen = 0;
	INT16U  loopcount = 0;
	INT16U	i = 0;
	while (loopflag)
	{
		recchar = uartgetc(Com_North);
		if(recchar == -1)
		{					
			OSTimeDly(1);			// 延时10ms
			if(loopcount++>20)		// 100ms后没有读到数据就认为没有数据
			{
				loopflag = 0;
				//rec_count = 0;		   	 		
			}	
		}
		else
		{
		   	recdata = (INT8U)recchar;
		   	switch( rec_step )
			{			
				case 0:
					if( recdata == 0x7E )		// 接收帧头
					{
						RecNorthPortData[rec_count++] = recdata;
						rec_step = 1;
					}
					else
					{
						rec_step = 0;
						rec_count = 0;						
					}
					break;	
				case 1:
					RecNorthPortData[rec_count++] = recdata;
					if( rec_count == 4 )
					{
						datalen = recdata;		// 接收到数据体长度位
						rec_step = 2;
					}
					break;
				case 2:
					if (i++ == datalen)			// 接收数据体长度个数据
					{
						
						rec_step = 3;
						i = 0;
						datalen = 0;
						RecNorthPortData[rec_count++] = recdata;
					}
					else
					{
						RecNorthPortData[rec_count++] = recdata;
					}
					break;
				case 3:
					if  (i++ == 2)				// 接收crc校验位和帧尾(3字节)
					{
						loopflag = 0;
					}
					else
					{
						RecNorthPortData[rec_count++] = recdata;
					}
					break;			
				default:
					break;
			}
		}
	}
	return(rec_count);
}
/*******************************************************************************************************
** 函数名称: void SetSouthPortRunState(INT8U mState)
** 功能描述: 设置北向端口运行状态
** 输   入: 无
** 输   出: 
** 全局变量: 无
** 调用模块: 
** 作   者: 崔敬军 
** 日   期: 2007年12月22日
**------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日   期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void SetStaSouth(INT8U Sta)
{
    newStaSouth = Sta;	
}
void SetStaNorth(INT8U Sta)
{
    newStaNorth = Sta;	
}
/*******************************************************************************************************
** 函数名称: INT8U GetSouthPortRunState(void)
** 功能描述: 查询南向端口运行状态
** 输   入: 无
** 输   出: 
** 全局变量: 无
** 调用模块: 
** 作   者: 崔敬军 
** 日   期: 2007年12月22日
**------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日   期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
INT8U GetStaSouth(void)
{ 
    return newStaSouth;
}
INT8U GetStaNorth(void)
{ 
    return newStaNorth;
}
/*******************************************************************************************************
** 函数名称: void ParseSouthPortData(INT32U count,INT32U type)
** 功能描述: 解析南向接口上传的数据
** 输   入: 无
** 输   出: 
** 全局变量: 无
** 调用模块: 
** 作   者: 崔敬军 
** 日   期: 2007年12月22日
**------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日   期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
//解析南向接收到的数据(TS的协议)
//只是解析了TS层的数据
//count		接受的数据长度
//type		上一个状态
//全局变量
//RecSouthPortData					数据缓冲区
//LightModule						光模块状态全局变量
//SouthingBuff.SendSouthingData[]	收到缓冲区数据, 解包后的数据放到这里
uint8 ParseSouthPortData(INT32U count, INT32U type)
{
    INT16U crc_dat = 0;
    INT16U cnt = 0;
    INT8U  *ptr1, *ptr2;
    struct TS *ptrTS=(struct TS *)(RecSouthPortData);
    
    if((RecSouthPortData[0] == 0x7E) && (RecSouthPortData[count-1] == 0x7F))
    {
        OSSchedLock();
        crc_dat = CRC16((&RecSouthPortData[1]), count - 4);							
        OSSchedUnlock();
        
        if( (RecSouthPortData[count-2] == (INT8U)(crc_dat>>8)) && (RecSouthPortData[count-3] == (INT8U)(crc_dat&0xFF)) )
        {
        	//检查命令编号, 是查询南向光模块状态的应答
            if( (RecSouthPortData[3] == CMD_QUERY_MODULE_STA) && S_QueryModuleStaWait==type)	
            {//保存光模块数据
            	//受到南向光模块的应答后清除计数
              	southLightModule.commCnt = 0;	
              	debugInfo.querySouthModuleRecCnt++;//一下这三句话说明了这个问题,RecSouthPortData中的数据解析到southLightModule结构体中的过程。
              	ptr1 = &southLightModule.AlarmData[0];//southLightModule.AlarmData[0]是这个结构体southLightModule的首址
            	ptr2 = &ptrTS->firstDat;//把光模块返回信息的命令数据的首址给了ptr2了,firstDat指向RecSouthPortData的第8个数据,正好是命令数据
            	
            	for(cnt=0; cnt<28; cnt++)
                {
                	*ptr1++ = *ptr2++;
                }
                if(0x01==southLightModule.BufferState)//缓冲区状态,纳闷,什么时候把RecSouthPortData【】中的数据读到southLightModule.BufferState里了
                {
                	SetStaSouth(S_QueryBufDat);
                }
                else
                {
                	SetStaSouth(S_End);
                }
            }
            //是查询南向光模块缓冲区的应答
            else if( (RecSouthPortData[3] == CMD_QUERY_BUF_DAT) )
            {
               	return(1);
            }
            //对本机操作命令的应答的回复
            else if((RecSouthPortData[3] == CMD_FSK_SEND) && S_SendToSouthWait==type)
            {
                debugInfo.fskAckCntSouth++;
                SetStaSouth(S_End);
            }
            else//这里理论上不应到到达
            {
	            //SetStaSouth(S_End);
            }
        }
    }
    return(0);
}

#define QUERY_MODULE		0x01
#define QUERY_MODULE_WAIT	0x02
#define SET_ADDR			0x03
#define SET_ADDR_FSK_WAIT	0x04
#define SET_ADDR_ACK_WAIT	0x05
#define SYC_INF				0x06
#define SYC_INF_FSK_WAIT 	0x07
#define SYC_INF_ACK_WAIT	0x08
uint8 initState;



// 查询母版下面的模块设备基本信息
void QuerMoudule(uint8 state)
{
	uint8 buf[6][8]={
	    {0x7e, 0x02, 0x03, 0x00, 0x33, 0x3b, 0x7e},	//查询GSM模块
	    {0x7e, 0x03, 0x03, 0x00, 0x03, 0x0c, 0x7e},	//查询DCS模块
	    {0x7e, 0x04, 0x03, 0x00, 0x93, 0x89, 0x7e},	//查询CDMA800模块
	    {0x7e, 0x05, 0x03, 0x00, 0xa3, 0xbe, 0x7e},	//查询CDMA2000模块
	    {0x7e, 0x07, 0x03, 0x00, 0xc3, 0xd0, 0x7e},	//查询WCDMA模块
	    {0x7e, 0x06, 0x03, 0x00, 0xf3, 0xe7, 0x7e}};//查询TDSCDMA模块
	WriteCom(Com_North, buf[state], 7, 200);
}

// 解析同步数据内容
int8 Datadisposal(uint8 state, uint8 *pdata, INT32U count)
{
	uint16 crc;
	if ((pdata[0] == 0x7e) && (pdata[count - 1] == 0x7e))	// 校验数据包头和包尾
	{
		crc = CRC16(&pdata[1], count - 4);
		if (((uint8)(crc&0x00ff) == pdata[count-3]) && ((uint8)((crc>>8)&0x00ff) == pdata[count-2]))	// crc校验
		{
			switch(state)
			{
				case 0x02:		// GSM
				case 0x03:		// DCS
				case 0x04:		// CDMA800
				case 0x05:		// CDMA2000
				case 0x07:		// WCDMA
					switch (pdata[2])
					{
						case 0x01: // 同步命令
							Syncdata2G[state].RFSignalSwitch = pdata[4]&0x01;
							// 下行输出过功率告警计数
							if (pdata[5]&0x01 == 0x01)					
							{
							    DownOutputOverPowerAlarmState[state] = 0x01;
							    noDownOutputOverPowerAlarmState[state] = 0x00;
							}
							else
							{
								DownOutputOverPowerAlarmState[state] = 0x00;
								noDownOutputOverPowerAlarmState[state] = 0x01;
							}
							// 下行输出欠功率告警计数
							if ((pdata[5]>>1)&0x01 == 0x01)				
							{
								DownOutputLessPowerAlarmState[state] = 0x01;
								noDownOutputLessPowerAlarmState[state] = 0x00;
							}
							else
							{

⌨️ 快捷键说明

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