📄 pdu.lst
字号:
CX51 COMPILER V7.20 PDU 09/10/2006 15:19:49 PAGE 1
CX51 COMPILER V7.20, COMPILATION OF MODULE PDU
OBJECT MODULE PLACED IN pdu.OBJ
COMPILER INVOKED BY: D:\program\keil\C51\BIN\CX51.EXE pdu.c BROWSE DEBUG
line level source
1
2 #include "pdu.h"
3
4 int gprsEncodePdu(const SM_PARAM* pSrc, char* pDst)
5 {
6 1 int nLength; // 内部用的串长度
7 1 int nDstLength; // 目标PDU串长度
8 1 unsigned char buf[256]; // 内部用的缓冲区
9 1
10 1 // SMSC地址信息段
11 1 nLength = strlen(pSrc->SCA); // SMSC地址字符串的长度
12 1 buf[0] = (char)((nLength & 1) == 0 ? nLength : nLength + 1) / 2 + 1; // SMSC地址信息长度
13 1 buf[1] = 0x91; // 固定: 用国际格式号码
14 1 nDstLength = gprsBytes2String(buf, pDst, 2); // 转换2个字节到目标PDU串
15 1 nDstLength += gprsInvertNumbers(pSrc->SCA, &pDst[nDstLength], nLength); // 转换SMSC号码到目标PDU串
16 1
17 1 // TPDU段基本参数、目标地址等
18 1 nLength = strlen(pSrc->TPA); // TP-DA地址字符串的长度
19 1 buf[0] = 0x11; // 是发送短信(TP-MTI=01),TP-VP用相对格式(TP-VPF=10)
20 1 buf[1] = 0; // TP-MR=0
21 1 buf[2] = (char)nLength; // 目标地址数字个数(TP-DA地址字符串真实长度)
22 1 buf[3] = 0x91; // 固定: 用国际格式号码
23 1 nDstLength += gprsBytes2String(buf, &pDst[nDstLength], 4); // 转换4个字节到目标PDU串
24 1 nDstLength += gprsInvertNumbers(pSrc->TPA, &pDst[nDstLength], nLength); // 转换TP-DA到目标PDU串
25 1
26 1 // TPDU段协议标识、编码方式、用户信息等
27 1 nLength = strlen(pSrc->TP_UD); // 用户信息字符串的长度
28 1 buf[0] = pSrc->TP_PID; // 协议标识(TP-PID)
29 1 buf[1] = pSrc->TP_DCS; // 用户信息编码方式(TP-DCS)
30 1 buf[2] = 0; // 有效期(TP-VP)为5分钟
31 1
32 1 // 7-bit编码方式
33 1 buf[3] = nLength; // 编码前长度
34 1 nLength = gprsEncode7bit(pSrc->TP_UD, &buf[4], nLength+1) + 4; // 转换TP-DA到目标PDU串
35 1
36 1
37 1 nDstLength += gprsBytes2String(buf, &pDst[nDstLength], nLength); // 转换该段数据到目标PDU串
38 1
39 1 // 返回目标字符串长度
40 1 return nDstLength;
41 1 }
*** ERROR C241 IN LINE 41 OF PDU.C: '_gprsEncodePdu': auto segment too large
42
43 // PDU解码,用于接收、阅读短消息
44 // pSrc: 源PDU串指针
45 // pDst: 目标PDU参数指针
46 // 返回: 用户信息串长度
47 int gprsDecodePdu(const char* pSrc, SM_PARAM* pDst)
48 {
49 1 int nDstLength; // 目标PDU串长度
50 1 unsigned char tmp; // 内部用的临时字节变量
51 1 unsigned char buf[256]; // 内部用的缓冲区
52 1
53 1 // SMSC地址信息段
54 1 gprsString2Bytes(pSrc, &tmp, 2); // 取长度
CX51 COMPILER V7.20 PDU 09/10/2006 15:19:49 PAGE 2
55 1 tmp = (tmp - 1) * 2; // SMSC号码串长度
56 1 pSrc += 4; // 指针后移,忽略了SMSC地址格式
57 1 gprsSerializeNumbers(pSrc, pDst->SCA, tmp); // 转换SMSC号码到目标PDU串
58 1 pSrc += tmp; // 指针后移
59 1
60 1 // TPDU段基本参数、回复地址等
61 1 gprsString2Bytes(pSrc, &tmp, 2); // 取基本参数
62 1 pSrc += 2; // 指针后移
63 1 // if(tmp & 0x80)
64 1 {
65 2 // 包含回复地址,取回复地址信息
66 2 gprsString2Bytes(pSrc, &tmp, 2); // 取长度
67 2 if(tmp & 1) tmp += 1; // 调整奇偶性
68 2 pSrc += 4; // 指针后移,忽略了回复地址(TP-RA)格式
69 2 gprsSerializeNumbers(pSrc, pDst->TPA, tmp); // 取TP-RA号码
70 2 pSrc += tmp; // 指针后移
71 2 }
72 1
73 1 // TPDU段协议标识、编码方式、用户信息等
74 1 gprsString2Bytes(pSrc, (unsigned char*)&pDst->TP_PID, 2); // 取协议标识(TP-PID)
75 1 pSrc += 2; // 指针后移
76 1 gprsString2Bytes(pSrc, (unsigned char*)&pDst->TP_DCS, 2); // 取编码方式(TP-DCS)
77 1 pSrc += 2; // 指针后移
78 1 gprsSerializeNumbers(pSrc, pDst->TP_SCTS, 14); // 服务时间戳字符串(TP_SCTS)
79 1 pSrc += 14; // 指针后移
80 1 gprsString2Bytes(pSrc, &tmp, 2); // 用户信息长度(TP-UDL)
81 1 pSrc += 2; // 指针后移
82 1
83 1 // 7-bit解码
84 1 nDstLength = gprsString2Bytes(pSrc, buf, tmp & 7 ? (int)tmp * 7 / 4 + 2 : (int)tmp * 7 / 4); // 格式转换
85 1 gprsDecode7bit(buf, pDst->TP_UD, nDstLength); // 转换到TP-DU
86 1 nDstLength = tmp;
87 1
88 1
89 1 // 返回目标字符串长度
90 1 return nDstLength;
91 1 }
*** ERROR C241 IN LINE 91 OF PDU.C: '_gprsDecodePdu': auto segment too large
92
CX51 COMPILATION COMPLETE. 0 WARNING(S), 2 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -