⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gsm_task.c

📁 GSM模块子程序
💻 C
📖 第 1 页 / 共 3 页
字号:
    
    // 将源串每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 + -