📄 modemgtm900.c
字号:
** 功能描述: 读MODEM设备的信源和输入电平
** 输 入: INT8U *dest,总的返回字节长度为9字节,依次顺序为:运营商代码(1),位置区编码(2),
基站识别码(1),BCCH绝对载频号(2),BCCH接收电平(有符号数,1),小区识别码实时值(2)
** 输 出: TRUE,表示成功读取modem的信源信息;
FALSE,表示读取modem信源信息不成功
********************************************************************************
*/
BOOLEAN ModemReadEquipInfo( OUT INT8U *dest)
{
if((GetModemStat() == MODEM_SMS)||(GetModemStat() == MODEM_DATA))
{
memcpy(dest,ModemInfo,9);
return TRUE;
}
return FALSE;
}
///////////////////////////////////////////////////
void ModemEquipInfoPro(X_PACKET *ptrTemp)
{
DATACONV temp;
INT8U i,j;
i = 0;
for(j = 0; j < 5; j ++)
{
while( ptrTemp->pBuf[i] < 0x30)
i ++;
temp.integ = ptrTemp->pBuf[i] - 0x30;
i ++;
while(ptrTemp->pBuf[i] > 0x2f)
{
temp.integ = temp.integ * 10 + (ptrTemp->pBuf[i] - 0x30);
i ++;
}
ptrTemp->pBuf[j * 2] = temp.chr[0];
ptrTemp->pBuf[j * 2 + 1] = temp.chr[1];
}
ModemInfo[4] = ptrTemp->pBuf[0];
ModemInfo[5] = ptrTemp->pBuf[1];
ModemInfo[6] = -ptrTemp->pBuf[4] + 20; //20的耦合器补偿
ModemInfo[0] = ptrTemp->pBuf[8];
for(j = 0; j < 2; j ++)
{
while( ptrTemp->pBuf[i] < 0x30)
i ++;
if(ptrTemp->pBuf[i]> 0x39)
ptrTemp->pBuf[i] -= 0x37;
else
ptrTemp->pBuf[i] -= 0x30;
temp.integ = ptrTemp->pBuf[i];
i ++;
while(ptrTemp->pBuf[i] > 0x2f)
{
if(ptrTemp->pBuf[i] > 0x39)
ptrTemp->pBuf[i] -= 0x37;
else
ptrTemp->pBuf[i] -= 0x30;
temp.integ = temp.integ * 256 + ptrTemp->pBuf[i];
i ++;
}
ptrTemp->pBuf[j * 2] = ((temp.chr[1] << 4) & 0XF0) +temp.chr[0];
ptrTemp->pBuf[j * 2 + 1] = ((temp.chr[3] << 4) & 0XF0) + temp.chr[2];
}
ModemInfo[1] = ptrTemp->pBuf[0];
ModemInfo[2] = ptrTemp->pBuf[1];
ModemInfo[7] = ptrTemp->pBuf[2];
ModemInfo[8] = ptrTemp->pBuf[3];
for(j = 0; j < 2; j ++)
{
while( ptrTemp->pBuf[i] < 0x30)
i ++;
temp.integ = ptrTemp->pBuf[i] - 0x30;
i ++;
while(ptrTemp->pBuf[i] > 0x2f)
{
temp.integ = temp.integ * 10 + (ptrTemp->pBuf[i] - 0x30);
i ++;
}
ptrTemp->pBuf[j * 2] = temp.chr[0];
ptrTemp->pBuf[j * 2 + 1] = temp.chr[1];
}
ModemInfo[3] = ptrTemp->pBuf[0] * 8 + ptrTemp->pBuf[2];
}
/******************************************************************************
**函数名称:ATCmdPRO
**函数功能:AT命令接收解析 SMS方式接收
******************************************************************************/
void ATCmdRcvPro(INT8U fchr)
{
INT8U ch,err;
INT8U i,j;
DATACONV temp;
X_PACKET *ptrTemp = NULL;
FlagModemSmsRcv = 0;
FlagModemSmsRcv = 1;
ptrTemp = GetPcktBuf();
while(ptrTemp == NULL)
{
OSTimeDly(OS_TICKS_PER_SEC/200);//延时5ms
ptrTemp = GetPcktBuf();
#ifdef DEBUG_MODEM
printf("\r\n when receive sms,no packet %s, line %u\n",__FILE__, __LINE__ );
#endif
}
ptrTemp->pBuf[0] = fchr;
for(i = 1; i < MAX_BUFLEN - 1; i ++)
{
ch = EXTUARTGetchTmA(OS_TICKS_PER_SEC/10,&ptrTemp->pBuf[i]);
if(ch == OS_TIMEOUT)
{
break;
}
if(ptrTemp->pBuf[i] == 0x0D)
{
ptrTemp->Info.bufLen = i + 1;
break;
}
}
if (ch != OS_TIMEOUT)
{
//优化处理
for(j = 0; j < 4; j ++)
{
temp.chr[j] = ptrTemp->pBuf[4 - j]; //ARM为小端系统
}
switch(temp.integ)
{
case 0x2043684D: //Q ChMod,读信源信息
{
err = EXTUARTGetchTmA(OS_TICKS_PER_SEC/2,&ch);
for(i = 0; i < MAX_BUFLEN - 1; i ++)
{
ch = EXTUARTGetchTmA(OS_TICKS_PER_SEC/10,&ptrTemp->pBuf[i]);
if((ch == OS_TIMEOUT) || (ptrTemp->pBuf[i] == 0x0D))
{
break;
}
}
if(( i < MAX_BUFLEN) && (ch != OS_TIMEOUT) && (i > 50) && (ptrTemp->pBuf[2] != 'S'))
{
ModemEquipInfoPro(ptrTemp);
ModemCnt = 0;
}
else if(ptrTemp->pBuf[2] == 'S')
{
ModemCnt ++;
}
FreePcktBuf(ptrTemp);
break;
}
case 0x434D474C: //CMGL 列出卡中短信
{
#ifdef DEBUG_MODEM
INT8U k = 0;
#endif
for(j = i + 1; j < MAX_BUFLEN - 1; j ++)
{
#ifdef DEBUG_MODEM
if(ReadPowerInfo(10) == FALSE)
{
turnOnLed(0,k);
if(k == 0)
k = 2;
else
k = 0;
}
#endif
ch = EXTUARTGetchTmA(OS_TICKS_PER_SEC / 10,&ptrTemp->pBuf[j]);
if(ch != OS_TIMEOUT)
{
if(ptrTemp->pBuf[j] == 0x0D)
{
ptrTemp->Info.bufLen = j;
ptrTemp->pBuf[j + 1] = '\0';
ptrTemp->Info.comType = COM_SMS;
ptrTemp->Info.srcPort = PKT_PORT_MODEM;
break;
}
}
else
{
break;
}
}
ptrTemp->pBuf[j + 1] = '\0'; //wjx
//发送命令(AT),MODEM中断短信的LIST并回复ERROR
//防止后面还在LIST时发送的AT命令无效
OSSemPend(EXTUARTSemShareA, 0, &err);
EXTUARTWriteA((INT8U *)ST_M_ATAT,strlen((const char *)ST_M_ATAT));
OSSemPost(EXTUARTSemShareA);
#ifdef DEBUG_MODEM
if(ReadPowerInfo(10) == FALSE)
{
printf("\r\nreceived sms %s, line %u\n",__FILE__, __LINE__ );
//DebugOut(ptrTemp->pBuf,ptrTemp->Info.bufLen);
//DebugOut((INT8U *)"\r\n",2);
turnOnLed(0,0);
}
#endif
if(ch != OS_TIMEOUT)
{
if(ModemSMSPro(ptrTemp,0) == TRUE)
{
#ifdef DEBUG_MODEM
printf("authentic passed %s, line %u\n",__FILE__, __LINE__ );
#endif
OSQPost(QueuePcktApNpa, ptrTemp);
break;
}
}
FreePcktBuf(ptrTemp);
break;
}
case 0x434D4753: //CMGS
{
FreePcktBuf(ptrTemp);
OSSemPost(SMSSndSuc);
break;
}
case 0x434D5449: //CMTI
{
FreePcktBuf(ptrTemp);
#ifdef DEBUG_MODEM
printf("receive sms CMTI: %s, line %u\n",__FILE__, __LINE__ );
#endif
break;
}
case 0x434C4950: //CLIP
{
#ifdef DEBUG_MODEM
//DebugOut(ptrTemp->pBuf,ptrTemp->Info.bufLen);
//DebugOut((INT8U*)"\r\n",2);
#endif
//在此鉴权 如果鉴权不通过,挂断来电
ReadTel(ptrTemp->pBuf,ptrTemp->Info.telNum);
ptrTemp->Info.comType = COM_DATA;
if(AuthPcktBuf(ptrTemp) != TRUE)
{
#ifdef DEBUG_MODEM
printf("\r\nthe calling not passed authentic %s, line %u\n",__FILE__, __LINE__ );
#endif
OSSemPend(EXTUARTSemShareA,OS_TICKS_PER_SEC / 10,&err);
EXTUARTWriteA((INT8U *)ST_M_ATH,strlen((const char *)ST_M_ATH));
OSSemPost(EXTUARTSemShareA);
}
else
{
#ifdef DEBUG_MODEM
printf("\r\n the calling passed authentic %s, line %u\n",__FILE__, __LINE__ );
#endif
DataFlag ++;
ConnectTimeOut = OSTimeGet() + 40 * OS_TICKS_PER_SEC;
}
FreePcktBuf(ptrTemp);
break;
}
case 0x434D543A: //CMT: 自动上发的短信接收
{
#ifdef DEBUG_MODEM
INT8U k = 0;
#endif
for(j = i + 1; j < MAX_BUFLEN - 1; j ++)
{
#ifdef DEBUG_MODEM
if(ReadPowerInfo(10) == FALSE)
{
turnOnLed(0,k);
if(k == 0)
k = 2;
else
k = 0;
}
#endif
ch = EXTUARTGetchTmA(OS_TICKS_PER_SEC / 10,&ptrTemp->pBuf[j]);
if(ch != OS_TIMEOUT)
{
if(ptrTemp->pBuf[j] == 0x0D)
{
ptrTemp->Info.bufLen = j;
ptrTemp->pBuf[j + 1] = '\0';
ptrTemp->Info.comType = COM_SMS;
ptrTemp->Info.srcPort = PKT_PORT_MODEM;
break;
}
}
else
{
break;
}
}
#ifdef DEBUG_MODEM
printf("\r\nreceive sms: %s, line %u\n",__FILE__, __LINE__ );
turnOnLed(0,0);
#endif
if(ch != OS_TIMEOUT)
{
if(ModemSMSPro(ptrTemp,1) == TRUE) //对接收到的短信进行处理,解码
{
#ifdef DEBUG_MODEM
printf("sms passed authentic %s, line %u\n",__FILE__, __LINE__ );
#endif
SMSSendDelay = OSTimeGet() + SmsSendSpan * OS_TICKS_PER_SEC;
OSQPost(QueuePcktApNpa, ptrTemp);
break;
}
}
FreePcktBuf(ptrTemp);
break;
}
default:
{
FreePcktBuf(ptrTemp);
break;
}
}
}
else
{
FreePcktBuf(ptrTemp);
}
}
/*******************************************************************************
** 函数名称: ModemDataRcvPRO
** 功能描述: modem数传模式下的接收处理 语音数传
** 输 入: 无
*******************************************************************************/
void ModemDataRcvPRO(void)
{
INT8U ch,err,*pt1;
INT32U i,j;
DATACONV crc;
X_PACKET *ptrTemp = NULL;
err = EXTUARTGetchTmA(OS_TICKS_PER_SEC/2,&ch);
if((err == OS_TIMEOUT) || (ch != 'X'))
return;
ptrTemp = GetPcktBuf();
while(ptrTemp == NULL)
{
OSTimeDly(OS_TICKS_PER_SEC/200);//延时5ms
ptrTemp = GetPcktBuf();
}
pt1 = (INT8U *)ptrTemp->pBuf;
for(i = 0; i < MAX_BUFLEN - 1; i ++)
{
err = EXTUARTGetchTmA(OS_TICKS_PER_SEC / 10,pt1);
if(err != OS_TIMEOUT)
{
if(*pt1 == 'X')
{
if(i >= 28)
{
ptrTemp->Info.bufLen = i - 2; //该长度仅表示AP层协议包长度,不包括CRC
ptrTemp->Info.comType = COM_DATA;
ptrTemp->Info.srcPort = PKT_PORT_MODEM;
break;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -