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

📄 sms.lst

📁 这是用W77E58编写的控制GSM模块
💻 LST
📖 第 1 页 / 共 5 页
字号:
*** WARNING C280 IN LINE 205 OF SMS.C: 'pSrc': unreferenced local variable
*** WARNING C280 IN LINE 205 OF SMS.C: 'pDst': unreferenced local variable
*** WARNING C280 IN LINE 205 OF SMS.C: 'nSrcLength': unreferenced local variable
 210          
 211          
 212          
 213          /***********************************************************************************************
 214               需要指出的是,7-bit的字符集与ANSI标准字符集不完全一致,在0x20以下也排布了一些可打印字符,但英文字母、
 215           阿拉伯数字和常用符号的位置 两者是一样的。用上面介绍的算法收发纯英文短消息,一般情况应该是够用了。
 216           如果是法语、德语、西班牙语等,含有 “?”、 “é”这一类字 符,则要按上面编码的输出去查表,请参阅GSM 03.38
 217           的规定。
 218          ***********************************************************************************************/
 219          
C51 COMPILER V7.50   SMS                                                                   01/26/2007 17:53:09 PAGE 5   

 220          #if 0
              
              
              /************************************************************************************************
              UCS2编码是将每个字符(1-2个字节)按照ISO/IEC10646的规定,转变为16位的Unicode宽字符。在Windows系统中,特
              别是在2000/XP中,可以简单地调用API 函数实现编码和解码。如果没有系统的支持,比如用单片机控制手机模块收
              发短消息,只好用查表法解决了。
              Windows 用C实现UCS2编码和解码的算法如下:
              *************************************************************************************************/
              
              
              /*************************************************************************************************
              // UCS2编码 
              // pSrc: 源字符串指针 
              // pDst: 目标编码串指针 
              // nSrcLength: 源字符串长度 
              // 返回: 目标编码串长度 
              **************************************************************************************************/
              int gsmEncodeUcs2(const char* pSrc, unsigned char* pDst, int nSrcLength) 
              {  
                         
                         int nDstLength;        // UNICODE宽字符数目     
              
                         WCHAR wchar[128];      // UNICODE串缓冲区          
                         // 字符串-->UNICODE串     
                         nDstLength = ::MultiByteToWideChar(CP_ACP, 0, pSrc, nSrcLength, wchar, 128);  
                        // 高低字节对调,输出     
                        for(int i=0; i<nDstLength; i++)     
                        {         
                          // 先输出高位字节
                          *pDst++ = wchar[i] >> 8;  
                          // 后输出低位字节         
                          *pDst++ = wchar[i] & 0xff;     
                        }          
              
                        // 返回目标编码串长度     
                        return nDstLength * 2; 
              }      
              
              
              /**************************************************************************************************
              // UCS2解码 
              // pSrc: 源编码串指针 
              // pDst: 目标字符串指针 
              // nSrcLength: 源编码串长度 
              // 返回: 目标字符串长度 
              **************************************************************************************************/
              int gsmDecodeUcs2(const unsigned char* pSrc, char* pDst, int nSrcLength) 
              {     
                       int nDstLength;        // UNICODE宽字符数目     
              
                       WCHAR wchar[128];      // UNICODE串缓冲区          
                       // 高低字节对调,拼成UNICODE     
                       for(int i=0; i<nSrcLength/2; i++)     
                       {         
                           // 先高位字节         
                           wchar[i] = *pSrc++ << 8;              
                           // 后低位字节         
                           wchar[i]  = *pSrc++;     
                       }          
                       // UNICODE串-->字符串     
                       nDstLength = ::WideCharToMultiByte(CP_ACP, 0, wchar, nSrcLength/2, pDst, 160, NULL, NULL);          
C51 COMPILER V7.50   SMS                                                                   01/26/2007 17:53:09 PAGE 6   

                       // 输出字符串加个结束符         
                       pDst[nDstLength] = '\0';              
                       // 返回目标字符串长度     
                       
                       return nDstLength; 
              } 
              #endif
 289          
 290          
 291          
 292          
 293          /*************************************************************************************************
 294          用以上编码和解码模块,还不能将短消息字符串编码为PDU串需要的格式,也不能直接将PDU串中的用户信息解码为
 295          短消息字符串,因为还差一个在可打印字符串和字节数据之间相互转换的环节。可以循环调用sscanf和sprintf函
 296          数实现这种变换。下面提供不用这些函数的算法,它们也适用于单片机、DSP编程环境。
 297          **************************************************************************************************/
 298          // 可打印字符串转换为字节数据 // 如:"C8329BFD0E01" --> {0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01}
 299           // pSrc: 源字符串指针 
 300           // pDst: 目标数据指针 
 301           // nSrcLength: 源字符串长度 
 302           // 返回: 目标数据长度 
 303           //int gsmString2Bytes(const char* pSrc, unsigned char* pDst, int nSrcLength) 
 304           int gsmString2Bytes(uchar xdata * pSrc, uchar xdata * pDst, int xdata nSrcLength) 
