📄 m32.c
字号:
}
/*****************************************************************************************************
* int gsmDecode7bit(const unsigned char* pSrc, char* pDst, int nSrcLength)
*
* 7-bit解码
* pSrc: 源编码串指针
* pDst: 目标字符串指针
* nSrcLength: 源编码串长度
* 返回: 目标字符串长度
*******************************************************************************************************/
//int gsmDecode7bit(const unsigned char* pSrc, char* pDst, int nSrcLength)
int gsmDecode7bit(uchar* pSrc, char * pDst, int nSrcLength)
{
int nSrc; // 源字符串的计数值
int nDst; // 目标解码串的计数值
int nByte; // 当前正在处理的组内字节的序号,范围是0-6
unsigned char nLeft; // 上一字节残余的数据
// 计数值初始化
nSrc = 0;
nDst = 0;
// 组内字节序号和残余数据初始化
nByte = 0;
nLeft = 0;
// 将源数据每7个字节分为一组,解压缩成8个字节
// 循环该处理过程,直至源数据被处理完
// 如果分组不到7字节,也能正确处理
while(nSrc<nSrcLength)
{
// 将源字节右边部分与残余数据相加,去掉最高位,得到一个目标解码字节
*pDst = ((*pSrc << nByte) | nLeft) & 0x7f;
// 将该字节剩下的左边部分,作为残余数据保存起来
nLeft = *pSrc >> (7-nByte);
// 修改目标串的指针和计数值
pDst++;
nDst++;
// 修改字节计数值
nByte++;
// 到了一组的最后一个字节
if(nByte == 7)
{
// 额外得到一个目标解码字节
*pDst = nLeft;
// 修改目标串的指针和计数值
pDst++;
nDst++;
// 组内字节序号和残余数据初始化
nByte = 0;
nLeft = 0;
}
// 修改源串的指针和计数值
pSrc++;
nSrc++;
}
*pDst = 0;
// 返回目标串长度
return nDst;
}
// PDU解码,用于接收、阅读短消息
// pSrc: 源PDU串指针
// pDst: 目标PDU参数指针
// 返回: 用户信息串长度
int gsmDecodePdu(char * pSrc)
{
int nDstLength; // 目标PDU串长度
unsigned char tmp; // 内部用的临时字节变量
// SMSC地址信息段
gsmString2Bytes(pSrc, &tmp, 2); // 取长度
tmp = (tmp - 1) * 2; // SMSC号码串长度
pSrc += 4; //指针后移
gsmSerializeNumbers(pSrc, SCA, tmp);
#if 0
putstring1("SCA=\r\n");
putstring1(SCA);
putstring1("\r\n");
#endif
// 转换SMSC号码到目标PDU串
pSrc += tmp;
#if 0
putstring1("pSrc=\r\n");
putstring1(pSrc);
putstring1("\r\n"); //040D9168
#endif
// 指针后移
// TPDU段基本参数、回复地址等
gsmString2Bytes(pSrc, &tmp, 2);
//tmp=04 No return back addr
//tmp=84 have return back addr
// 取基本参数
pSrc += 2;
// 指针后移
#if 0
putstring1("pSrc=\r\n");
putstring1(pSrc);
putstring1("\r\n"); //0D9168
#endif
//if(tmp & 0x80)
{
// 包含回复地址,取回复地址信息
gsmString2Bytes(pSrc, &tmp, 2); // 取长度
if(tmp==13)putstring1("13\r\n");
if(tmp & 1) tmp += 1; // 调整奇偶性
if(tmp==14)putstring1("14\r\n");
pSrc += 4;
// 指针后移
gsmSerializeNumbers(pSrc, TPA, tmp);
// 取TP-RA号码
#if 0
putstring1("TPA=\r\n");
putstring1(TPA);
putstring1("\r\n");
#endif
pSrc += tmp;
// 指针后移
}
// TPDU段协议标识、编码方式、用户信息等
gsmString2Bytes(pSrc, (unsigned char*)&TP_PID, 2); // 取协议标识(TP-PID)
pSrc += 2; // 指针后移
gsmString2Bytes(pSrc, (unsigned char*)&TP_DCS, 2); // 取编码方式(TP-DCS)
pSrc += 2; // 指针后移
gsmSerializeNumbers(pSrc, TP_SCTS, 14); // 服务时间戳字符串(TP_SCTS)
pSrc += 14; // 指针后移
gsmString2Bytes(pSrc, &tmp, 2); // 用户信息长度(TP-UDL)
pSrc += 2; // 指针后移
if(TP_DCS == GSM_7BIT)
{
// 7-bit解码
nDstLength = gsmString2Bytes(pSrc, ans, tmp & 7 ? (int)tmp * 7 / 4 + 2 : (int)tmp * 7 / 4);
// 格式转换
gsmDecode7bit(ans, TP_UD, nDstLength);
putstring1("TP_UD=\r\n");
putstring1(TP_UD);
putstring1("\r\n");
// 转换到TP-DU
nDstLength = tmp;
}
else if(TP_DCS == GSM_UCS2)
{
#if 0
// UCS2解码
nDstLength = gsmString2Bytes(pSrc, ans, tmp * 2); // 格式转换
nDstLength = gsmDecodeUcs2(ans, TP_UD, nDstLength); // 转换到TP-DU
#endif
}
else
{
// 8-bit解码
nDstLength = gsmString2Bytes(pSrc, ans, tmp * 2); // 格式转换
//nDstLength = gsmDecode8bit(ans, TP_UD, nDstLength); // 转换到TP-DU
}
//返回目标字符串长度
return nDstLength;
}
int gsmDeleteSms(int xdata index)
{
int xdata n;
ClearBuf(ans,256);
sprintf(ans,"AT+CMGD=");
sprintf(cmd,"%d",index);
strcat(ans,cmd);
strcat(ans,"\r\n");
putstring1(ans);
putstring1("\r\n");
SysTimer=_10_SEC;
while(SysTimer)
{
ATSend(ans);
ReadSerail(ans, 128, &n,5);
if((strstr(ans,"OK"))!= NULL) return 1;
ATSend("AT\r\n");
delay_ms(20);
}
}
/**************************************************************************************************************
GSM_IO10: L->H-L,H=40-50 ms,wake up MCU,and gsm set IO11 to low.
GSM_ROW4: ,Wake up GSM.
Host to GSM: check GSM sleep? if yes,Host pull low GSM_ROW4 to low 50 ms,at once send AT command.
**************************************************************************************************************/
// SM station
// MS Me
/*****************************************************************************************************************
1.设置短消息中心号码: AT+CSCA="+8613800755500" <CR>. (地区不同,设置不同)
2.设置短消息格式: AT+CMGF=0<CR> (0==PDU mode)
3.设置短消息存放的位置: AT+CPMS="SM"<CR> (SM表示将短消息存放在SIM卡中)
4.设置短消息到达通知: AT+CNMI=1,1,0,0,1<CR> (此命令可以使GSM模块在短消息到达后向MCU发送指令:AT+CMTI:"SM",INDEX<CR>)
*****************************************************************************************************************/
void gsmModule_init(void)
{
GSM_PWON=HIGH;
delay_ms(5);
GSM_PWON=LOW;
delay_ms(200); //Over 120 ms,M32 power on.
GSM_PWON=HIGH;
delay_ms(200);
putbyte('A');
putbyte('T');
putbyte('\r');
gsm_task = 0;
AlarmFlag = FALSE;
SysTimer=20;
while(SysTimer);
//
putbyte('A');
putbyte('T');
putbyte('\r');
SysTimer=20;
while(SysTimer);
putstring1("\r\n");
putstring1("Reset GSM Module OK!\r\n");
//AlarmFlag = 1;
//sprintf(cmd, "ATD13554997942;\r\n"); // 生成命令
//putstring(cmd); // 先输出命令串
ClearBuf(SCA,16);
}
void HangUpCall(void)
{
//sprintf(cmd, "AT+CHUP\r\n"); // 生成命令
ATSend("ATH\r\n"); // 生成命令
}
void RecieveCall(void) //接电话,回应呼叫
{
sprintf(cmd, "ATA\r\n"); // 生成命令
putstring(cmd); // 先输出命令串
}
void Recall(void)
{
sprintf(cmd, "ATDL\r\n"); // 生成命令
putstring(cmd); // 先输出命令串
}
//int xdata gpsWait;
uchar gsmMain(void)
{
int i,n;
unsigned char nSmscLength; // SMSC串长度
uchar xdata* ptr;
if(GPSTimerReq==TRUE)
{
if(GPSTimer30==0)
{
GPSTimer30=_30_SEC;
gsm_task = 40;
}
}
switch(gsm_task)
{
case 0:
ATSend("AT\r");
ReadSerail(ans, 128, &n,5);
if(strstr(ans,"\r\nOK")==NULL)
{
putbyte('\r');
delay_ms(200);
break;
}
putstring1("\r\n");
putstring1("Start Debug GSM:\r\n");
gsmInitPhoneBook();
#if 0
gsmDeletePhone(1);
//gsmPhoneBookTask(GSM_DELET_PHONE,NULL,NULL,1);
ATSend("AT+CPBF=\"GWM\"\r");
ReadSerail(ans, 256, &n,5);
putstring1(ans);
putstring1("\r\n");
#endif
gsm_task++;
break;
case 1:
if(strlen(SCA))
{
gsm_task++;
break;
}
putstring1("Read SMC:\r\n");
//读短消息中心号码:
ATSend("AT+CSCA?\r");
ReadSerail(ans, 128, &n,5);
if((strstr(ans, "+CSCA: ")) == NULL)
{
putbyte('\r');
delay_ms(20);
break;
}
if((ptr=strstr(ans, "\"+")) == NULL)
{
putbyte('\r');
delay_ms(20);
break;
}
else
{
ptr +=2; //skip '"+'
if(strncpy(SCA,ptr,16) != NULL) //SCA[]="+8613800755500"
{
for(i=0;i<16;i++)
{
if((SCA[i]=='\"') && (SCA[i+1]==',') )
{
SCA[i]=0; //第二个"后面清0;
putstring1("SCA:\r\n");
putstring1(SCA);
putstring1("\r\n");
TP_PID=0; // 用户信息协议标识(TP-PID)
TP_DCS=GSM_7BIT; // 用户信息编码方式(TP-DCS)
//TP_SCTS[16]; // 服务时间戳字符串(TP_SCTS), 接收时用到
index=0; // 短消息序号,在读取时用到
gsm_task++;
break;
}
}
}
}
break;
case 2: //check GSM status:
ATSend("AT+CPAS\r");
ReadSerail(ans, 128, &n,5);
if((ptr=strstr(ans,"+CPAS: ")) != NULL)
{
ptr +=6;
sscanf(ptr, "%d", &n);
if(n==0) //0-- ready
{
putstring1("Check SMS!\r\n");
gsm_task=13; //check "RING" ?
}
else
if(n==3) //3--ring
{
//putstring1("Check Ring!\r\n");
gsm_task=3; //check "RING" ?
}
else
if(n==5) //5-- asleep
{
}
}
else
{
putbyte('\r');
delay_ms(200);
}
break;
case 3: //check ring ?
ReadSerail(ans, 128, &n,5);
if((ptr=strstr(ans,"RING")) != NULL)
{
putstring1("RING!\r\n");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -