📄 sms.lst
字号:
435 1 if(*(pDst-1) == 'F')
436 1 {
437 2 pDst--;
438 2 nDstLength--; // 目标字符串长度减1
439 2 }
440 1 // 输出字符串加个结束符
441 1 *pDst = '\0';
442 1 // 返回目标字符串长度
443 1 return nDstLength;
444 1 }
445
446
447
448
449
450 //以下是PDU全串的编解码模块。为简化编程,有些字段用了固定值。
451
452 // PDU编码,用于编制、发送短消息
453 // pSrc: 源PDU参数指针
454 // pDst: 目标PDU串指针
455 // 返回: 目标PDU串长度
456
457 int gsmEncodePdu(const SM_PARAM* pSrc, char xdata* pDst)
458 {
459 1 int xdata nLength; // 内部用的串长度
460 1 int xdata nDstLength; // 目标PDU串长度
C51 COMPILER V7.50 SMS 01/26/2007 17:53:09 PAGE 9
461 1 unsigned char xdata buf[256]; // 内部用的缓冲区
462 1
463 1
464 1 // SMSC地址信息段
465 1 nLength = strlen(pSrc->SCA); // SMSC地址字符串的长度
466 1 buf[0] = (char)((nLength & 1) == 0 ? nLength : nLength + 1) / 2 + 1; // SMSC地址信息长度
467 1 buf[1] = 0x91; // 固定: 用国际格式号码
468 1 nDstLength = gsmBytes2String(buf, pDst, 2); // 转换2个字节到目标PDU串
469 1 nDstLength += gsmInvertNumbers(pSrc->SCA, &pDst[nDstLength], nLength); // 转换SMSC到目标PDU串
-
470 1
471 1 // TPDU段基本参数、目标地址等
472 1 nLength = strlen(pSrc->TPA); // TP-DA地址字符串的长度
473 1 buf[0] = 0x11; // 是发送短信(TP-MTI=01),TP-VP用相对格式(TP-VPF=10)
474 1 buf[1] = 0; // TP-MR=0
475 1 buf[2] = (char)nLength; // 目标地址数字个数(TP-DA地址字符串真实长度)
476 1 buf[3] = 0x91; // 固定: 用国际格式号码
477 1 nDstLength += gsmBytes2String(buf, &pDst[nDstLength], 4); // 转换4个字节到目标PDU串
478 1 nDstLength += gsmInvertNumbers(pSrc->TPA, &pDst[nDstLength], nLength); // 转换TP-DA到目标PDU串
479 1
480 1 // TPDU段协议标识、编码方式、用户信息等
481 1 nLength = strlen(pSrc->TP_UD); // 用户信息字符串的长度
482 1 buf[0] = pSrc->TP_PID; // 协议标识(TP-PID)
483 1 buf[1] = pSrc->TP_DCS; // 用户信息编码方式(TP-DCS)
484 1 buf[2] = 0; // 有效期(TP-VP)为5分钟
485 1 if(pSrc->TP_DCS == GSM_7BIT)
486 1 {
487 2 // 7-bit编码方式
488 2 buf[3] = nLength; // 编码前长度
489 2 nLength = gsmEncode7bit(pSrc->TP_UD, &buf[4], nLength+1) + 4; // 转换TP-DA到目标PDU串
490 2 }
491 1 else
492 1 if(pSrc->TP_DCS == GSM_UCS2)
493 1 {
494 2 #if 0
// UCS2编码方式
buf[3] = gsmEncodeUcs2(pSrc->TP_UD, &buf[4], nLength); // 转换TP-DA到目标PDU串
nLength = buf[3] + 4; // nLength等于该段数据长度
#endif
499 2 }
500 1 else
501 1 {
502 2 // 8-bit编码方式
503 2 buf[3] = gsmEncode8bit(pSrc->TP_UD, &buf[4], nLength);
504 2 // 转换TP-DA到目标PDU串
505 2 nLength = buf[3] + 4;
506 2 // nLength等于该段数据长度
507 2 }
508 1 nDstLength += gsmBytes2String(buf, &pDst[nDstLength], nLength); // 转换该段数据到目标PDU串
509 1
510 1 // 返回目标字符串长度
511 1 return nDstLength;
512 1 }
513
514
515
516 // PDU解码,用于接收、阅读短消息
517 // pSrc: 源PDU串指针
518 // pDst: 目标PDU参数指针
519 // 返回: 用户信息串长度
520 int gsmDecodePdu(char xdata* pSrc, SM_PARAM* pDst)
521 {
C51 COMPILER V7.50 SMS 01/26/2007 17:53:09 PAGE 10
522 1 int xdata nDstLength; // 目标PDU串长度
523 1 unsigned char xdata tmp; // 内部用的临时字节变量
524 1 unsigned char xdata buf[256]; // 内部用的缓冲区
525 1
526 1 // SMSC地址信息段
527 1 gsmString2Bytes(pSrc, &tmp, 2); // 取长度
528 1 tmp = (tmp - 1) * 2; // SMSC号码串长度
529 1 pSrc += 4; //指针后移
530 1
531 1 gsmSerializeNumbers(pSrc, pDst->SCA, tmp);
532 1 // 转换SMSC号码到目标PDU串
533 1 pSrc += tmp;
534 1 // 指针后移
535 1 // TPDU段基本参数、回复地址等
536 1 gsmString2Bytes(pSrc, &tmp, 2);
537 1 // 取基本参数
538 1 pSrc += 2;
539 1 // 指针后移
540 1
541 1
542 1 if(tmp & 0x80)
543 1 {
544 2 // 包含回复地址,取回复地址信息
545 2 gsmString2Bytes(pSrc, &tmp, 2);
546 2 // 取长度
547 2 if(tmp & 1) tmp += 1;
548 2 // 调整奇偶性
549 2 pSrc += 4;
550 2 // 指针后移
551 2 gsmSerializeNumbers(pSrc, pDst->TPA, tmp);
552 2 // 取TP-RA号码
553 2 pSrc += tmp;
554 2 // 指针后移
555 2 }
556 1
557 1
558 1 // TPDU段协议标识、编码方式、用户信息等
559 1 gsmString2Bytes(pSrc, (unsigned char*)&pDst->TP_PID, 2);
560 1 // 取协议标识(TP-PID) pSrc += 2;
561 1 // 指针后移
562 1 gsmString2Bytes(pSrc, (unsigned char*)&pDst->TP_DCS, 2);
563 1 // 取编码方式(TP-DCS)
564 1 pSrc += 2; // 指针后移
565 1 gsmSerializeNumbers(pSrc, pDst->TP_SCTS, 14);
566 1 // 服务时间戳字符串(TP_SCTS)
567 1 pSrc += 14; // 指针后移
568 1 gsmString2Bytes(pSrc, &tmp, 2); // 用户信息长度(TP-UDL)
569 1 pSrc += 2; // 指针后移
570 1
571 1
572 1 if(pDst->TP_DCS == GSM_7BIT)
573 1 {
574 2 // 7-bit解码
575 2 nDstLength = gsmString2Bytes(pSrc, buf, tmp & 7 ? (int)tmp * 7 / 4 + 2 : (int)tmp * 7 / 4);
576 2 // 格式转换
577 2 gsmDecode7bit(buf, pDst->TP_UD, nDstLength);
578 2
579 2 // 转换到TP-DU
580 2 nDstLength = tmp;
581 2 }
582 1 else if(pDst->TP_DCS == GSM_UCS2)
583 1 {
C51 COMPILER V7.50 SMS 01/26/2007 17:53:09 PAGE 11
584 2 #if 0
// UCS2解码
nDstLength = gsmString2Bytes(pSrc, buf, tmp * 2); // 格式转换
nDstLength = gsmDecodeUcs2(buf, pDst->TP_UD, nDstLength); // 转换到TP-DU
#endif
589 2 }
590 1 else
591 1 {
592 2 // 8-bit解码
593 2 nDstLength = gsmString2Bytes(pSrc, buf, tmp * 2); // 格式转换
594 2 nDstLength = gsmDecode8bit(buf, pDst->TP_UD, nDstLength); // 转换到TP-DU
595 2 }
596 1
597 1 //返回目标字符串长度
598 1 return nDstLength;
599 1 }
600
601
602 // SM station
603 // MS Me
604 /*********************************************************************************************************
-********
605 1.设置短消息中心号码: AT+CSCA="+8613010761500" <CR>. (地区不同,设置不同)
606 2.设置短消息格式: AT+CMGF=0<CR> (0==PDU mode)
607 3.设置短消息存放的位置: AT+CPMS="SM"<CR> (SM表示将短消息存放在SIM卡中)
608 4.设置短消息到达通知: AT+CNMI=1,1,0,0,1<CR> (此命令可以使GSM模块在短消息到达后向MCU发送指
-令:AT+CMTI:"SM",INDEX<CR>)
609
610 **********************************************************************************************************
-*******/
611
612 void gsmInitMessage(void)
613 {
614 1 int xdata nLength; // 串口收到的数据长度
615 1 char xdata cmd[16]; // 命令串
616 1 char xdata ans[128]; // 应答串
617 1
618 1 //0。读短消息中心号码:
619 1 sprintf(cmd, "AT+CSCA?\r\n"); // 生成命令
620 1 WriteComm(cmd, strlen(cmd)); // 先输出命令串
621 1 nLength = ReadComm(ans, 128); // 读应答数据
622 1
623 1
624 1 //1.设置短消息中心号码: AT+CSCA="+8613010761500" <CR>. (地区不同,设置不同)
625 1 sprintf(cmd, "AT+CSCA=\"+861380075500\",145\r\n"); // 生成命令
626 1 WriteComm(cmd, strlen(cmd)); // 先输出命令串
627 1
628 1
629 1 //2.设置短消息格式: AT+CMGF=0<CR> (0==PDU mode)
630 1 sprintf(cmd, "AT+CMGF=0\r\n"); // 生成命令 (0==PDU mode)
631 1 //sprintf(cmd, "AT+CMGF=1\r\n"); // 生成命令 (1==TEXE mode)
632 1 WriteComm(cmd, strlen(cmd)); // 先输出命令串
633 1 //查询: AT+CMGF? (answer: +CMGF=0/1 OK)
634 1
635 1
636 1
637 1 //3.设置短消息存放的位置: AT+CPMS="SM"<CR> (SM表示将短消息存放在SIM卡中)
638 1 sprintf(cmd, "AT+CPMS=\"SM\"\r\n"); // 生成命令
639 1 WriteComm(cmd, strlen(cmd)); // 先输出命令串
640 1
641 1
642 1 //4.设置短消息到达通知: AT+CNMI=1,1,0,0,1<CR> (此命令可以使GSM模块在短消息到达后向MCU
C51 COMPILER V7.50 SMS 01/26/2007 17:53:09 PAGE 12
-发送指令:AT+CMTI:"SM",INDEX<CR>)
643 1 sprintf(cmd, "AT+CNMI=1,1,0,0,1\r\n"); // 生成命令
644 1 WriteComm(cmd, strlen(cmd)); // 先输出命令串
645 1
646 1 //5.设置短消息有效期:24H?
647 1
648 1
649 1
650 1 }
651
652
653 /*************************************************************************************************
654 依照GSM 07.05,发送短消息用AT+CMGS命令,阅读短消息用AT+CMGR命令,列出短消息用AT+CMGL命令,删除短消息用
655 AT+CMGD命令。但AT+CMGL命令能够读出所有的短消息,所以我们用它实现阅读短消息功能,而没用AT+CMGR。下面是
656 发送、读取和删除短消息的实现代码:
657 **************************************************************************************************/
658
659 // 发送短消息
660 // pSrc: 源PDU参数指针
661 BOOL gsmSendMessage(const SM_PARAM* pSrc)
662 {
663 1 int xdata nPduLength; // PDU串长度
664 1 unsigned char xdata nSmscLength; // SMSC串长度
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -