编辑代码

#include <stdio.h>
#include <stdbool.h>

#define MolPump_SetParaId   0x0001
#define MOLPUMP_SETPARA_DEFAULTS {0,false,false,false,Def_Speed,Def_Acc,Def_UdcStop}// 默认初始化参数

typedef struct
{
    unsigned int StdId;                         /*!< Specifies the standard identifier.
                                               This parameter can be a value between 0 to 0x7FF. */
    unsigned char Data[8];

} VCI_CAN_OBJ;

typedef struct
{
		unsigned int Data0;
    bool EnSystem;      //功能使能,表示使能除了电机控制外的其他功能,(1)范围(0、1) 0表示关闭电机功能,1表示启动电机功能
		bool EnDrive;       //上位机发送或接受数据“EnDrive”,整型,表示控制电机驱动开关,上位机解析逻辑是:EnDrive= Data[0] & 0B00000010  范围(0、1) 0表示关闭电机驱动,1表示开启电机驱动。
											  //备注:EnSystem 开启后才能开启EnDrive,反过来直接EnSystem设置为0,EnDrive也更新为0。
	  bool Decrease_flg;  //(3)上位机发送或接受数据“Decrease_flg”,整型,表示刹车标志,上位机解析逻辑是:Decrease_flg = Data[0] & 0B00000100范围(0、1) 0表示未刹车,1表示刹车启动
   
		float SpeedRef_krpm;    //设置参考转速   范围(0-48) 保留一位小数,初始值2.0
    float	Speed_acc_krpmps;    //设置加速度 范围(0-1)  保留二位小数,初始值0.05
	  float UdcStop;      //(6)控制器发送或接受数据“UdcStop”,表示刹车阈值电压,保留两位小数,上位机解析逻辑是:UdcStop= (Data[6] << 8 + Data[7]) * 0.01  范围(0-50),初始值50
} MOLPUMP_SETPARA_Type;    //电机设置数据

MOLPUMP_SETPARA_Type   MolPump_SetPara_TX = MOLPUMP_SETPARA_DEFAULTS;

int main () {
    VCI_CAN_OBJ sendbuf;
    sendbuf.StdId = MolPump_SetParaId;
		if(MolPump_SetPara_TX.EnSystem == false) 
		{
				sendbuf.Data[0] = 0;
				MolPump_SetPara_TX.Data0 = sendbuf.Data[0] = (MolPump_SetPara_TX.Decrease_flg << 3) | 0B00000100;
		}	
		else
		{
				MolPump_SetPara_TX.Data0 = sendbuf.Data[0] = (MolPump_SetPara_TX.EnDrive) | 0B00000001 + (MolPump_SetPara_TX.EnDrive <<2) | 0B00000010 + ((MolPump_SetPara_TX.Decrease_flg << 3) | 0B00000100);
		}
    sendbuf.Data[1] = 0;
		sendbuf.Data[2] = 0;
    sendbuf.Data[3] = (int)(MolPump_SetPara_TX.SpeedRef_krpm * 10) >> 8;
    sendbuf.Data[4] = (int)(MolPump_SetPara_TX.SpeedRef_krpm * 10) - (sendbuf.Data[3] * 256);
    sendbuf.Data[5] = (int)(MolPump_SetPara_TX.Speed_acc_krpmps * 100);
    sendbuf.Data[6] = (int)(MolPump_SetPara_TX.UdcStop * 10) >> 8;;
    sendbuf.Data[7] = (int)(MolPump_SetPara_TX.UdcStop * 10) - (sendbuf.Data[6] * 256);

    for(int i = 0;i<8;i++)
    {
        printf("0x%x",sendbuf.Data[i]);
    }

    return 0;
}