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

📄 masc.cpp

📁 mobitex 网络的终端采用的串口通信程序。目前正在使用
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	flag = SendReadQ(&gUartTxQ[mNum], &tmp);
	if(flag==1)//发送缓冲区中存在数据
	{
		ch= tmp;
		if(mNum==COMM2)
        {
            ACC=ch;
			if(P) ch|=0x80;
			SBUF1=ch;
        }
		else if(mNum==COMM1)
        {
        	if(gcCheckout==NO_CHECKOUT)
        	{
				TB8=1;
				SBUF = ch;
			}
			else
			{
				if(gcCheckout==EVEN_CHECKOUT)
				{
					if((gcStopBit==2)||((gcDataBits==8)&&(gcCheckout!=NO_CHECKOUT)))
					{
						if(gcDataBits==8)
						{
							ACC=ch;
							TB8=P;
							SBUF=ch;
						}else
						{
							ACC=ch;
							if(P) ch|=0x80;//如果是偶数个,则补成奇数个
							SBUF=ch;
						}
					}else
					{
						ACC=ch;
						if(P) ch|=0x80;//如果是偶数个,则补成奇数个
						SBUF=ch;
					}
				}else
				{
					if((gcStopBit==2)||((gcDataBits==8)&&(gcCheckout!=NO_CHECKOUT)))
					{
						if(gcDataBits==8)
						{
							ACC=ch;
							TB8=!P;
							SBUF=ch;
						}else
						{
							ACC=ch;
							if(!P) ch|=0x80;//如果是偶数个,则补成奇数个
							SBUF=ch;
						}
					}else
					{
						ACC=ch;
						if(!P) ch|=0x80;//如果是偶数个,则补成奇数个
						SBUF=ch;
					}
				}
			}
        }
        gUart_Send_Busy[mNum] = 1;//置串口忙标志
    }
}
//从masc帧发送缓冲区中发送一个帧到串口发送缓冲区
void SendMascBuffToUartBuff(unsigned charmNum)
{
	unsigned int k;
	//如果masc队列为空,返回

	if(pMascTxBuf_Rd[mNum]==pMascTxBuf_Wr[mNum])
		return;
/*	#ifdef 	_DEBUG_==1
	_monitor_text("Enter SendMascBuffToUartBuff",1);
	#endif
*/
	k=0;
	while(pMascTxBuf_Rd[mNum]!=pMascTxBuf_Wr[mNum])
	{
        if(pMascTxBuf_Rd[mNum]==pMascTxBuf_Wr[mNum])
			break;
		if(pMascTxBuf_Rd[mNum]==MASC_TX_SIZE)
			pMascTxBuf_Rd[mNum]=0;
		ReSendBuf[mNum][k]=Masc_Tx_Buf[mNum][pMascTxBuf_Rd[mNum]];
		Masc_Tx_Buf[mNum][pMascTxBuf_Rd[mNum]]=0;

		pMascTxBuf_Rd[mNum]++;
		if(ReSendBuf[mNum][k] == '\r')//结束符号
		{
		    k++;
			break;
		}
		k++;
	}
	    gRackAllow[mNum]=TRUE;//RACK开始计时
	    gRackCounter[mNum]=0;
	    gAllowSent[mNum] = 0;//将允许发送标志置0,即设为不允许发送
	    gReSendLen[mNum]=k;//将本条消息作备份,为重发作准备
	    SendToUartBuffer(mNum,&ReSendBuf[mNum][0],k);//发向串口

}
//masc帧发送到帧发送缓冲区
void SendFrame_TO_FrameBuff(unsigned charmComNum, unsigned char* pSData, unsigned int Length)
{
	unsigned int i;
/*	#ifdef _DEBUG_==1
	_monitor_text("Enter SendFrame_TO_FrameBuff",1);
	#endif
*/
	for(i=0;i<Length;i++)
	{
		if(pMascTxBuf_Wr[mComNum]>=MASC_TX_SIZE)
			pMascTxBuf_Wr[mComNum]=0;
		Masc_Tx_Buf[mComNum][pMascTxBuf_Wr[mComNum]++]=pSData[i];
	}
}

