// 从列表中解析出全部短消息 // 输入: pBuff - 短消息列表缓冲区 // 输出: pMsg - 短消息缓冲区 // 返回: 短消息条数 int gsmParseMessageList(SM_PARAM* pMsg, SM_BUFF* pBuff) { int nMsg; // 短消息计数值 char* ptr; // 内部用的数据指针 nMsg = 0; ptr = pBuff->data; // 循环读取每一条短消息, 以"+CMGL:"开头 while((ptr = strstr(ptr, "+CMGL:")) != NULL) { ptr += 6; // 跳过"+CMGL:", 定位到序号 sscanf(ptr, "%d", &pMsg->index); // 读取序号 // TRACE(" index=%d\n",pMsg->index); ptr = strstr(ptr, "\r\n"); // 找下一行 if (ptr != NULL) { ptr += 2; // 跳过"\r\n", 定位到PDU gsmDecodePdu(ptr, pMsg); // PDU串解码 pMsg++; // 准备读下一条短消息 nMsg++; // 短消息计数加1 } } return nMsg; }
///////////////////////////////////////////////////////////////////////////////// // 函数:gsmReadMessage // // 说明:读取短消息,用+CMGL代替+CMGR,可一次性读出全部短消息 // // 参数: // // pMsg: 短消息缓冲区,必须足够大 // // 返回: 短消息条数 // ///////////////////////////////////////////////////////////////////////////////// int CSerialPort::gsmReadMessage(SM_PARAM* pMsg) { int nLength; // 串口收到的数据长度 int nMsg; // 短消息计数值 char* ptr; // 内部用的数据指针 char *ptr1; char cmd[16]; // 命令串 char ans[1024]; // 应答串 nMsg = 0; ptr = ans; sprintf(cmd, "AT+CMGR=1\r"); // 生成命令 WritePort(cmd, strlen(cmd)); // 输出命令串 Sleep(ShortSleepTime); nLength = ReadPort(ans, 1024); // 读应答数据 // 根据能否找到"+CMS ERROR"决定成功与否 ans[nLength]='\0'; if(nLength > 0 && strncmp(ans, "+CMGR:", 6) != 0) { // 循环读取每一条短消息, 以"+CMGL:"开头 pMsg->index=1; ptr = strstr(ans, "\r\n089168"); ptr += 2; // 跳过"\r\n" ptr1=ptr; for(int ii=0;;ii++) { ptr1=ptr1+1; if(*ptr1=='\r'&&*(ptr1+1)=='\n'&&*(ptr1+2)=='\r'&&*(ptr1+3)=='\n') { *ptr1=0x0; break; } } gsmDecodePdu(ptr, pMsg); // PDU串解码 nMsg++; // 短消息计数加1 } sprintf(cmd, "AT+CMGD=1,4\r"); // 生成命令 WritePort(cmd, strlen(cmd)); // 输出命令串 Sleep(ShortSleepTime); return nMsg; }
int ReadMsg(char *pzMsg, int nCodeType, unsigned index) { if (index==0) { return -1; } if (AT_Set_CodeType(nCodeType)==FALSE) { return -2; } char szATCmd[CodeLen]; char szOneMsg[CodeLen]; char szTemp[CodeLen]; char *p=NULL; int nhaveTrytime=0; sprintf(szATCmd,"AT+CMGR=%d\r", index); SendATCmd(szATCmd); nhaveTrytime=0; memset(szATCmd, 0, CodeLen); while (nhaveTrytime<WaitForSMSSendOKTime) { GetATCmd(szTemp); strcat(szATCmd, szTemp); if (strstr(szATCmd, "\r\nERROR\r\n")!=NULL) { return -3; } if (strstr(szATCmd, "\r\nOK\r\n")!=NULL) { break; } nhaveTrytime++; } if (strstr(szATCmd, "\r\nOK\r\n")==NULL) { return -4; } //完整消息 text模式 15\r\n 这个15就是数据 // AT+CMGR=1\r // \r\n // +CMGR: "REC READ","+8615802047291",,"12/05/25,14:32:48+32"\r\n // 15\r\n // \r\n // OK\r\n // AT+CMGR=11\r // \r\n // +CMGR: 0,,0\r\n // \r\n // OK // \r\n //完整消息 PDU模式 xxxx\r\n 这个xxxx就是数据 // AT+CMGR=1\r // \r\n // +CMGR: 1,,22\r\n // xxxxxxxx\r\n // \r\n // OK\r\n p=strstr(strstr(szATCmd,"\r\n")+2,"\r\n")+2; memset(szOneMsg, 0, CodeLen); strncpy(szOneMsg, p, strstr(p, "\r\n") - p); #ifdef WIN32 if (nCodeType == SMS_PDU) { SM_PARAM sm_p; memset(&sm_p, 0, sizeof(sm_p)); gsmDecodePdu(szOneMsg, &sm_p); sprintf(pzMsg, "%s", sm_p.TP_UD); } else { sprintf(pzMsg, "%s", szOneMsg); } #endif sprintf(pzMsg, "%s", szOneMsg); return 0; }