*** WARNING C258 IN LINE 304 OF SMS.C: 'nSrcLength': mspace on parameter ignored
 305           {   
 306   1                int xdata i;
 307   1            for(i=0; i<nSrcLength; i+=2)     
 308   1                {         
 309   2                      // 输出高4位         
 310   2                      if(*pSrc>='0' && *pSrc<='9')         
 311   2                      {             
 312   3                              *pDst = (*pSrc - '0') << 4;         
 313   3                  }         
 314   2                  else         
 315   2                  {             
 316   3                              *pDst = (*pSrc - 'A' + 10) << 4;         
 317   3                  }              
 318   2                  
 319   2                      pSrc++;              
 320   2                  // 输出低4位        
 321   2                  if(*pSrc>='0' && *pSrc<='9')         
 322   2                  {             
 323   3                              *pDst  = *pSrc - '0';         
 324   3                  }         
 325   2                  else         
 326   2                  {             
 327   3                              *pDst  = *pSrc - 'A' + 10;         
 328   3                  }         
 329   2                  pSrc++;         
 330   2                  pDst++;     
 331   2                }          
 332   1                // 返回目标数据长度     
 333   1                return nSrcLength / 2; 
 334   1       }      
 335           
 336           
 337           // 字节数据转换为可打印字符串 // 如:{0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01} --> "C8329BFD0E01"  
 338           // pSrc: 源数据指针 
 339           // pDst: 目标字符串指针 
 340           // nSrcLength: 源数据长度 
 341           // 返回: 目标字符串长度 
 342           //int gsmBytes2String(const unsigned char* pSrc, char* pDst, int nSrcLength) 
C51 COMPILER V7.50   SMS                                                                   01/26/2007 17:53:09 PAGE 7   

 343           int gsmBytes2String(uchar xdata * pSrc, char xdata* pDst, int xdata nSrcLength) 
*** WARNING C258 IN LINE 343 OF SMS.C: 'nSrcLength': mspace on parameter ignored
 344           {     
 345   1              //const char tab[]="0123456789ABCDEF";    
 346   1              code char tab[]="0123456789ABCDEF";    
 347   1              
 348   1              int xdata i;
 349   1              // 0x0-0xf的字符查找表          
 350   1              for(i=0; i<nSrcLength; i++)     
 351   1              {         
 352   2                      // 输出低4位         
 353   2                      *pDst++ = tab[*pSrc >> 4];   
 354   2                      // 输出高4位         
 355   2                      *pDst++ = tab[*pSrc & 0x0f];              
 356   2                      pSrc++;     
 357   2              }          
 358   1              // 输出字符串加个结束符     
 359   1              *pDst = '\0';          
 360   1              // 返回目标字符串长度     
 361   1              return nSrcLength * 2; 
 362   1       }
 363          
 364          
 365          /************************************************************************************************
 366          *PDU全串的编码和解码过程,以及GSM 07.05的AT命令实现方法
 367          *************************************************************************************************/
 368          
 369          
 370          
 371          /**************************************************************************************************
 372          //PDU串中的号码和时间,都是两两颠倒的字符串。利用下面两个函数可进行正反变换:
 373          // 正常顺序的字符串转换为两两颠倒的字符串,若长度为奇数,补''F''凑成偶数 // 如:"8613851872468" --> "6831588
             -12764F8" 
 374          // pSrc: 源字符串指针 
 375          // pDst: 目标字符串指针 
 376          // nSrcLength: 源字符串长度 
 377          // 返回: 目标字符串长度 
 378          ****************************************************************************************************/
 379          //int gsmInvertNumbers(const char* pSrc, char* pDst, int nSrcLength) 
 380          int gsmInvertNumbers(char xdata* pSrc, char xdata* pDst, int xdata nSrcLength) 
