📄 gsm_task.c
字号:
// 将源串每8个字节分为一组,压缩成7个字节
// 循环该处理过程,直至源串被处理完
// 如果分组不到8字节,也能正确处理
while(nSrc<nSrcLength)
{
// 取源字符串的计数值的最低3位
nChar = nSrc & 7;
// 处理源串的每个字节
if(nChar == 0)
{
// 组内第一个字节,只是保存起来,待处理下一个字节时使用
nLeft = *pSrc;
}
else
{
// 组内其它字节,将其右边部分与残余数据相加,得到一个目标编码字节
*pDst = (*pSrc << (8-nChar)) | nLeft;
// 将该字节剩下的左边部分,作为残余数据保存起来
nLeft = *pSrc >> nChar;
// 修改目标串的指针和计数值 pDst++;
nDst++;
}
// 修改源串的指针和计数值
pSrc++; nSrc++;
}
// 返回目标串长度
return nDst;
}
*/
/*********************************************
函数功能:7-bit解码
输入参数:pSrc: 源编码串指针
pDst: 目标字符串指针
nSrcLength: 源编码串长度
返回值: 目标字符串长度
*********************************************/
u16 gsmDecode7bit(const u8* pSrc, u8* pDst, u16 nSrcLength)
{
u16 nSrc; /* 源字符串的计数值*/
u16 nDst; /* 目标解码串的计数值*/
u16 nByte; /* 当前正在处理的组内字节的序号,范围是0-6*/
u8 nLeft; /* 上一字节残余的数据*/
/*计数值初始化*/
nSrc = 0;
nDst = 0;
/*组内字节序号和残余数据初始化*/
nByte = 0;
nLeft = 0;
/*将源数据每7个字节分为一组,解压缩成8个字节
循环该处理过程,直至源数据被处理完
如果分组不到7字节,也能正确处理*/
while(nSrc<nSrcLength)
{
/*将源字节右边部分与残余数据相加,去掉最高位,得到一个目标解码字节*/
*pDst = ((*pSrc << nByte) | nLeft) & 0x7f;
/*将该字节剩下的左边部分,作为残余数据保存起来*/
nLeft = *pSrc >> (7-nByte);
/*修改目标串的指针和计数值*/
pDst++;
nDst++;
/*修改字节计数值*/
nByte++;
/*到了一组的最后一个字节*/
if(nByte == 7)
{
/*额外得到一个目标解码字节*/
*pDst = nLeft;
/*修改目标串的指针和计数值*/
pDst++;
nDst++;
/*组内字节序号和残余数据初始化*/
nByte = 0;
nLeft = 0;
}
/*修改源串的指针和计数值*/
pSrc++;
nSrc++;
}
*pDst = 0;
/* 返回目标串长度*/
return nDst;
}
/********************************************************************************
函数名称:int int2BcdAscStr(char *pstr, u32 val, u8 len)
函数功能:将一整数转换为指定长度BCD表示的ASC字符串
输入参数:val --整数值
len--字符串长度,<=4
返回值:pstr--字符串首地址
返回值 :
创建人 :
创建时间:
修改记录:
其它说明:举例 val = 1234 len = 4 --> pstr里保存的内容 31 32 33 34
注意:
pstr缓冲区长度至少为len+1,最后一个用于保存字符串结束符0
*********************************************************************************/
int int2BcdAscStr(char *pstr, u32 val, u8 len)
{
u8 i = 0;
// int t = 0;
if (len > 10)
{//0xFFFFFFFF=4294967295
len = 10;
}
for (i = 0; i<len; i++)
{
*(pstr+len-1-i) = val % 10 + '0';
val = val / 10;
}
*(pstr+len) = 0;
return len;
}
/*******************************************
函数功能:查找第一个数字串,转为整数返回
输入参数:*pSrcBuf:源字符串
maxLen:查找长度
返回值:找到的数字串,转为整数返回
*******************************************/
u16 getIndex(const char *pSrcBuf, u8 maxLen)
{
u16 index = 0;
u8 i = 0;
u8 j = 0;
u8 flg = 0;
u8 pBuf[8];
memset(pBuf, 0, 8);
for (i = 0; i< maxLen; i++)
{
if ((pSrcBuf[i] >= '0') && (pSrcBuf[i] <= '9'))
{
pBuf[j++] = pSrcBuf[i];
flg = 1;
}
else
{
if (flg == 1)
{/*非数字字符,查找结束*/
break;
}
}
if (j >= maxLen-1)
{
break;
}
}
pBuf[j] = '\0';
index = bcdAscStr2Uint(pBuf, j);
return index;
}
/***********************************************************************************
函数名称:u32 bcdAscStr2Uint(CONSTBYTE *ascstr, u8 bitnum)
函数功能:将ASC码表示的BCD码串转化为一整型数
输入参数:ascstr--ASC码表示的BCD码串
bitnum--十进制位数
返回值:无
返回值 :转换后的整型数
调用函数:无
创建人 :
创建时间:2004.10.19
修改记录:
其它说明:例:31 32 33 34 --1234
***********************************************************************************/
u32 bcdAscStr2Uint(uc8 *ascstr, u8 bitnum)
{
u32 tvalue = 0;
u32 pow10 = 1;
u8 i = 0;
if ( ( bitnum == 0 ) || ( bitnum > 8 ) )
{//最大为十进制99999999
return 0;
}
for( i = bitnum; i > 0; i-- )
{//slow
tvalue += asc2HexNum( ascstr[i-1] ) * pow10;
pow10 *= 10;
}
return tvalue;
}
/***********************************************************************************
函数名称:u8 asc2HexNum( char key )
函数功能:将一位ASC码转为一位十六进制数
输入参数:key--ASC码值('0'~'9','A'~'F','a'~'f')
返回值:无
返回值 :转换结果
调用函数:无
创建人 :
创建时间:2004.10.19
修改记录:
其它说明:例:'0'--0 'A'--A(10)
***********************************************************************************/
u8 asc2HexNum( char key )
{
u8 iRet = 0;
if ( ( key >= '0' ) && ( key <= '9' ) )
{
iRet = key - '0';
}
else
{
if ( ( key >= 'A' ) && ( key <= 'F' ) )
{
iRet = key - 55;
}
else
{
if ( ( key >= 'a' ) && ( key <= 'f' ) )
{
iRet = key - 87;
}
else
{
iRet = 0;
}
}
}
return iRet;
}
/***********************************************************************************
函数名称:void byte2HexAscStr(u8 decnum, u8 *ascstr)
函数功能:将一个字节的数转换为两个字节的ASCII码字符串
输入参数:decnum--待转换的数字
返回值:ascstr--转换后的字符串
返回值 :无
调用函数:无
创建人 :
创建时间:2004.10.19
修改记录:
其它说明:注意:ascstr缓冲区大小必须大于或等于三个字节
举例:0x23-->0x32 0x33
***********************************************************************************/
void byte2HexAscStr(u8 decnum, u8 *ascstr)
{
ascstr[0] = hexNum2Asc((decnum >> 4) & 0x0F);
ascstr[1] = hexNum2Asc(decnum & 0x0F);
ascstr[2] = 0;
}
/*************************************************
函数功能:将text数据转为PDU数据,即7-bit编码
输入参数:*txtData:待转换的数据
*pduData:转换后的数据
dataLen:需要转换的长度
返回值:转换后数据的长度
**************************************************/
u8 atTextToPDUData(char *txtData,u8 *pduData,u8 dataLen)
{
int i,j;
if (dataLen<=0) return 0;/*短消息内容最多不超过140个byte*/
if (dataLen>160)
{
dataLen = 160;
}
j = 0;
while(1)
{
RESET_WDT;
for(i=0; i<8; i++)
{
if ( (j*8+i+1)>= dataLen )
{
if (i<7)
{
pduData[i+j*7] = ((txtData[i+j*8]&0x7f)>>i);
i++;
}
return (i+j*7);
}
pduData[i+j*7] = ((txtData[i+j*8]&0x7f)>>i) | (txtData[j*8+i+1]<<(7-i)) ;
}
j ++;
}
}
/***********************************************************************************
函数名称:u8 hexNum2Asc( u8 num )
函数功能:将一位十六进制数转为一位ASC码
输入参数:num--16进制数(0~F)
返回值:无
返回值 :转换后的ASC码
调用函数:无
创建人 :
创建时间:2004.10.19
修改记录:
其它说明:例:0--->'0' 0x0A-->'A'
***********************************************************************************/
u8 hexNum2Asc( u8 num )
{
u8 ascval = '0';
if(num < 10)
{
ascval = num + '0';
}
else
{
if(num <= 0x0F)
{
ascval = 'A' + (num - 0x0A);
}
}
return ascval;
}
/**************************************************************
函数功能:字符串转换为字节数据
如:"C8329BFD0E01" --> {0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01}
输入参数:pSrc: 源字符串指针
pDst: 目标数据指针
nSrcLength: 源字符串长度
返回值:转换后的长度
***************************************************************/
u16 String2Bytes(const u8* pSrc, u8* pDst, u16 nSrcLength)
{
for(u16 i=0; i<nSrcLength; i+=2)
{
// 输出高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;
}
/********************************************************************************
函数名称:int bcdAscStr2Int(CONSTBYTE *pstr, u8 len)
函数功能:将指定长度BCD字符串转为整数
输入参数:pstr--字符串首地址
len--字符串长度,<=8
返回值:无
返回值 :转换结果
创建人 :
创建时间:
修改记录:
其它说明:举例 pstr: 0x31 0x32 0x33 0x34 --> 1234
*********************************************************************************/
u32 bcdAscStr2Int(uc8 *pstr, u8 len)
{
u8 i = 0;
u32 t = 0;
if (len > 8)
{
len = 8;
}
for(i = 0; i<len; i++)
{
if(*(pstr+i)<'0' || *(pstr+i)>'9')
{//非BCD码ASC字符
break;
}
t = t * 10 + asc2HexNum(*(pstr+i));
}
return t;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -