目录
防止头文件被重复包含
重新定义数据类型,防止由于各种平台和编译器的不同而产生的类型字节数差异,方便移植
得到指定地址的一个字节或字
求最大值和最小值
将一个小写字母转换为大写字母
返回数组元素的个数
字符串转十六进制
十六进制转字符串
字符串转十进制
十进制转字符串
#ifndef CONDEF_H
#define CONDEF_H
/* 头文件内容 */
#endif
typedef unsigned char boolean; /* Boolean value type. */
typedef unsigned long int uint32; /* Unsigned 32 bit value */
typedef unsigned short uint16; /* Unsigned 16 bit value */
typedef unsigned char uint8; /* Unsigned 8 bit value */
typedef signed long int int32; /* Signed 32 bit value */
typedef signed short int16; /* Signed 16 bit value */
typedef signed char int8; /* Signed 8 bit value */
#define MEM_B( x ) ( *( (byte *) (x) ) )
#define MEM_W( x ) ( *( (word *) (x) ) )
#define MAX( x, y ) ( ((x) > (y)) ? (x) : (y) )
#define MIN( x, y ) ( ((x) < (y)) ? (x) : (y) )
#define UPCASE( c ) ( ((c) >= 'a' && (c) <= 'z') ? ((c) - 0x20) : (c) )
#define ARR_SIZE( a ) ( sizeof( (a) ) / sizeof( (a[0]) ) )
void StrToHex(char *pbDest, char *pbSrc, int nLen)
{
char h1, h2;
char s1, s2;
int i;
for (i=0; i 9)
s1 -= 7;
s2 = toupper(h2) - 0x30;
if (s2 > 9)
s2 -= 7;
pbDest[i] = s1*16 + s2;
}
}
// 方式一
void HexToStr(char *pszDest, char *pbSrc, int nLen)
{
char ddl, ddh;
for (int i = 0; i < nLen; i++)
{
ddh = 48 + pbSrc[i] / 16;
ddl = 48 + pbSrc[i] % 16;
if (ddh > 57) ddh = ddh + 7;
if (ddl > 57) ddl = ddl + 7;
pszDest[i * 2] = ddh;
pszDest[i * 2 + 1] = ddl;
}
pszDest[nLen * 2] = '\0';
}
// 方式二
u16 Hex2StringArray (u8 *pSrc, u16 SrcLen, u8 *pObj)
{
u16 i=0;
for(i=0; i
// 方式一,带负号的,类似于atoi函数
// 效果:字符串:”-123” 转为 -123
int my_atoi(const char *str)
{
int value = 0;
int flag = 1; //判断符号
while (*str == ' ') //跳过字符串前面的空格
{
str++;
}
if (*str == '-') //第一个字符若是‘-’,说明可能是负数
{
flag = 0;
str++;
}
else if (*str == '+') //第一个字符若是‘+’,说明可能是正数
{
flag = 1;
str++;
}//第一个字符若不是‘+’‘-’也不是数字字符,直接返回0
else if (*str >= '9' || *str <= '0')
{
return 0;
}
//当遇到非数字字符或遇到‘\0’时,结束转化
while (*str != '\0' && *str <= '9' && *str >= '0')
{
value = value * 10 + *str - '0'; //将数字字符转为对应的整形数
str++;
}
if (flag == 0) //负数的情况
{
value = -value;
}
return value;
}
// 方式二,不带负号的。
// 效果:字符串:”123” 转为 123
void StrtoDec(uint32_t *pbDest, char *pbSrc, int nLen)
{
int i;
int tmp=0;
if(nLen > 10)
*pbDest = 0;
tmp = 1;
*pbDest = 0;
for (i=nLen-1; i>=0; i--)
{
*pbDest += tmp*(*(pbSrc+i)-'0');
tmp = tmp*10;
}
}
// 方式三,带小数点
// 效果:字符串:”123.456” 先转为 123456,然后除以1000得到123.456
//m^n函数
//返回值:m^n次方.
u32 NMEA_Pow(u8 m,u8 n)
{
u32 result=1;
while(n--)result*=m;
return result;
}
//str转换为数字,以','或者'*'结束
//buf:数字存储区
//dx:小数点位数,返回给调用函数
//返回值:转换后的数值
int NMEA_Str2num(u8 *buf,u8*dx)
{
u8 *p=buf;
u32 ires=0,fres=0;
u8 ilen=0,flen=0,i;
u8 mask=0;
int res;
while(1) //得到整数和小数的长度
{
if(*p=='-'){mask|=0X02;p++;}//是负数
if(*p==','||(*p=='*'))break;//遇到结束了
if(*p=='.'){mask|=0X01;p++;}//遇到小数点了
else if(*p>'9'||(*p<'0')) //有非法字符
{
ilen=0;
flen=0;
break;
}
if(mask&0X01)flen++;
else ilen++;
p++;
}
if(mask&0X02)buf++; //去掉负号
for(i=0;i5)flen=5; //最多取5位小数
*dx=flen; //小数点位数
for(i=0;i
如果是单个十进制转字符串,使用sprintf函数即可。
如果是十进制数组:
u16 DectoStr (u8 *pSrc, u16 SrcLen, u8 *pObj)
{
u16 i=0;
for(i=0; i