?? 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 + -