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

📄 m32.lst

📁 这是用W77E58编写的控制GSM模块
💻 LST
📖 第 1 页 / 共 5 页
字号:
 771   4      
 772   4      
 773   4                          }//if((ptr=strstr(task,"A")) != NULL)
 774   3                }//if(gsmSearchPhone("M"))
 775   2                else
 776   2                        {
 777   3      
 778   3                        sprintf(TP_UD,"You are not master!");   
 779   3                            return 0; 
 780   3      
 781   3      
 782   3                        }
 783   2      
 784   2      
 785   2              }//if(task[0] == 'A')
 786   1              
C51 COMPILER V7.50   M32                                                                   04/04/2007 15:01:44 PAGE 14  

 787   1              if(task[0] == 'B')                 //设置第二个受权号码
 788   1              {
 789   2                //if(gsmPhoneBookTask(GSM_SEARCH_PHONE,NULL,"A",0))
 790   2                        if(gsmSearchPhone("A"))          //是否有第一个受权号码?
 791   2                {
 792   3                          if((ptr=strstr(task,"B")) != NULL)
 793   3                          {   
 794   4                      //增加授权:
 795   4                   
 796   4                      ptr++;
 797   4                              putstring1("Phone Number to Save:\r\n");
 798   4                      putstring1(ptr);
 799   4                                  putstring1("\r\n");
 800   4                              PhoneNumber=3;
 801   4                                      //if(gsmPhoneBookTask(GSM_SAVE_PHONE,ptr,"M",PhoneNumber))
 802   4                          if(gsmSavePhone(ptr,"B")==TRUE)  //第2个授权,起名为:B
 803   4                              {
 804   5                             
 805   5                                        putstring1("Save Phone Ok,Number is:\r\n");
 806   5                                    sprintf(TPA,"++");
 807   5                                        strcat(TPA, ptr);
 808   5                                        putstring1(TPA);
 809   5                                    putstring1("\r\n");
 810   5                                    
 811   5                                        sprintf(TP_UD,"OK");
 812   5      
 813   5                                        return 1;                //gsmSendMessage("OK"); 
 814   5                                            
 815   5                                  }
 816   4                                  else
 817   4                      {      
 818   5                                        putstring1("Save Phone Fail!");
 819   5                                    sprintf(TP_UD,"Fail");   //gsmSendMessage("Fail"); 
 820   5                            return 0; 
 821   5                                        
 822   5                              }
 823   4      
 824   4      
 825   4      
 826   4                          }//if((ptr=strstr(task,"B")) != NULL)
 827   3                }//if(gsmSearchPhone("A"))
 828   2              }//if(task[0] == 'B')
 829   1      
 830   1      
 831   1              return 0;
 832   1      }
 833          
 834          
 835          // PDU编码,用于编制、发送短消息 
 836          // pSrc: 源PDU参数指针 
 837          // pDst: 目标PDU串指针 
 838          // 返回: 目标PDU串长度 
 839          int gsmEncodePdu(char xdata* pDst)   //pDst=pdu;
 840          {     
 841   1          int nLength;             // 内部用的串长度     
 842   1          int nDstLength;          // 目标PDU串长度     
 843   1         
 844   1              // SMSC地址信息段     
 845   1          nLength = strlen(SCA);       // SMSC地址字符串的长度         
 846   1      
 847   1              if((nLength & 0x01)==0)
 848   1              nDstLength= nLength/2+1;
C51 COMPILER V7.50   M32                                                                   04/04/2007 15:01:44 PAGE 15  

 849   1          else
 850   1              nDstLength= (nLength+1)/2 + 1;
 851   1      
 852   1              ans[0] = (char)nDstLength;  // SMSC地址信息长度  
 853   1              ans[1] = 0x91;        // 固定: 用国际格式号码     
 854   1          nDstLength = gsmBytes2String(ans, pDst, 2);           // 转换2个字节到目标PDU串     
 855   1      
 856   1          nDstLength += gsmInvertNumbers(SCA, &pDst[nDstLength], nLength);    // 转换SMSC到目标PDU串   
 857   1              // TPDU段基本参数、目标地址等     
 858   1              nLength = strlen(TPA);         // TP-DA地址字符串的长度     
 859   1              ans[0] = 0x11;                 // 是发送短信(TP-MTI=01),TP-VP用相对格式(TP-VPF=10)     
 860   1              ans[1] = 0;                    // TP-MR=0     
 861   1              ans[2] = (char)nLength;        // 目标地址数字个数(TP-DA地址字符串真实长度)     
 862   1              ans[3] = 0x91;                 // 固定: 用国际格式号码     
 863   1              nDstLength += gsmBytes2String(ans, &pDst[nDstLength], 4);  // 转换4个字节到目标PDU串     
 864   1              nDstLength += gsmInvertNumbers(TPA, &pDst[nDstLength], nLength); // 转换TP-DA到目标PDU串          
 865   1      
 866   1              // TPDU段协议标识、编码方式、用户信息等     
 867   1              nLength = strlen(TP_UD);       // 用户信息字符串的长度     
 868   1              ans[0] = TP_PID;               // 协议标识(TP-PID)     
 869   1              ans[1] = TP_DCS;               // 用户信息编码方式(TP-DCS)     
 870   1              ans[2] = 0;                    // 有效期(TP-VP)为5分钟  
 871   1      
 872   1              
 873   1              if(TP_DCS == GSM_7BIT)         
 874   1              {         
 875   2                      // 7-bit编码方式         
 876   2                      ans[3] = nLength;                                                // 编码前长度         
 877   2                      nLength = gsmEncode7bit(TP_UD, &ans[4], nLength+1) + 4;    // 转换TP-DA到目标PDU串     
 878   2              }     
 879   1              else 
 880   1              if(TP_DCS == GSM_UCS2)     
 881   1              {         
 882   2                 #if 0
                         // UCS2编码方式         
                              ans[3] = gsmEncodeUcs2(pSrc->TP_UD, &ans[4], nLength);    // 转换TP-DA到目标PDU串         
                              nLength = ans[3] + 4;        // nLength等于该段数据长度     
                         #endif
 887   2              }     
 888   1              else     
 889   1              {         
 890   2                      // 8-bit编码方式         
 891   2                      //ans[3] = gsmEncode8bit(TP_UD, &ans[4], nLength);      // 转换TP-DA到目标PDU串         
 892   2                      nLength = ans[3] + 4;                                       // nLength等于该段数据长度     
 893   2              }     
 894   1      
 895   1              nDstLength += gsmBytes2String(ans, &pDst[nDstLength], nLength); // 转换该段数据到目标PDU串          
 896   1              // 返回目标字符串长度     
 897   1              return nDstLength; 
 898   1      
 899   1      }      
 900          
 901          
 902          
 903          
 904          /*****************************************************************************************************
 905          *             int gsmDecode7bit(const unsigned char* pSrc, char* pDst, int nSrcLength) 
 906          *
 907          * 7-bit解码 
 908          * pSrc: 源编码串指针 
 909          * pDst: 目标字符串指针 
 910          * nSrcLength: 源编码串长度 
C51 COMPILER V7.50   M32                                                                   04/04/2007 15:01:44 PAGE 16  

 911          * 返回: 目标字符串长度 
 912          *******************************************************************************************************/
 913          //int gsmDecode7bit(const unsigned char* pSrc, char* pDst, int nSrcLength) 
 914          int gsmDecode7bit(uchar* pSrc, char * pDst, int nSrcLength) 
 915          { 
 916   1           int nSrc;               // 源字符串的计数值     
 917   1           int nDst;               // 目标解码串的计数值     
 918   1           int nByte;              // 当前正在处理的组内字节的序号,范围是0-6     
 919   1           unsigned char nLeft;    // 上一字节残余的数据        
 920   1           
 921   1           // 计数值初始化     
 922   1           nSrc = 0;     
 923   1               nDst = 0;    
 924   1           // 组内字节序号和残余数据初始化     
 925   1           nByte = 0;     
 926   1               nLeft = 0;    
 927   1           // 将源数据每7个字节分为一组,解压缩成8个字节     
 928   1           // 循环该处理过程,直至源数据被处理完     
 929   1           // 如果分组不到7字节,也能正确处理     
 930   1           while(nSrc<nSrcLength)     
 931   1           {         
 932   2             // 将源字节右边部分与残余数据相加,去掉最高位,得到一个目标解码字节    
 933   2             *pDst = ((*pSrc << nByte) | nLeft) & 0x7f;         
 934   2             // 将该字节剩下的左边部分,作为残余数据保存起来         
 935   2              nLeft = *pSrc >> (7-nByte); 
 936   2             // 修改目标串的指针和计数值         
 937   2              pDst++;         
 938   2                      nDst++;   
 939   2             // 修改字节计数值         
 940   2              nByte++;              
 941   2             // 到了一组的最后一个字节         
 942   2             if(nByte == 7)         
 943   2             {             
 944   3                // 额外得到一个目标解码字节             
 945   3                *pDst = nLeft; 
 946   3                // 修改目标串的指针和计数值             
 947   3                pDst++;             
 948   3                        nDst++; 
 949   3                // 组内字节序号和残余数据初始化             
 950   3                nByte = 0;             
 951   3                nLeft = 0;         
 952   3             }              
 953   2             // 修改源串的指针和计数值         
 954   2             pSrc++;         
 955   2             nSrc++;     
 956   2           }          
 957   1           *pDst = 0;          
 958   1           // 返回目标串长度     
 959   1           return nDst; 
 960   1      } 
 961          
 962          
 963          
 964          
 965           // PDU解码,用于接收、阅读短消息 
 966           // pSrc: 源PDU串指针 
 967           // pDst: 目标PDU参数指针 
 968           // 返回: 用户信息串长度 
 969           int gsmDecodePdu(char * pSrc) 
 970           {     
 971   1              int nDstLength;           // 目标PDU串长度     
 972   1              unsigned char tmp;        // 内部用的临时字节变量     
C51 COMPILER V7.50   M32                                                                   04/04/2007 15:01:44 PAGE 17  

 973   1      
 974   1              // SMSC地址信息段     
 975   1              gsmString2Bytes(pSrc, &tmp, 2);    // 取长度     
 976   1              tmp = (tmp - 1) * 2;               // SMSC号码串长度     
 977   1              pSrc += 4;                         //指针后移     
 978   1              gsmSerializeNumbers(pSrc, SCA, tmp);    
 979   1      
 980   1      #if 0   
                      putstring1("SCA=\r\n");
                      putstring1(SCA);
                      putstring1("\r\n");
              #endif  
 985   1      
 986   1      
 987   1              // 转换SMSC号码到目标PDU串     
 988   1              pSrc += tmp;        
 989   1      #if 0   
                      putstring1("pSrc=\r\n");
                      putstring1(pSrc);
                      putstring1("\r\n");                //040D9168
              #endif  
 994   1              // 指针后移          
 995   1              // TPDU段基本参数、回复地址等     
 996   1              gsmString2Bytes(pSrc, &tmp, 2);    
 997   1                                                  //tmp=04  No return back addr
 998   1                                                                                      //tmp=84  have return back addr 
 999   1              // 取基本参数     
1000   1              pSrc += 2;        
1001   1              // 指针后移     
1002   1      #if 0
                      putstring1("pSrc=\r\n");
                      putstring1(pSrc);
                      putstring1("\r\n");                //0D9168
              #endif
1007   1              
1008   1               
1009   1              //if(tmp & 0x80)                       
1010   1               {         
1011   2                      // 包含回复地址,取回复地址信息         
1012   2                      gsmString2Bytes(pSrc, &tmp, 2);    // 取长度       
1013   2              if(tmp==13)putstring1("13\r\n");
1014   2      
1015   2                      if(tmp & 1) tmp += 1;    // 调整奇偶性         
1016   2              if(tmp==14)putstring1("14\r\n");
1017   2                      
1018   2                      
1019   2                      pSrc += 4;          
1020   2                      // 指针后移         
1021   2                      gsmSerializeNumbers(pSrc, TPA, tmp);    
1022   2                      // 取TP-RA号码         
1023   2              #if 0 
                              putstring1("TPA=\r\n");
                              putstring1(TPA);
                              putstring1("\r\n");
                  #endif              
1028   2                      pSrc += tmp;        
1029   2                      // 指针后移     
1030   2               }          
1031   1      
1032   1      
1033   1               // TPDU段协议标识、编码方式、用户信息等     
1034   1               gsmString2Bytes(pSrc, (unsigned char*)&TP_PID, 2);         // 取协议标识(TP-PID)     

⌨️ 快捷键说明

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