📄 sms.lst
字号:
462 2 // 内容合法
463 2 // 处理消息内容中的操作指令
464 2 // AA 修改密码
465 2 // AB 修改短消息中新号码
466 2 process_cmd();
467 2 delay(2);
468 2
469 2 // 合法后,给发送方返回一条短消息
470 2 type = 4;
471 2 buffzero(buff, 0, BUFF_SIZE);
472 2 idx2 = 0;
473 2
474 2 // 在BUFF中放置发送返回消息的AT指令的头
475 2 // 要从INBUF中解析发送方的手机号码
476 2 buff[idx2++]='A';
477 2 buff[idx2++]='T';
478 2 buff[idx2++]='+';
479 2 buff[idx2++]='C';
480 2 buff[idx2++]='M';
481 2 buff[idx2++]='G';
482 2 buff[idx2++]='S';
483 2 buff[idx2++]='=';
484 2 buff[idx2++]='\"';
485 2 buff[idx2++]=/*'1'; /*/ inbuf[3];
486 2 buff[idx2++]=/*'3'; /*/ inbuf[4];
487 2 buff[idx2++]=/*'5'; /*/ inbuf[5];
488 2 buff[idx2++]=/*'2'; /*/ inbuf[6];
489 2 buff[idx2++]=/*'2'; /*/ inbuf[7];
C51 COMPILER V7.07 SMS 03/17/2004 17:22:20 PAGE 9
490 2 buff[idx2++]=/*'0'; /*/ inbuf[8];
491 2 buff[idx2++]=/*'3'; /*/ inbuf[9];
492 2 buff[idx2++]=/*'5'; /*/ inbuf[10];
493 2 buff[idx2++]=/*'5'; /*/ inbuf[11];
494 2 buff[idx2++]=/*'9'; /*/ inbuf[12];
495 2 buff[idx2++]=/*'3'; /*/ inbuf[13];
496 2 buff[idx2++]='\"';
497 2 buff[idx2++]=0x0d;
498 2
499 2 }
500 1 // 手机号码无+86的情况下,INBUF第11为开始为消息内容
501 1 else if(buff[0] == inbuf[11] // 无+86
502 1 && buff[1] == inbuf[12]
503 1 && buff[2] == inbuf[13]
504 1 && buff[3] == inbuf[14]
505 1 && buff[4] == inbuf[15]
506 1 && buff[5] == inbuf[16]
507 1 )
508 1 {
509 2 // 内容合法
510 2 // 处理消息内容中的操作指令
511 2 // AA 修改密码
512 2 // AB 修改短消息中新号码
513 2 process_cmd();
514 2 delay(2);
515 2
516 2 // 合法后,给发送方返回一条短消息
517 2 type = 4;
518 2 buffzero(buff, 0, BUFF_SIZE);
519 2 idx2 = 0;
520 2
521 2 // 在BUFF中放置发送返回消息的AT指令的头
522 2 // 要从INBUF中解析发送方的手机号码
523 2 buff[idx2++]='A';
524 2 buff[idx2++]='T';
525 2 buff[idx2++]='+';
526 2 buff[idx2++]='C';
527 2 buff[idx2++]='M';
528 2 buff[idx2++]='G';
529 2 buff[idx2++]='S';
530 2 buff[idx2++]='=';
531 2 buff[idx2++]='\"';
532 2 buff[idx2++]=/*'1'; /*/ inbuf[0];
533 2 buff[idx2++]=/*'3'; /*/ inbuf[1];
534 2 buff[idx2++]=/*'5'; /*/ inbuf[2];
535 2 buff[idx2++]=/*'2'; /*/ inbuf[3];
536 2 buff[idx2++]=/*'2'; /*/ inbuf[4];
537 2 buff[idx2++]=/*'0'; /*/ inbuf[5];
538 2 buff[idx2++]=/*'3'; /*/ inbuf[6];
539 2 buff[idx2++]=/*'5'; /*/ inbuf[7];
540 2 buff[idx2++]=/*'5'; /*/ inbuf[8];
541 2 buff[idx2++]=/*'9'; /*/ inbuf[9];
542 2 buff[idx2++]=/*'3'; /*/ inbuf[10];
543 2 buff[idx2++]='\"';
544 2 buff[idx2++]=0x0d;
545 2 }
546 1 else
547 1 {
548 2 buffzero(inbuf, 0, INBUFF_SIZE);
549 2 idx = 0;
550 2 }
551 1
C51 COMPILER V7.07 SMS 03/17/2004 17:22:20 PAGE 10
552 1 }
553
554
555 // 处理新接收到的短消息
556 // 步骤:1> 从新到消息标记 +CMTI: "SM",1 中获取新消息的SIM卡中的位置
557 // 2> 从SIM卡中读取新消息的内容
558 // 3> 从SIM卡中删除已读的短消息
559 // 4> 判断消息内容是否合法(密码是否正确)
560 void process_recv_msg()
561 {
562 1 unsigned char k = 0, i = 0;
563 1
564 1 for(k=0;k<idx;k++)
565 1 {
566 2 // 确认新到消息标记 "SM",1
567 2 // 并从中得到新到消息在SIM卡中的位置
568 2 if( inbuf[k++] == ' '
569 2 && inbuf[k++] == '\"'
570 2 && inbuf[k++] == 'S'
571 2 && inbuf[k++] == 'M'
572 2 && inbuf[k++] == '\"'
573 2 && inbuf[k++] == ',') // recved one new msg
574 2 {
575 3 // DATA2变化:从新消息到来的标志(放在inbuf中)判断到了"SM"字符,
576 3 // 从而可以解析后跟的新消息在SIM卡中的存放位置
577 3 date2 ++;
578 3
579 3 i = inbuf[k++]; // 新消息在SIM卡中的存放位置
580 3 read_msg(i); // 从SIM卡中读取新到短消息
581 3 delete_msg(i); // 读取新消息内容后,将其从SIM卡中删除
582 3 is_legal_msg(); // 判断新消息内容是否合法
583 3 // 合法后,消息操作类型type=4,可在主循环中作其他操作
584 3
585 3 break;
586 3 }
587 2 }
588 1 }
589
590 // 主函数
591 void main(void)
592 {
593 1 unsigned char data k;
594 1 unsigned char start = 0;
595 1
596 1 delay(1);
597 1
598 1
599 1 ///////////////////////////////////////////////////////
600 1 // 初始化串口
601 1 setup_t1();
602 1 setup_ck();
603 1 TR1=1;
604 1 EA=1;
605 1 ES=1;
606 1
607 1 // 设置文本收发模式前,给设备充分的启动时间
608 1 delay(3);
609 1
610 1 // 设置为文本格式发送/接收短消息
611 1 setcmgftxt();
612 1
613 1 // delay
C51 COMPILER V7.07 SMS 03/17/2004 17:22:20 PAGE 11
614 1 delay(3);
615 1
616 1 // 命令处理死循环
617 1 while(1)
618 1 {
619 2 show(); // 在每次循环中刷新数码管显示,反映data1,data2,data3,data4的变化
620 2
621 2 // delay
622 2 delay(3);
623 2
624 2 if(1 == send) // send=1 有新的短消息到达
625 2 {
626 3 delay(2); // 延迟,保证接收中断已经读完所有的新到消息标志
627 3 process_recv_msg(); // 处理新到消息
628 3 delay(2);
629 3
630 3 // idx>0 如果消息内容不为空
631 3 // 4==type 且消息内容是合法的
632 3 // 则向发送消息的手机返回一个消息
633 3 if(idx > 0 && 4 == type) // send msg
634 3 {
635 4 date3 ++; // DATA3变化:收到的新消息是合法消息
636 4
637 4 k = 0;
638 4 // 首先向串口输出发送短消息AT指令的头,如:AT+CMGS="13522035593"<CR>
639 4 while(1)
640 4 {
641 5 if(k>BUFF_SIZE || buff[k] == 0)
642 5 break;
643 5 SBUF = buff[k++]; delay(1);
644 5 }
645 4
646 4 // 返回的消息内容忽略掉对方的手机号码
647 4 if(1 == hasplus86)
648 4 start = 20;
649 4 else
650 4 start = 17;
651 4
652 4 // 向串口输出发送短消息的内容
653 4 for(k=start;k<idx;k++)
654 4 {
655 5 if(k<INBUFF_SIZE && inbuf[k] != 0)
656 5 // && ((inbuf[k]>='a' && inbuf[k]<='z') ||(inbuf[k]>='A' && inbuf[k]<='Z')||(inbu
-f[k]>='0' && inbuf[k]<='9')))
657 5 {
658 6 SBUF = inbuf[k]; delay(1);
659 6 }
660 5 else
661 5 break;
662 5 }
663 4
664 4 // 发送短消息AT指令的结束符号 Ctrl+Z
665 4 SBUF = 0x1a;
666 4 }
667 3
668 3 type = 0; // 消息操作类型改为空操作
669 3 send = 0; // 将新到消息标志=0,准备接收下一条消息
670 3 }
671 2
672 2 delay(3);
673 2
674 2 }
C51 COMPILER V7.07 SMS 03/17/2004 17:22:20 PAGE 12
675 1 }
676
677
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 2168 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 91 17
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -