Uint32 u32mmk = 123;
float32 f32mmk = 123.123;
//定义指针数组,数组元素是地址,地址指向浮点型数据
//指针数组前面的Uint32的意思是,不管数组元素指向的内容是什么数据类型,都把他解释成Uint32类型
//但是某个数据到底是什么数据类型,要和上位机约定好,上位机读取出来的数据只是二进制数,需要把他解释成对应的数据类型。
//每个大类存储20个参数,考虑到太多参数会占用太多的flash空间,暂定20个
volatile Uint32 *u32pParaGrp1[20] = {
/*1*/ (Uint32 *)&u32mmk, //
//&f32mmk取这个浮点数的地址,(Uint32 *)将这个指针指向的内容解读成Uint32
/*2*/ (Uint32 *)&f32mmk, //这个参数在上位机解释的时候,需要用浮点型数据装
/*3*/ (Uint32 *)0, //如果要上传或者更改某个参数值,那么直接把这个变量的地址放在这里就行
/*4*/
/*5*/
/*6*/
/*7*/
/*8*/
/*9*/
/*10*/
/*11*/
/*12*/
/*13*/
/*14*/
/*15*/
/*16*/
/*17*/
/*18*/
/*19*/
/*20*/
};
volatile float32 f32data1 = 0.0;
volatile Uint32 u32data1 = 0;
volatile int32 i32data1 = 0;
float32 f32mmmk = 123.123f;
//u32pParaGrp1[]是个Uint32指针数组,所以每个元素指向的内容被识别成Uint32类型的,但是u32pParaGrp1[1]这个元素初始化的时候,
//存放了一个浮点数的地址,要想存进去不报错,就要强制把这个指针转化为指向Uint32类型的指针
//即如此转换: (Uint32 *)&f32mmk,
//所以此时再取u32pParaGrp1[1]这个指针的内容,就是把这个浮点数的二进制码,解读成Uint32,
u32data1 = *(u32pParaGrp1[1]);
//把这个地址里面的二进制代码,解读成浮点数,因为本来就是个浮点数
//(float32 *) 这是指针数据类型强制转换,表明要把其后面的地址指向的内容解读成浮点型,
//(float32 *)(u32pParaGrp1[1]) ,不管这个指针指向的地址原来存入的是什么数据类型,现在要取出来这个存入的数据,且把他解读成float
f32data1 = *( (float32 *)(u32pParaGrp1[1]) );
//所以u32data1、f32data1的二进制码是一样的,都是对原始存入的哪个浮点数的不同数据类型的解读。
下载后验证:
上位机把所有的数据都按照浮点型解析,但是下位机上传的数据可能是float u16,u32等。
例如要上传ADC寄存器的值:
//60-79
//能够上传20个U16
//数组的元素是地址,地址指向的内容只能写u16
//上位机解析都是先找浮点数解析的,所以在上传之前,要转换为浮点数。在发送的位置转换
volatile Uint16 *u16pParaDisplay4[PARA_GROUP_MAXNUM] =
{
//&AdcResult.ADCRESULT0 取寄存器0的地址,星号表示把这个32位数转换为地址,Uint16表示这个地址里面的内容为u16
/*0*/ (Uint16 *)&AdcResult.ADCRESULT0, //这个数组指针把任何类型的变量的二进制码都识别成Uint32,
/*1*/ (Uint16 *)&AdcResult.ADCRESULT1,
/*2*/ (Uint16 *)&AdcResult.ADCRESULT2, //直流输出电压(VDCout), 暂时没有,用上面的占位
/*3*/ (Uint16 *)&AdcResult.ADCRESULT3, //直流输出电流(IDCout), 暂时没有,用上面的占位
/*4*/ (Uint16 *)&AdcResult.ADCRESULT4, //实际温度电压(VolTD)
/*5*/ (Uint16 *)&AdcResult.ADCRESULT5, //DSP温度(TempraDSP)
/*7*/ (Uint16 *)&AdcResult.ADCRESULT6,
/*8*/ (Uint16 *)&AdcResult.ADCRESULT7, //温度环输出(TemprPIDout)
/*9*/ (Uint16 *)&AdcResult.ADCRESULT8, //功率环输出(PowerPIDout)
/*10*/ (Uint16 *)&AdcResult.ADCRESULT9, //限流环输出(CurLoopPIDout) 暂时没有,用上面的占位
/*11*/ (Uint16 *)&AdcResult.ADCRESULT10, //电压环输出(VolLoopPIDout) 暂时没有,用上面的占位
/*12*/ (Uint16 *)&AdcResult.ADCRESULT11,
/*13*/ (Uint16 *)&AdcResult.ADCRESULT12,
/*14*/ (Uint16 *)&AdcResult.ADCRESULT13,
/*15*/ (Uint16 *)&AdcResult.ADCRESULT14,
/*16*/ (Uint16 *)&AdcResult.ADCRESULT15,
/*17*/ (Uint16 *)&sCpu2ClaVal.u16HallGpio,
}
如上定义,然后在传送的时候
else if((u16Addr>=60)&&(u16Addr<=79))
{
//unDataTypeChg.f32Data = (float)( ( *(u16pParaDisplay4[u16Addr-60]) ) & (0xFFFF) ); //一个32bit的二进制码
//发送之前要转成浮点型,因为上位机都是按照浮点数解析的
//先取出这个u16数,然后强制转换成浮点数,例如4095,转换成4095.0
//按照浮点型存入,发送的时候,都要按照无符号数发送,所以按照字节取出
unDataTypeChg.f32Data = (float) *(u16pParaDisplay4[u16Addr-60]);
CommMsg->u16SendData[0] = (unDataTypeChg.byte.BYTE3); //取高16位的高8位
CommMsg->u16SendData[1] = (unDataTypeChg.byte.BYTE2); //取高16位的高8位
CommMsg->u16SendData[2] = (unDataTypeChg.byte.BYTE1); //取低16位的高8位
CommMsg->u16SendData[3] = (unDataTypeChg.byte.BYTE0); //取低16位的低8位
CommMsg->u16SendDataLen = 4;
}