⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 debug.c

📁 GPS驱动集合
💻 C
📖 第 1 页 / 共 4 页
字号:
        vege_price[2] = vege_price[3] = vege_price[4] = '\0';
      if (strlen(sms_deliver.PDUData) < 40)
      //未满 
      {
        display_type = 0;
        type_screen();
      }
      else
      //信息已满 
      {
        write_cmd(0x01); //消除当前显示 
        put_string(0x90, " ");
        put_string(0x90, "信息已满!"); //间隔160ms闪烁显示 
        for (i = 0; i < 2; i++)
          delay_1s();
        write_cmd(0x01);
        display_type = 2;
        info_screen();
      }
    }
  }
  return ;
}

//PAGEDOWN键的响应函数 
void key_pageup()
{
  char idata page_count, x;
  if (display_type == 0)
  //如果是品种界面显示,就响应按键显示相应的界面 
  {
    if (vege_page_index == 0)
      vege_page_index = 9;
    else
      vege_page_index--;
    type_screen();
    return ;
  }
  if (display_type == 2)
  //蔬菜信息界面 
  {
    if (info_count > 3)
    //如果信息数大于3条 
    {
      page_count = 0;
      x = info_count;
      while (x > 0)
      {
        page_count++;
        x -= 3;
      }
      info_page_index = (info_page_index == 0) ? (page_count - 1): 
        (info_page_index - 1);
      info_screen();
    }
    return ;
  }
  return ;
}

//PAGEDOWN键的响应函数 
void key_pagedown()
{
  char idata page_count, x;
  if (display_type == 0)
  //如果是品种界面显示,就响应按键显示相应的界面 
  {
    if (vege_page_index == 9)
      vege_page_index = 0;
    else
      vege_page_index++;
    type_screen();
    return ;
  }
  if (display_type == 2)
  //蔬菜信息界面 
  {
    if (info_count > 3)
    {
      page_count = 0;
      x = info_count;
      while (x > 0)
      {
        page_count++;
        x -= 3;
      }
      info_page_index = ((info_page_index == page_count - 1) ? 0 :
        info_page_index + 1);
      info_screen();
    }
    return ;
  }
}

//发送键的响应函数 
void key_send()
{
  uchar idata i, j, flag = 2; 
    // flag: 0(信息发送成功) 1(发送失败) 2(没有返回值) 
  if (display_type == 0)
  {
    if (info_count != 0)
    {
      display_type = 2;
      info_screen();
      return ;
    }
    else
    {
      put_string(0x9d, "无信息"); //没有存蔬菜信息 
      delay_160ms();
      put_string(0x9d, " ");
      put_string(0x9d, vege_type);
    }
  }
  else if (display_type == 2)
  {
    write_cmd(0x01);
    put_string(0x90, " ");
    put_string(0x90, "信息发送中...");
    memset(RcvBuf, 0, sizeof(RcvBuf));
    receive_SMS(); //receive SMS,judge the center_phone change 
    delay();
    //如果不成功就再发,最多发三次,再不成功就放弃 
    for (i = 0; i < 3; i++)
    {
      send_response(); //send SMS 
      delay_1s();
      delay_1s();
      delay_1s();
      for (j = 0; j < 30; j++)
      {
        if (RcvBuf[j] == 'O' &amt;  &amt; RcvBuf[j + 1] == 'K')
        //返回的"OK" 
        {
          flag = 0;
          break;
        } //0: 发送成功 
        else if (RcvBuf[j] == 'E' &amt;  &amt; RcvBuf[j + 1] == 'R' &amt; 
          &amt; RcvBuf[j + 2] == 'R' &amt;  &amt; RcvBuf[j + 3] == 'O' &amt; 
          &amt; RcvBuf[j + 4] == 'R')
        //返回的"ERROR" 
        {
          flag = 1;
          break;
        } //1: 发送失败 
      }
      if (flag == 0)
        break;
      //发送成功,跳出循环 
    }
    if (flag == 0)
    {
      write_cmd(0x01); //清除当前显示 
      put_string(0x90, " ");
      put_string(0x90, "发送成功");
      delay_1s();
      delay_1s();
      //清除各全局变量 
      memset(sms_deliver.PDUData, 0, sizeof(sms_deliver.PDUData));
      info_count = 0;
      info_page_index = 0;
      memset(vege_type, '\0', sizeof(vege_type));
      memset(vege_price, '\0', sizeof(vege_price));
    }
    if (flag == 1 &amt;  &amt; i == 3)
    //第三次发返回的还是ERROR 
    {
      write_cmd(0x01); //清除当前显示 
      put_string(0x90, " ");
      put_string(0x90, "失败,没信号");
      delay_1s();
      delay_1s();
    }
    display_type = 0;
    type_screen(); //返回蔬菜品种界面 
  }
}

//program to process keys when pressed//// 
void key_int()interrupt 2
{
  int idata t; //延时变量; 
  uchar idata keycode; //键盘码; 
  uchar idata scancode; //扫描码; 
  uchar idata flag = 0xff; //键是否释放标志; 
  //延时去抖动 
  t = 4000;
  while (t--)
    ;
  //延时10ms; 
  if (INT1 == 1)
    return ;
  //如果中断引脚为高电平,为抖动,则跳出; 
  EX1 = 0; //关闭中断,开始处理键盘; 
  //扫描被按下的键的位置 
  scancode = 0xef; //给出第一行的键盘扫描码,进行逐行扫描; 
  while (scancode != 0xff)
  {
    P1 = scancode; //输入扫描码,扫描第一行; 
    keycode = P1; //数据送到键码,看是否本行有键按下; 
    if ((keycode &amt; 0x0f) != 0x0f)
      break;
    //有键按下,退出循环; 
    else
      scancode = (keycode << 1) | 0x0f;
    //否则,更新扫描码换下一行继续扫描; 
  } //当扫描码变为0xff时,不满足循环条件则退出循环; 
  //判断键是否被释放// 
  P1 = 0x0f;
  while (1)
  {
    if (INT1 == 1)
    //INT1=1时,键释放 
    {
      flag = ~flag;
      if (flag == 0)
      //键释放标志为零则跳出循环 
        break;
    }
  }
  //确定键值,转到相应的处理程序// 
  keycode = ~keycode;
  switch (keycode)
  {
    case 0x28:
      key_num(0);
      break;
    case 0x12:
      key_num(1);
      break;
    case 0x22:
      key_num(2);
      break;
    case 0x42:
      key_num(3);
      break;
    case 0x82:
      key_num(4);
      break;
    case 0x14:
      key_num(5);
      break;
    case 0x24:
      key_num(6);
      break;
    case 0x44:
      key_num(7);
      break;
    case 0x84:
      key_num(8);
      break;
    case 0x18:
      key_num(9);
      break;
    case 0x48:
      key_dot();
      break;
    case 0x11:
      key_cancel();
      break;
    case 0x81:
      key_confirm();
      break;
    case 0x21:
      key_pageup();
      break;
    case 0x41:
      key_pagedown();
      break;
    case 0x88:
      key_send();
      break;
    default:
      break;
  }
  EX1 = 1; //重新打开中断,可以接受新的中断 
}

////////////////////////////////////////////////////////////////////////////////// 
//////////////////以下程序为与手机模块相关的程序////////////////////////////////// 
////////////////////////////////////////////////////////////////////////////////// 
void GSM_int(void)interrupt 4
{
  EA = 0;
  delay();
  if (RI == 1)
  //data received 
  {
    RI = 0;
    RcvBuf[RcvIndex] = SBUF;
    RcvIndex++;
    if (RcvIndex > 4)
    {
      if (SBUF == LF)
      {
        LFCount++;
        if (RcvBuf[RcvIndex - 3] == 'K' || RcvBuf[RcvIndex - 3] == 'R')
        {
          if (RcvBuf[6] == 'L' &amt;  &amt; RcvBuf[2] == '+')
          {
            bListEnd = 1;
            listchar_count = RcvIndex;
            memcpy(ListBuf, RcvBuf, sizeof(RcvBuf));
          }
          bResponsed = 1;
          RcvIndex = 0;
          LFCount = 0;
        }
      }
    }
    else
      if (RcvBuf[RcvIndex - 2] == PROMPT)
        RcvIndex = 0;
  }
  EA = 1;
}

/////////////////////function: send string//////////////////////////////////////// 
void send_string(char *str)
{
  char idata i = 0;
  uchar idata len = strlen(str);
  for (i = 0; i < len; i++)
  {
    SBUF = str[i];
    while (!TI){}
    TI = 0;
  }
}

/////////////手机模块初始化函数/////////////////////////////////////////////////////////// 
char init_GSM()
{
  char idata result = 0, i;
  IGT = 0;
  delay_1s();
  delay_1s();
  delay_1s();
  send_string("AT\r"); //test AT command 
  delay_1s();
  send_string("ATE0\r"); //Enable command echo 
  delay_160ms();
  put_string(0x80, RcvBuf); ///////for debug 
  result = find_OK_ERROR() + result;
  send_string("AT+CMGF=0\r"); 
    //Select SMS message formate(选择短消息信息格式:0-PDU;1-文本) 
  delay_160ms();
  put_string(0x80, RcvBuf); ///////for debug 
  delay_1s(); //////////for debug 
  result = find_OK_ERROR() + result;
  send_string("AT+CNMI=0,0,0,0,1\r");
  delay_160ms();
  put_string(0x80, RcvBuf); ///////for debug 
  delay_1s(); //////////for debug 
  result = find_OK_ERROR() + result;
  send_string("AT+CMEE=2\r"); //Report mobile equipment error 
  delay_160ms();
  put_string(0x80, RcvBuf); ///////for debug 
  delay_1s(); //////////for debug 
  result = find_OK_ERROR() + result;
  send_string("AT+CPMS?\r");
  delay_160ms();
  put_string(0x80, RcvBuf); ///////for debug 
  delay_1s(); //////////for debug 
  result = find_OK_ERROR() + result;
  send_string("AT+CREG?\r"); //simply assume registered,refine later 
  delay_160ms();
  put_string(0x80, RcvBuf); ///////for debug 
  delay_1s(); //////////for debug 
  result = find_OK_ERROR() + result;
  send_string("AT+CFUN=1\r"); //set ME to full function 
  // send_string("AT+CFUN=1,1\r"); //reset and restart ME to full function 
  delay_160ms();
  put_string(0x80, RcvBuf); ///////for debug 
  delay_1s(); //////////for debug 
  send_string("AT+COPS=0\r"); 
    //GSM network operator is to be selected automatically 
  for (i = 0; i < 9; i++)
    delay_1s();
  send_string("AT+COPS?\r"); //read the status to GSM network operator 
  delay_160ms();
  // send_string("AT+CPAS\r"); //Mobile equipment activity status 0:ready 3:incoming call 
  // delay_160ms(); //for debug 
  // send_string("AT+WS46=12\r"); //select GSM network 
  // delay_160ms(); //////////for debug 
  if (result == 0 || result == 1)
  {
    put_string(0x80, "success"); /////////for debug 
    delay_1s(); /////////////for debug 
    return 0;
  }
  else
  {
    put_string(0x80, "failed"); /////////for debug 
    return 1;
  }
}

/////在RcvBuf的前80个字符中寻找第一个出现的字符串是"OK"或者"ERROR"还是都没有//// 
//////////////如果是OK就返回0,是ERROR就返回1,没找到就返回2/////////////////// 
char find_OK_ERROR()
{
  char i;
  for (i = 0; i < 140; i++)
  {
    if (RcvBuf[i] == 0)
      return 2;
    if (strncmp(RcvBuf + i, "OK", 2) == 0)
      return 0;
    else if (strncmp(RcvBuf + i, "ERROR", 5) == 0)
      return 1;
  }
  return 3;
}

//////////////function: /////////////////////////////////////////// 
void receive_SMS()
{
  uint ii;
  char cmgl_state = 0;
  uchar j;
  RcvIndex = 0;
  bResponsed = 0;
  memset(RcvBuf, 0, sizeof(RcvBuf)); //接收前清空接收缓冲区 
  send_string("AT+CMGL=4\r");
  wait_5s();
  if (bListEnd)
  //如果有短信存在,则在GSM中断中会将bListEnd置1 
  {
    for (ii = 0; ii < listchar_count; ii++)
    {
      if (cmgl_state == 0)
      {
        if (ListBuf[ii] == 'L')
        {
          cmgl_state = 1;
          list_index_begin = ii;
        }
      }
      else if (cmgl_state == 1)
      {
        if (ListBuf[ii] == LF)
        {
          delay();
          list_index_end = strpos(ListBuf + list_index_begin, ',');
          list_index_end = list_index_begin + list_index_end;
          memcpy(list_indexlist + listcmdindex, ListBuf + list_index_begin + 2,
            list_index_end - list_index_begin - 2);
          listcmdindex += list_index_end - list_index_begin - 1;
          list_indexlist[listcmdindex - 1] = 0;
          listcmd_count++; //短信条数 
          list_PDU_begin = ii + 1; //pdu的起始地址即LF后一字节 
          if (ListBuf[list_index_end + 1] == '0')
          //判断短信是否为已读状态 
            cmgl_state = 2;
          else
            cmgl_state = 0;
        }
      }
      else if (cmgl_state == 2)
      //处理未读的短信 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -