WEB开发网
开发学院软件开发VC 通过串口收发短消息(下) 阅读

通过串口收发短消息(下)

 2010-06-29 20:42:33 来源:WEB开发网   
核心提示:依照GSM 07.05,发送短消息用AT+CMGS命令,通过串口收发短消息(下)(3),阅读短消息用AT+CMGR命令,列出短消息用AT+CMGL命令,继续输出PDU串nLength = ReadComm(ans, 128);// 读应答数据// 根据能否找到"+CMS ERROR"决定成功与否if

依照GSM 07.05,发送短消息用AT+CMGS命令,阅读短消息用AT+CMGR命令,列出短消息用AT+CMGL命令,删除短消息用AT+CMGD命令。但AT+CMGL命令能够读出所有的短消息,所以我们用它实现阅读短消息功能,而没用AT+CMGR。下面是发送、读取和删除短消息的实现代码:

// 发送短消息
// pSrc: 源PDU参数指针
BOOL gsmSendMessage(const SM_PARAM* pSrc)
{
  int nPduLength; // PDU串长度
  unsigned char nSmscLength; // SMSC串长度
  int nLength; // 串口收到的数据长度
  char cmd[16]; // 命令串
  char pdu[512]; // PDU串
  char ans[128]; // 应答串

  nPduLength = gsmEncodePdu(pSrc, pdu); // 根据PDU参数,编码PDU串
  strcat(pdu, "\x01a"); // 以Ctrl-Z结束

  gsmString2Bytes(pdu, &nSmscLength, 2); // 取PDU串中的SMSC信息长度
  nSmscLength++; // 加上长度字节本身

  // 命令中的长度,不包括SMSC信息长度,以数据字节计
  sprintf(cmd, "AT+CMGS=%d\r", nPduLength / 2 - nSmscLength); // 生成命令

  WriteComm(cmd, strlen(cmd)); // 先输出命令串

  nLength = ReadComm(ans, 128); // 读应答数据

  // 根据能否找到"\r\n> "决定成功与否
  if (nLength == 4 && strncmp(ans, "\r\n> ", 4) == 0)
  {
    WriteComm(pdu, strlen(pdu)); // 得到肯定回答,继续输出PDU串

    nLength = ReadComm(ans, 128); // 读应答数据

    // 根据能否找到"+CMS ERROR"决定成功与否
    if (nLength > 0 && strncmp(ans, "+CMS ERROR", 10) != 0)
    {
      return TRUE;
    }
  }

  return FALSE;
}

// 读取短消息
// 用+CMGL代替+CMGR,可一次性读出全部短消息
// pMsg: 短消息缓冲区,必须足够大
// 返回: 短消息条数
int gsmReadMessage(SM_PARAM* pMsg)
{
  int nLength; // 串口收到的数据长度
  int nMsg; // 短消息计数值
  char* ptr; // 内部用的数据指针
  char cmd[16]; // 命令串
  char ans[1024]; // 应答串

  nMsg = 0;
  ptr = ans;

  sprintf(cmd, "AT+CMGL\r"); // 生成命令

  WriteComm(cmd, strlen(cmd)); // 输出命令串
  nLength = ReadComm(ans, 1024); // 读应答数据
  // 根据能否找到"+CMS ERROR"决定成功与否
  if (nLength > 0 && strncmp(ans, "+CMS ERROR", 10) != 0)
  {
    // 循环读取每一条短消息, 以"+CMGL:"开头
    while ((ptr = strstr(ptr, "+CMGL:")) != NULL)
    {
      ptr += 6; // 跳过"+CMGL:"
      sscanf(ptr, "%d", &pMsg->index); // 读取序号

      ptr = strstr(ptr, "\r\n"); // 找下一行
      ptr += 2; // 跳过"\r\n"

      gsmDecodePdu(ptr, pMsg); // PDU串解码
      pMsg++; // 准备读下一条短消息
      nMsg++; // 短消息计数加1
    }
  }

  return nMsg;
}

// 删除短消息
// index: 短消息序号,从1开始
BOOL gsmDeleteMessage(int index)
{
  int nLength; // 串口收到的数据长度
  char cmd[16]; // 命令串
  char ans[128]; // 应答串

  sprintf(cmd, "AT+CMGD=%d\r", index); // 生成命令

  // 输出命令串
  WriteComm(cmd, strlen(cmd));

  // 读应答数据
  nLength = ReadComm(ans, 128);

  // 根据能否找到"+CMS ERROR"决定成功与否
  if (nLength > 0 && strncmp(ans, "+CMS ERROR", 10) != 0)
  {
    return TRUE;
  }

  return FALSE;
}

上一页  1 2 3 4 5  下一页

Tags:通过 串口 收发

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接