📄 portdirection.c
字号:
}
}
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 + -