📄 masc.cpp
字号:
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 + -