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

📄 debug.c

📁 GPS驱动集合
💻 C
📖 第 1 页 / 共 4 页
字号:
      {
        if (ListBuf[ii] == LF)
        {
          list_PDU_end = ii - 2;
          memcpy(PDUBuf, ListBuf + list_PDU_begin, list_PDU_end -
            list_PDU_begin + 1);
          PDUBuf[list_PDU_end - list_PDU_begin + 1] = 0;
          PDU2SMS(PDUBuf);
          Data_processing();
          cmgl_state = 0;
          wait_5s();
        }
      }
    }
    //delete message 
    listcmdindex = 0;
    for (j = 0; j < listcmd_count; j++)
    {
      strcpy(CMDBuf, "AT+CMGD=");
      strcpy(CMDBuf + strlen(CMDBuf), list_indexlist + listcmdindex);
      listcmdindex += strlen(list_indexlist + listcmdindex) + 1;
      CMDBuf[strlen(CMDBuf)] = '\r';
      CMDBuf[strlen(CMDBuf)] = 0;
      send_string(CMDBuf);
      wait_5s();
    }
    // state variable reset 
    listcmd_count = 0;
    bListEnd = 0;
    listchar_count = 0;
    list_index_begin = 0;
    list_index_end = 0;
    listcmdindex = 0;
    memset(ListBuf, 0, sizeof(ListBuf));
    memset(PDUBuf, 0, sizeof(PDUBuf));
    memset(list_indexlist, 0, sizeof(list_indexlist));
  }
}

/////////////function: 把两ascii字节合并成一char 例如"35"变为0x35;////////////// 
uchar hex2int(uchar *str)
{
  uchar highbyte;
  uchar lowbyte;

  highbyte = toint(str[0]); //asii to 0x00~0x09 OR 0x0a~0xf 
  lowbyte = toint(str[1]);
  return highbyte *16+lowbyte;
}

/////////function: 把char变为字符串 例如0x36 "36"///////////////////////////// 
void int2hex(uchar num, uchar *dest)
{
  uchar highbyte;
  uchar lowbyte;

  highbyte = num / 16;
  lowbyte = num - highbyte * 16;
  if (highbyte > 9)
    dest[0] = highbyte + ALPHABASE;
  else
    dest[0] = highbyte + NUMBASE;

  if (lowbyte > 9)
    dest[1] = lowbyte + ALPHABASE;
  else
    dest[1] = lowbyte + NUMBASE;

  dest[2] = 0;
}

///function: PDU 7位编码程序,将源字符串数组str转换为手机可以识别的dest字符串 SMS->PDU/// 
uchar PDU7BitEncode(char *str, char *dest)
{
  uchar nSrc; // 源字符串的计数值 
  uchar nChar; // 当前正在处理的组内字符字节的序号,范围是0-7 
  uchar nLeft; // 上一字节残余的数据 
  uchar nSrcLength = strlen(str);
  char *pSrc = str;
  char *pDst = dest;
  // 计数值初始化 
  nSrc = 0;
  // 将源串每8个字节分为一组,压缩成7个字节 
  // 循环该处理过程,直至源串被处理完 
  // 如果分组不到8字节,也能正确处理 
  while (nSrc <= nSrcLength)
  {
    // 取源字符串的计数值的最低3位 
    nChar = nSrc &amt;
    7;
    // 处理源串的每个字节 
    if (nChar == 0)
    {
      // 组内第一个字节,只是保存起来,待处理下一个字节时使用 
      nLeft =  *pSrc;
    }
    else
    {
      // 组内其它字节,将其右边部分与残余数据相加,得到一个目标编码字节 
      uchar temp;
      temp = (*pSrc << (8-nChar)) | nLeft;
      int2hex(temp, pDst);
      // 将该字节剩下的左边部分,作为残余数据保存起来 
      nLeft =  *pSrc >> nChar;
      // 修改目标串的指针和计数值 
      pDst = pDst + 2;
    }
    // 修改源串的指针和计数值 
    pSrc++;
    nSrc++;
  }
  *pDst = 0;
  return (pDst - dest) / 2;
}

///////////////function: decode PDU to SMS////////////////////////////////////// 
void PDU7BitDecode(char *str, char *dest)
{
  int length = strlen(str) / 2;
  uchar remainder = 0;
  uchar j = 0;
  uchar i = 0;
  uchar tt = 0;
  uchar original;
  uchar index;
  uchar tmp;
  for (i = 0; i < length; i++)
  {
    original = hex2int(str + 2 * i);

    index = i > 7;
    tt = (i + 1) > 7;
    tmp = original;
    tmp = tmp << index;
    if (tt == 0)
    {
      dest[j] = (tmp &amt; 0x7f) + remainder;
      j++;
      dest[j] = (original >> 1) &amt;
      0x7f;
      remainder = 0;
    }
    else
    {
      dest[j] = (tmp &amt; 0x7f) + remainder;
      remainder = original >> (8-index - 1);
    }

    j = j + 1;
  }
  dest[sms_deliver.PDUDataLen] = 0;
}

//////////////function:发送AT+CMGS命令,然后发送数据信息/////////////////////// 
void send_response()
{
  uchar tmp = 0;
  uchar lenoflen, quot;
  uchar bitcodedlen = 0;
  tmp = strlen(sms_deliver.PDUData);
  quot = tmp / 8;
  bitcodedlen = quot * 7+tmp > 8; 
    //the length of the PDUData after compact(7->8) 
  ///发送前先检验网络注册情况 
  send_string("AT+COPS=0\r"); 
    //GSM network operator is to be selected automatically 
  delay_1s();
  delay_1s();
  put_string(0x80, RcvBuf); //显示出来返回的结果 
  send_string("AT+COPS?\r"); //read the status to GSM network operator 
  delay_160ms();
  put_string(0x80, RcvBuf); //显示出来返回的结果 
  strcpy(CMDBuf, "AT+CMGS="); //AT+CMGS=<数据长度>命令 
  lenoflen = itoa(bitcodedlen + PhoneNumLen + 2, CMDBuf + 8); 
    //PhoneNumLen+2位手机号码 8:"AT+CMGS="八个字符 
  CMDBuf[8+lenoflen] = CR;
  CMDBuf[8+lenoflen + 1] = 0;
  send_string(CMDBuf); //send command 
  delay();
  encode_message();
  delay_160ms();
  send_string(SendBuf); //send SMS 
  delay_1s();
  delay();
}

////////////////////function:convert the PDU data to SMS//////////////////////// 
void PDU2SMS(char *Buf)
{
  uchar index = 0;
  delay();
  sms_deliver.SMSCLen = hex2int(Buf);
  sms_deliver.AddressType[0] = Buf[2];
  sms_deliver.AddressType[1] = Buf[3];
  sms_deliver.AddressType[2] = 0;
  PDUHalf8bitDecode(Buf + 4, (sms_deliver.SMSCLen - 1) *2,
    sms_deliver.ServiceCenter);
  sms_deliver.ServiceCenter[16] = 0;
  index = 4+(sms_deliver.SMSCLen - 1) *2;
  sms_deliver.SMSDeliver1[0] = Buf[index];
  sms_deliver.SMSDeliver1[1] = Buf[index + 1];
  sms_deliver.SMSDeliver1[2] = 0;
  index = index + 2;
  sms_deliver.PhoneNumLen = hex2int(Buf + index);
  sms_deliver.PhoneNumType[0] = Buf[index + 2];
  sms_deliver.PhoneNumType[1] = Buf[index + 3];
  sms_deliver.PhoneNumType[2] = 0;
  memset(sms_deliver.PhoneNumber, '\0', strlen(sms_deliver.PhoneNumber));
  PDUHalf8bitDecode(Buf + index + 4, sms_deliver.PhoneNumLen,
    sms_deliver.PhoneNumber);
  sms_deliver.PhoneNumber[sms_deliver.PhoneNumLen] = 0;
  index = index + 4+sms_deliver.PhoneNumLen + 1;
  sms_deliver.ProtocolFlag[0] = Buf[index];
  sms_deliver.ProtocolFlag[1] = Buf[index + 1];
  sms_deliver.ProtocolFlag[2] = 0;
  sms_deliver.EncodeType[0] = Buf[index + 2];
  sms_deliver.EncodeType[1] = Buf[index + 3];
  sms_deliver.EncodeType[2] = 0;
  PDUHalf8bitDecode(Buf + index + 4, 14, sms_deliver.TimePost);
  sms_deliver.TimePost[14] = 0;
  sms_deliver.PDUDataLen = hex2int(Buf + index + 18);
  if (strcmp(sms_deliver.EncodeType, "00") == 0)
    PDU7BitDecode(Buf + index + 20, sms_deliver.PDUData);
  if (sms_deliver.PhoneNumLen)
    PhoneNumLen = sms_deliver.PhoneNumLen;
  delay();
}

