WEB开发网
开发学院软件开发VC 通过串口收发短消息(上) 阅读

通过串口收发短消息(上)

 2010-06-29 20:42:35 来源:WEB开发网   
核心提示:需要指出的是,7-bit的字符集与ANSI标准字符集不完全一致,通过串口收发短消息(上)(3),在0x20以下也排布了一些可打印字符,但英文字母、阿拉伯数字和常用符号的位置两者是一样的,Windows环境下,用C实现UCS2编码和解码的算法如下:// UCS2编码// pSrc: 源字符串指针// pDst: 目标编码

需要指出的是,7-bit的字符集与ANSI标准字符集不完全一致,在0x20以下也排布了一些可打印字符,但英文字母、阿拉伯数字和常用符号的位置两者是一样的。用上面介绍的算法收发纯英文短消息,一般情况应该是够用了。如果是法语、德语、西班牙语等,含有“å”、 “é”这一类字符,则要按上面编码的输出去查表,请参阅GSM 03.38的规定。

8-bit编码其实没有规定什么具体的算法,不需要介绍。

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);

  // 返回目标字符串长度
  return nDstLength;
}

上一页  1 2 3 4  下一页

Tags:通过 串口 收发

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接