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

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

 2010-06-29 20:42:35 来源:WEB开发网   
核心提示:用以上编码和解码模块,还不能将短消息字符串编码为PDU串需要的格式,通过串口收发短消息(上)(4),也不能直接将PDU串中的用户信息解码为短消息字符串,因为还差一个在可打印字符串和字节数据之间相互转换的环节,这里我们就不讨论了,有兴趣的话,可以循环调用sscanf和sprintf函数实现这种变换,下面提供不用这些函数的

用以上编码和解码模块,还不能将短消息字符串编码为PDU串需要的格式,也不能直接将PDU串中的用户信息解码为短消息字符串,因为还差一个在可打印字符串和字节数据之间相互转换的环节。可以循环调用sscanf和sprintf函数实现这种变换。下面提供不用这些函数的算法,它们也适用于单片机、DSP编程环境。// 可打印字符串转换为字节数据

// 如:"C8329BFD0E01" --> {0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01}
// pSrc: 源字符串指针
// pDst: 目标数据指针
// nSrcLength: 源字符串长度
// 返回: 目标数据长度
int gsmString2Bytes(const char* pSrc, unsigned char* pDst, int nSrcLength)
{
  for (int i = 0; i < nSrcLength; i++)
  {
    // 输出高4位
    if (*pSrc > = ''0'' && *pSrc <= ''9'')
    {
      *pDst = (*pSrc - ''0'') << 4;
    }
    else
    {
      *pDst = (*pSrc - ''A'' + 10) << 4;
    }

    pSrc++;

    // 输出低4位
    if (*pSrc >= ''0'' && *pSrc <= ''9'')
    {
      *pDst |= *pSrc - ''0'';
    }
    else
    {
      *pDst |= *pSrc - ''A'' + 10;
    }
    pSrc++;
    pDst++;
  }

  // 返回目标数据长度
  return nSrcLength / 2;
}

// 字节数据转换为可打印字符串
// 如:{0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01} --> "C8329BFD0E01"
// pSrc: 源数据指针
// pDst: 目标字符串指针
// nSrcLength: 源数据长度
// 返回: 目标字符串长度
int gsmBytes2String(const unsigned char* pSrc, char* pDst, int nSrcLength)
{
  const char tab[]="0123456789ABCDEF"; // 0x0-0xf的字符查找表

  for (int i = 0; i < nSrcLength; i++)
  {
    // 输出高4位
    *pDst++ = tab[*pSrc >> 4];

    // 输出低4位
    *pDst++ = tab[*pSrc & 0x0f];

    pSrc++;
  }

  // 输出字符串加个结束符
  *pDst = ''\0'';

  // 返回目标字符串长度
  return nSrcLength * 2;
}

关于GSM 03.42中的压缩算法,至今还没有发现哪里用过,这里我们就不讨论了。有兴趣的话,可深入研究一下。

本文配套源码

上一页  1 2 3 4 

Tags:通过 串口 收发

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