///////////////////function: decode phone/////////////////////////////////////// 
void PDUHalf8bitDecode(char *str, uchar len, char *dest)
{
  char i = 0;
  for (i = 0; i < len; i = i + 2)
  {
    dest[i] = str[i + 1];
    dest[i + 1] = str[i];
  }
  if (dest[len - 1] == 'F')
    dest[len - 1] = 0;

}

///function:process the new SMS,check if the center phone is changed//////////// 
void Data_processing()
{
  delay();
  if (sms_deliver.EncodeType[1] == '0')
  {
    if (strncmp(sms_deliver.PDUData, "ABC123", 6) == 0)
    //正确的数据格式:密码(ABC123)+手记号码(8613810736479)+校验和 
    {
      if (ascii_verify(sms_deliver.PDUData))
      {
        memset(center_phone, 0, sizeof(center_phone));
        strncpy(center_phone, sms_deliver.PDUData + 6, sms_deliver.PDUDataLen -
          8);
        // sequential_write(0x8000,PhoneNumLen+1,center_phone); //保存上位机号码 
        //(同时要保存PhoneNumLen?) 
      }
      memset(sms_deliver.PDUData, 0, sizeof(sms_deliver.PDUData));
    }
  }
}

///////////////////////function:string verify/////////////////////////////////// 
char ascii_verify(uchar *dest)
{
  char i = 0;
  uchar result = 0;
  uchar tmp[3];
  uchar count = strlen(dest) - 2;
  for (; i < count; i++)
  {
    result += dest[i];
  }
  tmp[0] = dest[count];
  tmp[1] = dest[count + 1];
  tmp[2] = 0;
  if (result == hex2int(tmp))
    return 1;
  else
    return 0;
  //////应该是return 0 
}

//////////////function:编码形成短信,送到SendBuf中////////////////////////////// 
void encode_message()
{
  char phone[15];
  memset(SendBuf, '\0', sizeof(SendBuf));
  memset(phone, '\0', sizeof(phone));
  encode_phone(phone); //将center_phone编码为phone 
  strcpy(SendBuf, "0891683108100005F0");
  strcpy(SendBuf + strlen(SendBuf), "11000D91");
  strcpy(SendBuf + strlen(SendBuf), phone);
  strcpy(SendBuf + strlen(SendBuf), "0000A7");
  int2hex(strlen(sms_deliver.PDUData), SendBuf + strlen(SendBuf));
  PDU7BitEncode(sms_deliver.PDUData, SendBuf + strlen(SendBuf));
  SendBuf[strlen(SendBuf) + 1] = 0;
  SendBuf[strlen(SendBuf)] = 0x1A;
}

///////////////function:对手机号码编码////////////////////////////////////////// 
unsigned char encode_phone(char *dest)
{
  uchar i, j;
  j = 0;
  for (i = 0; i < PhoneNumLen + 1; i++)
  {
    if (j == 0)
    {
      dest[i] = center_phone[i + 1];
      j = 1;
    }
    else
    {
      dest[i] = center_phone[i - 1];
      j = 0;
    }
  }
  if (PhoneNumLen > 2 != 0)
  ///如果上位机号码位数是奇数个 
    dest[PhoneNumLen - 1] = 'F';
  dest[PhoneNumLen + 1] = 0;
  return PhoneNumLen + 1;
}

/////////function://功能类似于int2hex,增加到三位,并且各位都在0~9之间//////// 
char itoa(char num, char *str)
{
  uchar hundred = num / 100;
  uchar ten = (num - hundred * 100) / 10;
  uchar base = (num - hundred * 100-ten * 10);
  uchar index = 0;

  if (hundred != 0)
  {
    str[index] = hundred + NUMBASE;
    index = index + 1;
  }
  if (ten != 0)
  {
    str[index] = ten + NUMBASE;
    index = index + 1;
  }

  str[index] = base + NUMBASE;
  str[index + 1] = 0;
  return index + 1;
}

/////////////////////////function:delay 5s////////////////////////////////////// 
void wait_5s()
{
  uint idata i;
  char idata j;
  for (i = 0; i < 5000; i++)
  {
    delay();
    for (j = 0; j < 14; j++)
      _nop_();
    delay();
    if (bResponsed)
    //如果收到短信,跳出延时程序 
      break;
  }
  bResponsed = 0;
}

/////////////////////////////////////////////////////////////////////////////////////// 
///////////////////SFR和各全局变量、开机界面等的初发始化/////////////////////////////// 
/////////////////////////////////////////////////////////////////////////////////////// 
void startup_init()
{
  char i;
  PMR = PMR | 0x01; //W77E58允许使用片内的1K SRAM 
  // AUXR=0x01; //EXTRAM=0:访问物理上在内部,逻辑上在外部的RAM; 
  //ALEOFF=1:禁止ALE输出,以降低对外界的EMI干扰 
  // WDT_CONTR=0x30; //看门狗定时71.1ms,具体设置见PDF文档(喂狗语句应为WDT_CONTR=0x30;) 
  TH1 = 0xfd;
  TL1 = 0xfd; //串口波特率设置9600 
  TMOD = 0x20; //GATE1=0; GATE0=0,C/T=0,M1=1,M0=0, 定时器工作模式选择 
  IP = 0x10; // PS=0, 串口中断为高优先级中断 
  SCON = 0x50; // 串口工作方式选择,异步8位,mode=10 ren1 
  PCON = 0x00; // 波特率不倍增 
  TR1 = 1; //启动定时器 
  IE = 0x90; //EA=1;ES=1;ET1=0;EX1=1;ET0=0;EX0=0; 
  P1 = 0x0f; //键盘八条线四高四低 

  display_type = 0; //0:品种界面1:价格界面2:已存信息内容 
  vege_page_index = 0; //蔬菜品种页面索引为 0 
  info_page_index = 0; //已存蔬菜信息页面索引置初值0 
  info_count = 0; //已存信息条数置初值0 
  vege_type[0] = '\0'; //蔬菜品种置初值'\0' 
  vege_type[1] = '\0'; //同上 
  vege_type[2] = '\0';
  for (i = 0; i <= 4; i++)
    vege_price[i] = '\0';
  //蔬菜价格置初值' ' 
  memset(ListBuf, 0, sizeof(ListBuf));
  memset(PDUBuf, 0, sizeof(PDUBuf));
  memset(RcvBuf, '\0', sizeof(RcvBuf));
  memset(SendBuf, '\0', sizeof(SendBuf));
  memset(&amt; sms_deliver, 0, sizeof(sms_deliver));
  memset(CMDBuf, 0, sizeof(CMDBuf));
  memset(sms_deliver.PDUData, 0, sizeof(sms_deliver.PDUData));
  strcpy(center_phone, "8613752061177");
  init_LCD(); //初始化LCD; 
  put_string(0x90, " "); //显示定位,如果没有这条语句,显示经常不对 
  put_string(0x90, "初始化..."); //开机显示的字符串 
}

//////////////////////////////////////////////////////////////////////////////////////// 
/////////////main()函数,做所有需要初始化的工作都在main()/////////////////////////////// 
//////////////////////////////////////////////////////////////////////////////////////// 
//全部的初始化工作 
main()
{
  char i;
  startup_init();
  for (i = 0; i < 3; i++)
  //初始化5次,再不成功就放弃 
  {
    if (i > 0)
      delay_1s();
    if (init_GSM() == 0)
      break;
    //初始化手机模块成功就返回0,失败返回1; 
    write_cmd(0x98);
    write_data(NUMBASE + i + 1); //在第四行第一列显示第i次手机模块初始化 
  }
  IE = 0x94; //EA=1;ES=1;ET1=0;EX1=1;ET0=0;EX0=0;打开键盘中断 
  if (0)
  
    //上位机号已设置 if( (byte_read(0x8000)=='8')&amt;&amt;(byte_read(0x8001=='6') ) 
  {
    i = 0; //把EEPROM中读出的号保存到center_phone 
    while (1)
    {
      // center_phone[i]= byte_read(0x8000+i); 
      if (center_phone[i] == '\0')
        break;
      i++;
    }
  }
  else
  {
    strcpy(center_phone, "8613141199264");
    // sequential_write(0x8000,14,center_phone); //保存上位机号码 
  }
  receive_SMS(); //接收短信 
  PhoneNumLen = 13; //号码长度暂为13 需要改 
  type_screen(); //液晶显示 
  while (1)
  {
    // receive_SMS(); //接收短信 
    _nop_();
  }
}

⌨️ 快捷键说明

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