用可变参数,实现对各种协议函数的打包操作,实现代码简单,便捷配置
基本函数
// 任意参数输入模型 /* 输入 输出缓冲区 参数个数 参数列表 地址1/数值0 位宽 地址/数值 0,1,3, 1,2,&a, 1, */ //第一个参数定义可变参数个数,用于循环获取变参内容 int MakeBufOut_FromListData(u8* pdatabuf,int dwArgNum, ...) { int Ret = 0;
int bufLenth = 0;
va_list pArgs = NULL;
va_start(pArgs, dwArgNum);
int dwArgIdx;
for(dwArgIdx = 1; dwArgIdx <= dwArgNum; dwArgIdx++){
int dwArg_type = va_arg(pArgs, int);
int dwArg_len = va_arg(pArgs, int);
u32 dwArg_AV = va_arg(pArgs, int);
if(dwArg_len==0)
{
Ret = -3; //格式错误
break;
}
if(dwArg_type==0)
{
if(1 == dwArg_len)
{
*(u8*)(pdatabuf+bufLenth) = dwArg_AV;
bufLenth+=1;
}
else if(2 == dwArg_len)
{
*(u16*)(pdatabuf+bufLenth) = dwArg_AV;
bufLenth+=2;
}
else if(4 == dwArg_len)
{
*(u32*)(pdatabuf+bufLenth) = dwArg_AV;
bufLenth+=4;
}
else
{
Ret = -2; //格式错误
break;
}
}
else if(dwArg_type ==1)
{
if(dwArg_AV)
{
memcpy( pdatabuf+bufLenth, (u8*)dwArg_AV,dwArg_len);
bufLenth += dwArg_len;
}
else
{
Ret = -4; //格式错误
break;
}
}
else
{
Ret = -1; //格式错误
break;
}
}
va_end(pArgs);
if(Ret==0)
{
return bufLenth;
}
else
{
return Ret;
}
}
函数应用例子:
u8 buf[1024]; char bufA[] = "abcdefghijk"; MakeBufOut_FromListData(buf,6, 0,1,0xAA, 0,2,0xFEFE, 0,4,0x123456, 1,3,bufA+1, 1,5,bufA, 1,8,bufA+3 );
存在的问题:
1,由于可变参数无法控制参数输出少了会怎么样,所以可能有写参数少了或者格式不对的风险
2,数据类型,按照数据赋值的次序写入,先低字节,再高字节
3,缓冲区类型,按照buf赋值写入,先高字节,再低字节