📄 sms.lst
字号:
*** 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 + -