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

📄 cmsdata.lst

📁 一个用单片机实现gprs modem发送短信的程序.里面有详细的注释,不可多得的学习程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
 245   1              *pDst = '\0';
 246   1      
 247   1              // 返回目标串长度
 248   1              return nDst;
 249   1      }
 250          // 可打印字符串转换为字节数据
 251          // 如:"C8329BFD0E01" --> {0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01}
 252          // pSrc: 源字符串指针
 253          // pDst: 目标数据指针
 254          // nSrcLength: 源字符串长度
 255          // 返回: 目标数据长度
 256          int gprsString2Bytes(const char* pSrc, unsigned char* pDst, int nSrcLength)
 257          {
 258   1              int i;
 259   1              for(i=0; i<nSrcLength; i+=2)
 260   1              {
 261   2                      // 输出高4位
 262   2                      if(*pSrc>='0' && *pSrc<='9')
 263   2                      {
 264   3                              *pDst = (*pSrc - '0') << 4;
 265   3                      }
 266   2                      else
 267   2                      {
 268   3                              *pDst = (*pSrc - 'A' + 10) << 4;
 269   3                      }
 270   2      
 271   2                      pSrc++;
 272   2      
 273   2                      // 输出低4位
 274   2                      if(*pSrc>='0' && *pSrc<='9')
 275   2                      {
 276   3                              *pDst |= *pSrc - '0';
 277   3                      }
 278   2                      else
 279   2                      {
 280   3                              *pDst |= *pSrc - 'A' + 10;
 281   3                      }
 282   2      
 283   2                      pSrc++;
 284   2                      pDst++;
 285   2              }
 286   1      
 287   1              // 返回目标数据长度
 288   1              return nSrcLength / 2;
 289   1      }
 290          // 字节数据转换为可打印字符串
 291          // 如:{0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01} --> "C8329BFD0E01" 
 292          // pSrc: 源数据指针
 293          // pDst: 目标字符串指针
 294          // nSrcLength: 源数据长度
 295          // 返回: 目标字符串长度
 296          int gprsBytes2String(const unsigned char* pSrc, char* pDst, int nSrcLength)
 297          {
 298   1              const char tab[]="0123456789ABCDEF";    // 0x0-0xf的字符查找表
 299   1              int i;
 300   1      
 301   1              for(i=0; i<nSrcLength; i++)
 302   1              {
 303   2                      *pDst++ = tab[*pSrc >> 4];              // 输出低4位
CX51 COMPILER V7.20   CMSDATA                                                              09/22/2006 14:21:06 PAGE 6   

 304   2                      *pDst++ = tab[*pSrc & 0x0f];    // 输出高4位
 305   2                      pSrc++;
 306   2              }
 307   1      
 308   1              // 输出字符串加个结束符
 309   1              *pDst = '\0';
 310   1      
 311   1              // 返回目标字符串长度
 312   1              return nSrcLength * 2;
 313   1      }
 314          
 315          // 正常顺序的字符串转换为两两颠倒的字符串,若长度为奇数,补'F'凑成偶数
 316          // 如:"8613851872468" --> "683158812764F8"
 317          // pSrc: 源字符串指针
 318          // pDst: 目标字符串指针
 319          // nSrcLength: 源字符串长度
 320          // 返回: 目标字符串长度
 321          int gprsInvertNumbers(const char* pSrc, char* pDst, int nSrcLength)
 322          {
 323   1              int nDstLength;         // 目标字符串长度
 324   1              char ch;                        // 用于保存一个字符
 325   1              int   i;
 326   1      
 327   1              // 复制串长度
 328   1              nDstLength = nSrcLength;
 329   1      
 330   1              // 两两颠倒
 331   1              for(i=0; i<nSrcLength;i+=2)
 332   1              {
 333   2                      ch = *pSrc++;           // 保存先出现的字符
 334   2                      *pDst++ = *pSrc++;      // 复制后出现的字符
 335   2                      *pDst++ = ch;           // 复制先出现的字符
 336   2              }
 337   1      
 338   1              // 源串长度是奇数吗?
 339   1              if(nSrcLength & 1)
 340   1              {
 341   2                      *(pDst-2) = 'F';        // 补'F'
 342   2                      nDstLength++;           // 目标串长度加1
 343   2              }
 344   1      
 345   1              // 输出字符串加个结束符
 346   1              *pDst = '\0';
 347   1      
 348   1              // 返回目标字符串长度
 349   1              return nDstLength;
 350   1      }
 351          // 两两颠倒的字符串转换为正常顺序的字符串
 352          // 如:"683158812764F8" --> "8613851872468"
 353          // pSrc: 源字符串指针
 354          // pDst: 目标字符串指针
 355          // nSrcLength: 源字符串长度
 356          // 返回: 目标字符串长度
 357          int gprsSerializeNumbers(const char* pSrc, char* pDst, int nSrcLength)
 358          {
 359   1              int nDstLength;         // 目标字符串长度
 360   1              char ch;                        // 用于保存一个字符
 361   1              int  i;
 362   1      
 363   1              // 复制串长度
 364   1              nDstLength = nSrcLength;
 365   1      
CX51 COMPILER V7.20   CMSDATA                                                              09/22/2006 14:21:06 PAGE 7   

 366   1              // 两两颠倒
 367   1              for(i=0; i<nSrcLength;i+=2)
 368   1              {
 369   2                      ch = *pSrc++;           // 保存先出现的字符
 370   2                      *pDst++ = *pSrc++;      // 复制后出现的字符
 371   2                      *pDst++ = ch;           // 复制先出现的字符
 372   2              }
 373   1      
 374   1              // 最后的字符是'F'吗?
 375   1              if(*(pDst-1) == 'F')
 376   1              {
 377   2                      pDst--;
 378   2                      nDstLength--;           // 目标字符串长度减1
 379   2              }
 380   1      
 381   1              // 输出字符串加个结束符
 382   1              *pDst = '\0';
 383   1      
 384   1              // 返回目标字符串长度
 385   1              return nDstLength;
 386   1      }
 387          
 388          int gprsEncodePdu(const SM_PARAM* pSrc, char* pDst)
 389          {
 390   1              int nLength;                    // 内部用的串长度
 391   1              int nDstLength;                 // 目标PDU串长度
 392   1              unsigned char buf[256]; // 内部用的缓冲区
 393   1      
 394   1              // SMSC地址信息段
 395   1              nLength = strlen(pSrc->SCA);    // SMSC地址字符串的长度 
 396   1              buf[0] = (char)((nLength & 1) == 0 ? nLength : nLength + 1) / 2 + 1;    // SMSC地址信息长度
 397   1              buf[1] = 0x91;          // 固定: 用国际格式号码
 398   1              nDstLength = gprsBytes2String(buf, pDst, 2);            // 转换2个字节到目标PDU串
 399   1              nDstLength += gprsInvertNumbers(pSrc->SCA, &pDst[nDstLength], nLength); // 转换SMSC号码到目标PDU串
 400   1      
 401   1              // TPDU段基本参数、目标地址等
 402   1              nLength = strlen(pSrc->TPA);    // TP-DA地址字符串的长度
 403   1              buf[0] = 0x11;                                  // 是发送短信(TP-MTI=01),TP-VP用相对格式(TP-VPF=10)
 404   1              buf[1] = 0;                                             // TP-MR=0
 405   1              buf[2] = (char)nLength;                 // 目标地址数字个数(TP-DA地址字符串真实长度)
 406   1              buf[3] = 0x91;                                  // 固定: 用国际格式号码
 407   1              nDstLength += gprsBytes2String(buf, &pDst[nDstLength], 4);              // 转换4个字节到目标PDU串
 408   1              nDstLength += gprsInvertNumbers(pSrc->TPA, &pDst[nDstLength], nLength); // 转换TP-DA到目标PDU串
 409   1      
 410   1              // TPDU段协议标识、编码方式、用户信息等
 411   1              nLength = strlen(pSrc->TP_UD);  // 用户信息字符串的长度
 412   1              buf[0] = pSrc->TP_PID;                  // 协议标识(TP-PID)
 413   1              buf[1] = pSrc->TP_DCS;                  // 用户信息编码方式(TP-DCS)
 414   1              buf[2] = 0;                                             // 有效期(TP-VP)为5分钟
 415   1                      
 416   1                      // 7-bit编码方式
 417   1                      buf[3] = nLength;                       // 编码前长度
 418   1                      nLength = gprsEncode7bit(pSrc->TP_UD, &buf[4], nLength+1) + 4;  // 转换TP-DA到目标PDU串
 419   1              
 420   1              
 421   1              nDstLength += gprsBytes2String(buf, &pDst[nDstLength], nLength);                // 转换该段数据到目标PDU串
 422   1      
 423   1              // 返回目标字符串长度
 424   1              return nDstLength;
 425   1      }
 426          
 427          // PDU解码,用于接收、阅读短消息
CX51 COMPILER V7.20   CMSDATA                                                              09/22/2006 14:21:06 PAGE 8   

 428          // pSrc: 源PDU串指针
 429          // pDst: 目标PDU参数指针
 430          // 返回: 用户信息串长度
 431          int gprsDecodePdu(const char* pSrc, SM_PARAM* pDst)
 432          {
 433   1              int nDstLength;                 // 目标PDU串长度
 434   1              unsigned char tmp;              // 内部用的临时字节变量
 435   1              unsigned char buf[256]; // 内部用的缓冲区
 436   1      
 437   1              // SMSC地址信息段
 438   1              gprsString2Bytes(pSrc, &tmp, 2);        // 取长度
 439   1              tmp = (tmp - 1) * 2;    // SMSC号码串长度
 440   1              pSrc += 4;                      // 指针后移,忽略了SMSC地址格式
 441   1              gprsSerializeNumbers(pSrc, pDst->SCA, tmp);     // 转换SMSC号码到目标PDU串
 442   1              pSrc += tmp;            // 指针后移
 443   1      
 444   1              // TPDU段基本参数、回复地址等
 445   1              gprsString2Bytes(pSrc, &tmp, 2);        // 取基本参数
 446   1              pSrc += 2;              // 指针后移
 447   1      //      if(tmp & 0x80)
 448   1              {
 449   2                      // 包含回复地址,取回复地址信息
 450   2                      gprsString2Bytes(pSrc, &tmp, 2);        // 取长度
 451   2                      if(tmp & 1) tmp += 1;   // 调整奇偶性
 452   2                      pSrc += 4;                      // 指针后移,忽略了回复地址(TP-RA)格式
 453   2                      gprsSerializeNumbers(pSrc, pDst->TPA, tmp);     // 取TP-RA号码
 454   2                      pSrc += tmp;            // 指针后移
 455   2              }
 456   1      
 457   1              // TPDU段协议标识、编码方式、用户信息等
 458   1              gprsString2Bytes(pSrc, (unsigned char*)&pDst->TP_PID, 2);       // 取协议标识(TP-PID)
 459   1              pSrc += 2;              // 指针后移
 460   1              gprsString2Bytes(pSrc, (unsigned char*)&pDst->TP_DCS, 2);       // 取编码方式(TP-DCS)
 461   1              pSrc += 2;              // 指针后移
 462   1              gprsSerializeNumbers(pSrc, pDst->TP_SCTS, 14);          // 服务时间戳字符串(TP_SCTS) 
 463   1              pSrc += 14;             // 指针后移
 464   1              gprsString2Bytes(pSrc, &tmp, 2);        // 用户信息长度(TP-UDL)
 465   1              pSrc += 2;              // 指针后移
 466   1              
 467   1                      // 7-bit解码
 468   1                      nDstLength = gprsString2Bytes(pSrc, buf, tmp & 7 ? (int)tmp * 7 / 4 + 2 : (int)tmp * 7 / 4);    // 格式转换
 469   1                      gprsDecode7bit(buf, pDst->TP_UD, nDstLength);   // 转换到TP-DU
 470   1                      nDstLength = tmp;
 471   1              
 472   1      
 473   1              // 返回目标字符串长度
 474   1              return nDstLength;
 475   1      }
 476          
 477          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   3302    ----
   CONSTANT SIZE    =    147    ----
   XDATA SIZE       =   ----     613
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
   EDATA SIZE       =   ----    ----
   HDATA SIZE       =   ----    ----
CX51 COMPILER V7.20   CMSDATA                                                              09/22/2006 14:21:06 PAGE 9   

   XDATA CONST SIZE =   ----    ----
   FAR CONST SIZE   =   ----    ----
END OF MODULE INFORMATION.


CX51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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