*** WARNING C258 IN LINE 380 OF SMS.C: 'nSrcLength': mspace on parameter ignored
 381          {     
 382   1      
 383   1      
 384   1          int xdata nDstLength;   // 目标字符串长度     
 385   1              char xdata ch;          // 用于保存一个字符          
 386   1              int xdata i;
 387   1              // 复制串长度     
 388   1              nDstLength = nSrcLength;          
 389   1              // 两两颠倒     
 390   1              for(i=0; i<nSrcLength;i+=2)     
 391   1              {         
 392   2                  ch = *pSrc++;        // 保存先出现的字符         
 393   2                  *pDst++ = *pSrc++;   // 复制后出现的字符         
 394   2                  *pDst++ = ch;        // 复制先出现的字符     
 395   2          }          
 396   1          // 源串长度是奇数吗?     
 397   1          if(nSrcLength & 1)     
 398   1          {         
 399   2                  //*(pDst-2) = ''F'';     // 补''F'' 
 400   2                  *(pDst-2) = "F";     // 补''F'' 
*** WARNING C260 IN LINE 400 OF SMS.C: '=': pointer truncation
C51 COMPILER V7.50   SMS                                                                   01/26/2007 17:53:09 PAGE 8   

 401   2                  nDstLength++;        // 目标串长度加1     
 402   2          }          
 403   1          // 输出字符串加个结束符     
 404   1          *pDst = "\0";          
*** WARNING C260 IN LINE 404 OF SMS.C: '=': pointer truncation
 405   1          // 返回目标字符串长度     
 406   1          return nDstLength; 
 407   1      }      
 408          
 409          
 410          
 411          
 412          
 413          // 两两颠倒的字符串转换为正常顺序的字符串 // 如:"683158812764F8" --> "8613851872468" 
 414          // pSrc: 源字符串指针 
 415          // pDst: 目标字符串指针 
 416          // nSrcLength: 源字符串长度 
 417          // 返回: 目标字符串长度 
 418          //int gsmSerializeNumbers(const char* pSrc, char* pDst, int nSrcLength) 
 419          int gsmSerializeNumbers(char xdata* pSrc, char xdata* pDst, int xdata nSrcLength) 
*** WARNING C258 IN LINE 419 OF SMS.C: 'nSrcLength': mspace on parameter ignored
 420          {     
 421   1                  int xdata nDstLength;   // 目标字符串长度     
 422   1                  char xdata ch;          // 用于保存一个字符      
 423   1              int xdata i;
 424   1                      // 复制串长度     nDstLength = nSrcLength;          
 425   1              // 两两颠倒     
 426   1              for(i=0; i<nSrcLength;i+=2)     
 427   1              { 
 428   2                      ch = *pSrc++;        
 429   2                      // 保存先出现的字符         
 430   2                      *pDst++ = *pSrc++;   // 复制后出现的字符         
 431   2                      *pDst++ = ch;        // 复制先出现的字符     
 432   2              }          
 433   1             
 434   1              // 最后的字符是''F''吗?     

⌨️ 快捷键说明

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