//发送其他的命令帧,没有需要编码的数据
unsigned charSendCmdFrame(unsigned charmComNum, unsigned char* pSData, unsigned int Length)
{
	unsigned int  i,leavelen;//,len;
	unsigned charchk;
	chk = 0;
	if(pMascTxBuf_Wr[mComNum]>=pMascTxBuf_Rd[mComNum])
	{
		leavelen=MASC_TX_SIZE-pMascTxBuf_Wr[mComNum]+pMascTxBuf_Rd[mComNum];
	}
	else
	{
		leavelen=pMascTxBuf_Rd[mComNum]-pMascTxBuf_Wr[mComNum];
	}
	if(Length+9>leavelen) return FALSE;

	MakeMpakBuf[mComNum][0] = '^';
	ULToHexString(Length+9,&MakeMpakBuf[mComNum][1],4 );//计算长度
    for(i=0; i<Length; i++)
	{
		MakeMpakBuf[mComNum][5+i] = pSData[i];
	}
	MakeMpakBuf[mComNum][5+Length] = ':';
	for(i = 0;i<Length+6;i++)
		chk = chk ^MakeMpakBuf[mComNum][i];
	UcharToHex(chk,&MakeMpakBuf[mComNum][Length+6] );//加上校验位
	MakeMpakBuf[mComNum][Length+6+2] = '\r';
	SendFrame_TO_FrameBuff(mComNum,&MakeMpakBuf[mComNum][0],Length+6+3);
	return TRUE;

}
//发送一个M帧
unsigned charSendMFrame(unsigned charmComNum,unsigned char* pSData, unsigned int Length)
{
	unsigned int i,len,leavelen;
	unsigned charchk;
	chk = 0;
	len = Length*2+10;
/*	#ifdef _DEBUG_==1
	_monitor_text("Enter SendMFrame",1);
	#endif
*/
	if(pMascTxBuf_Wr[mComNum]>=pMascTxBuf_Rd[mComNum])
	{
		leavelen=MASC_TX_SIZE-pMascTxBuf_Wr[mComNum]+pMascTxBuf_Rd[mComNum];
	}
	else
	{
		leavelen=pMascTxBuf_Rd[mComNum]-pMascTxBuf_Wr[mComNum];
	}
	if(len>leavelen) return FALSE;
	MakeMpakBuf[mComNum][0] = '^';
	MascEncode(pSData,&MakeMpakBuf[mComNum][7],Length);//编码
	ULToHexString(Length*2+10,&MakeMpakBuf[mComNum][1],4 );//计算长度
	MakeMpakBuf[mComNum][5] = 'M';
	MakeMpakBuf[mComNum][6] = ':';
	for(i = 0;i<Length*2+7;i++)
	{
		chk = chk ^MakeMpakBuf[mComNum][i];
	}
	UcharToHex(chk,&MakeMpakBuf[mComNum][Length*2+7] );//加上校验位
	MakeMpakBuf[mComNum][Length*2+7+2] = '\r';
	/*#ifdef _DEBUG_==1
	_monitor_text("Leave SendMFrame",1);
	#endif*/
	SendFrame_TO_FrameBuff(mComNum, &MakeMpakBuf[mComNum][0],Length*2+7+3);
	return TRUE;
}

//发送Mpak数据
unsigned char SendMpak( unsigned charmComNum,unsigned long Sender, unsigned long Addressee, unsigned charFlags, unsigned charTypes, unsigned char* pSData, unsigned int Length)
{
    un_long2char mLongData;

	mLongData.LONGDATA = Sender;//发送者地址
	TmpakBuf[mComNum][0] = mLongData.BYTE[1];
	TmpakBuf[mComNum][1] = mLongData.BYTE[2];
	TmpakBuf[mComNum][2] = mLongData.BYTE[3];

	mLongData.LONGDATA = Addressee;//接收者地址
	TmpakBuf[mComNum][3] = mLongData.BYTE[1];
	TmpakBuf[mComNum][4] = mLongData.BYTE[2];
	TmpakBuf[mComNum][5] = mLongData.BYTE[3];

	TmpakBuf[mComNum][6] = Flags;     //设置第七字节
	TmpakBuf[mComNum][7] = Types;     //设置第八字节
	memset(&TmpakBuf[mComNum][8],0,3);//将时间字段清0
	mLongData.LONGDATA = Length;
    MyMemCpy(&TmpakBuf[mComNum][11], pSData, Length);
	SendMFrame(mComNum,&TmpakBuf[mComNum][0], Length+11);
	return 1;
}

/*************************************/
//功能:对MODEM进行初始化
//此函数是对modem进行初始化吗??MascProtocol 的意义不明确。
//
/*************************************/
void MascProtocol(void)
{
    unsigned charj;
	for(j=0; j<COM_NUM; j++)
	{
		//检查串口缓冲中是否有数据,有数据则发送
		SendDataToUart(j);
		//接收数据处理
		RecvDataProcess(j);

  		//将数据从MASC缓冲移向串口缓冲
		if(gAllowSent[j] == 1)//允许发送
		{
			SendMascBuffToUartBuff(j);
		}
	}
	/*********是否发送RACK*****************/
	if(gRackSendFlag[COMM2]==TRUE)
	{
		if(IsQEmpty(&gUartTxQ[COMM2]))
		{
		    gRackSendFlag[COMM2]=FALSE;
		    SendToUartBuffer(COMM2, Masc_Rack_Frame,3);
		}
	}
}
/*************************************/
//功能:初始化masc缓冲区
/*************************************/
void InitMascBuf(unsigned charmComNum)
{
	memset(User_Rx_Buf, 0, MPAK_SIZE) ;
	memset(&Masc_Tx_Buf[mComNum][0],0,MASC_TX_SIZE);
	memset(&Masc_Rx_Frame[mComNum][0], 0, FRAME_SIZE) ;
	InitQ(&gUartTxQ[mComNum], UART_TX_SIZE, gUartTxBuffer[mComNum]);
	InitQ(&gUartRxQ[mComNum], UART_RX_SIZE, gUartRxBuffer[mComNum]);
	pMascTxBuf_Wr[mComNum] = 0;
	pMascTxBuf_Rd[mComNum] = 0;
}

/*************************************/
//功能:初始化masc全局变量
/*************************************/
void InitMascVar(unsigned chari)
{
	powerSaveCount=0;//如果检测到是省电模式2次,则表示modem不正常,需要重启。


	gLastSentSequ[i]='-';
	gLastReceiveSequ[i]='-';
	gInitSentedFlag[i]=0;
	gInitRxFlag[i]=0;
	gAllowSent[i]=1;
	gReSendNum[i] = 0;
	gRackSendFlag[i]=FALSE;
	gRackAllow[i]=FALSE;
	gRackCounter[i]=0;
	gInitStart[i]=FALSE;

	pMascTxBuf_Wr[i] = 0;
	pMascTxBuf_Rd[i] = 0;
	gUart_Send_Busy[i]=0;
	gReSendLen[i] = 0;
	//是否处于有信号状态
	gSignalOk[i]=0;
	//modem初始化完成
	gInitOk[i] = 0;
	gMascFrameRxCnt[i]=0;
        gSensCounter =0;

}


void  RecvDataProcess(unsigned charmComNum)
{
	unsigned charflag, tmp;
	flag = ReadQ(&gUartRxQ[mComNum],&tmp);
	while(flag==1)
	{
		Masc_Rx_Frame[mComNum][gMascFrameRxCnt[mComNum]] = tmp;//从队列中接收数据
		if(mComNum==COMM2)//modem接收数据处理
		{
			if(Masc_Rx_Frame[mComNum][gMascFrameRxCnt[mComNum]] == '\r')
			{
				Masc_Rx_Frame[mComNum][gMascFrameRxCnt[mComNum]+1] = 0;

				//weed 20031212
				
				_monitor_text("m->p",0);
				SendFrameToDte(&Masc_Rx_Frame[mComNum][0],gMascFrameRxCnt[mComNum]+1);
				
    			MascCmdAnalysis(mComNum,&Masc_Rx_Frame[mComNum][0],gMascFrameRxCnt[mComNum]+1);//对modem来的数据解码之后再向用户发送

				gMascFrameRxCnt[mComNum]=0;
				break;
			}
			else
			{
				gMascFrameRxCnt[mComNum]++;
				if(gMascFrameRxCnt[mComNum] > FRAME_SIZE)
				{
					gMascFrameRxCnt[mComNum] = 0;
				}
			}
		}
		else if(mComNum==COMM1)//接收用户数据处理
		{
			DteDataReceived(tmp);
		}
		flag = ReadQ(&gUartRxQ[mComNum],&tmp);
	}
}
//MAPK API

unsigned char * GetPktData(unsigned char * pPkt)
{
	DATA_PKT  * pDataPkt;
	HPDATA_PKT  * pHpdataPkt;
	pHpdataPkt=(HPDATA_PKT  *)pPkt;
	pDataPkt=(DATA_PKT  *)pPkt;
	if (GetPacketType(pPkt)!=MPAK_HPDATA)
		return (pDataPkt->TEXT);
	else
		return (pHpdataPkt->TEXT);
}
unsigned char GetTrafficState(unsigned char * pPkt)
{
	DATA_PKT  * pDataPkt;
	unsigned chartrafficStatus;
	pDataPkt=(DATA_PKT  *)pPkt;
	trafficStatus = pDataPkt->SUBSCRIPTION.BYTE;
	trafficStatus = trafficStatus&0xE0;
	trafficStatus = trafficStatus>>5;
	return trafficStatus;
}

unsigned char GetPacketType(unsigned char * pPkt)
{
	DATA_PKT  * pDataPkt;
	unsigned charpktType;
	pDataPkt=(DATA_PKT  *)pPkt;
	pktType = pDataPkt->PACKET.BYTE ;
	pktType =pktType&0x1F;
	return pktType;
}

unsigned char GetProtocolId(unsigned char * pPkt)
{
	HPDATA_PKT  * pHpdataPkt;
	pHpdataPkt=(HPDATA_PKT  *)pPkt;
	if(GetPacketType(pPkt)==MPAK_HPDATA)
		return pHpdataPkt->PROTOCOL;
	else
		return 0;
}

unsigned long  GetSender(unsigned char * pPkt)
{
	un_long2char mLongData;
	DATA_PKT  * pDataPkt;
	pDataPkt=(DATA_PKT  *)pPkt;
	mLongData.BYTE[0] = 0;
	mLongData.BYTE[1] =	pDataPkt->SENDER[0] ;
	mLongData.BYTE[2] =	pDataPkt->SENDER[1] ;
	mLongData.BYTE[3] =	pDataPkt->SENDER[2] ;
	return (mLongData.LONGDATA);
}

unsigned char GetStatus(unsigned char * pPkt)
{
	DATA_PKT  * pDataPkt;
	HPDATA_PKT  * pHpdataPkt;
	pHpdataPkt=(HPDATA_PKT  *)pPkt;
	pDataPkt=(DATA_PKT  *)pPkt;
	return *(pDataPkt->TEXT);

}

unsigned long  GetTime(unsigned char * pPkt)
{
	un_long2char mLongData;
	DATA_PKT  * pDataPkt;
	pDataPkt=(DATA_PKT  *)pPkt;
	mLongData.BYTE[0] = 0;
	mLongData.BYTE[1] =	pDataPkt->TIME[0] ;
	mLongData.BYTE[2] =	pDataPkt->TIME[1] ;
	mLongData.BYTE[3] =	pDataPkt->TIME[2] ;
	return (mLongData.LONGDATA);
}


void InitTmpak0()
{
	unsigned chari;
	for(i=0;i<20;i++)
		TmpakBuf[COMM2][i]=0;
}

void SetAddressee(unsigned long  address)
{
    un_long2char mLongData;
	mLongData.LONGDATA = address;//接收者地址
	TmpakBuf[COMM2][3] = mLongData.BYTE[1];
	TmpakBuf[COMM2][4] = mLongData.BYTE[2];
	TmpakBuf[COMM2][5] = mLongData.BYTE[3];
}
void SetData(unsigned char * pUserData,unsigned int dataLength)
{
 	unsigned charpktType;
	HPDATA_PKT*  pHpdataPkt;
	pHpdataPkt=(HPDATA_PKT* )TmpakBuf[COMM2];
	pktType = pHpdataPkt->PACKET.BYTE ;
	pktType =pktType&0x1F;
	if (pktType==MPAK_HPDATA)
		MyMemCpy(&TmpakBuf[COMM2][12], pUserData, dataLength);
	else
		MyMemCpy(&TmpakBuf[COMM2][11], pUserData, dataLength);

}
void SetMailbox(unsigned char bMailbox)
{
	DATA_PKT  * pDataPkt;
	pDataPkt=(DATA_PKT  *)TmpakBuf[COMM2];
	if(bMailbox==1)
	pDataPkt->SUBSCRIPTION.BYTE =pDataPkt->SUBSCRIPTION.BYTE |0x01;

}
void SetPosack(unsigned char posack)
{
	DATA_PKT  * pDataPkt;
	pDataPkt=(DATA_PKT  *)TmpakBuf[COMM2];
	if(posack==1)
	pDataPkt->SUBSCRIPTION.BYTE = pDataPkt->SUBSCRIPTION.BYTE|0x02;
}
void SetPacketType(unsigned char pktType)
{
	DATA_PKT * pDataPkt;
	pDataPkt=(DATA_PKT *)TmpakBuf[COMM2];
	pDataPkt->PACKET.BYTE=pktType;
}

unsigned charGetToSendMpakType()
{
	DATA_PKT * pDataPkt;
	pDataPkt=(DATA_PKT *)TmpakBuf[COMM2];
	return pDataPkt->PACKET.BYTE;
}

void SetProtocolId(unsigned charprotocolId)
{
	HPDATA_PKT * pHpdataPkt;
	pHpdataPkt=(HPDATA_PKT *)TmpakBuf[COMM2];
	pHpdataPkt->PROTOCOL = protocolId;
}

void SendPkt(unsigned int  dataLength)
{
 unsigned charpktType;
 un_long2char mLongData;
	HPDATA_PKT  * pHpdataPkt;
	pHpdataPkt=(HPDATA_PKT  *)TmpakBuf[COMM2];

	mLongData.LONGDATA = gSenderMan;//发送者地址
	TmpakBuf[COMM2][0] = mLongData.BYTE[1];
	TmpakBuf[COMM2][1] = mLongData.BYTE[2];
	TmpakBuf[COMM2][2] = mLongData.BYTE[3];
	memset(&TmpakBuf[COMM2][8],0,3);//将时间字段清0
	pktType = pHpdataPkt->PACKET.BYTE ;
	pktType =pktType&0x1F;
	if (pktType==MPAK_HPDATA)
		SendMFrame(COMM2,&TmpakBuf[COMM2][0], dataLength+12);
	else
		SendMFrame(COMM2,&TmpakBuf[COMM2][0], dataLength+11);

}

void SendFrameToDte(unsigned char * frm, unsigned long frmLen)
{
	//#if _DEBUG_==1
	//_monitor_text("SendFrameToDte SendToUartBuffer",1);
	//#endif
	SendToUartBuffer(COMM1,frm ,frmLen);
}
void InitNetLayerSignle()
{
	mpakRcved_Sigle =0;
	inNetworkContanct_Sigle=0;
	outOfNetworkContanct_Sigle=0;
	mpakNotSent_Sigle=0;
	mpakSent_Sigle=0;
	terminalMAN_Sigle=0;
	mascErrCode_Signle =0;

}

void SendTo(unsigned long address, unsigned char * buf,unsigned long bufLen)
{
	SetAddressee(address);
	SetData(buf,bufLen);
	SendPkt(bufLen);
}
void CancelLastMpak()
{
	SendCmdFrame(COMM2,Masc_cancelLastMpak,3);
}

⌨️ 快捷键说明

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