通过串口发送结构体的三种方式


tips:本例子使用串口先发送低字节

1、使用联合体

typedef union {
    float f;
    int8_t c[4];
}FLOAT2INT32;

FLOAT2INT32 float2int32;

for(i = 0 ; i < 4 ; i++){
    data[byteNum++] = float2int32.c[j];
}

2、使用memcopy

uint8_t tempArr[4] = {};
memcpy((void *)&cmu_state, tempArr, 4); //cmu_state占用4字节
for(i = 0 ; i < 4 ; i++){
    data[byteNum++] = tempArr[i];
}

3、直接位操作

//16位year
data[byteNum++] = CMU_selfTest.year; //截取?
data[byteNum++] = CMU_selfTest.year>>8;

1、使用联合体复制


u8 imuDataBuf[33];
uint8_t tempdataHH,tempdataH,tempdataL,tempdataLL;
for( i = 1 ; i < 33 ; i ++){
    imuDataBuf[i] = SPI1_ReadWriteByte(0x00);
    delay_ms(READ_DELAY_MS);
}
for( i = 0 ; i  <  3 ; i++){ //arm小端模式,低在低 //且传输协议高字节先发
    tempdataH = imuDataBuf[index++];
    if(tempdataH && 0x80 != 0x00){ //最高位为符号位 此处注意:有符号整形传输时候,注意负数前面全部为1
        tempdataHH = 0xFF;
    }else{
        tempdataHH = 0x00;
    }
    tempdataL = imuDataBuf[index++];
    tempdataLL = imuDataBuf[index++];
    temp = ( (tempdataHH << 24) | (tempdataH << 16) | (tempdataL << 8) | tempdataLL ) ;
    imu_frame.phyGyroData[i] = temp / LSB_AfterTEM_Gyro[0];//浮点数传输标度
}

2、按位操作

uint16_t tempdataH,tempdataL;

tempdataL=SPI1_ReadWriteByte(0X00);
tempdataH=SPI1_ReadWriteByte(0X00);
mems_value[6]=(tempdataH<<8)|(tempdataL);
uint32_t tempdataHH,tempdataH,tempdataL,tempdataLL;

//采集P
tempdataLL=SPI1_ReadWriteByte(0X00);
tempdataL=SPI1_ReadWriteByte(0X00);
tempdataH=SPI1_ReadWriteByte(0X00);
tempdataHH=SPI1_ReadWriteByte(0X00);
sensor_data.P=(tempdataHH<<24)|(tempdataH<<16)|(tempdataL<<8)|(tempdataLL);

2、以量程操作

delay_us(READ_DELAY_US);
nsa_data.Cal_Tdata[0]=SPI1_ReadWriteByte(0X00);//0x08
delay_us(READ_DELAY_US);
nsa_data.Cal_Tdata[1]=SPI1_ReadWriteByte(0X00);//0x07
delay_us(READ_DELAY_US);
nsa_data.Cal_Tdata[2]=SPI1_ReadWriteByte(0X00);//0x06

nsa_data.Cal_PData = (nsa_data.Cal_Pdata[2] * 65536 + nsa_data.Cal_Pdata[1] * 256 + nsa_data.Cal_Pdata[0]);
nsa_data.Cal_TData = (nsa_data.Cal_Tdata[2] * 65536 + nsa_data.Cal_Tdata[1] * 256 + nsa_data.Cal_Tdata[0]);
//16777216是23位精度无符号的最大值,浮点的最高位也是符号位,即24位是符号位,这样可以判断是正负,然后再转化成相应的比例
if(nsa_data.Cal_PData > 8388608) {	nsa_data.Cal_PData = (nsa_data.Cal_PData - 16777216)/ 8388608; }
else { nsa_data.Cal_PData = nsa_data.Cal_PData / 8388608; }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值