基于2143规则编码的uint8_t如何转换成float

       2143格式存储的float类型数据在解码时,需要将1和2互换,3和4互换,然后
通过数组转float,进行转换

uint8_t data[] = {0x72, 0x02, 0xc8, 0x42}; // 字节数组

float bytesToFloat(uint8_t data[]) {

    uint32_t x;

    memcpy(&x, data, sizeof(x)); // 将字节数组复制到 uint32_t

    return *(float*)&x; // 解释为 float

}

float y = bytesToFloat(data); // 转换为浮点数

printf("y = %2.7f\n", y); // 输出结果

y = 100.0047760

所以,数值为{0x72, 0x02, 0xc8, 0x42}的对应float值为 100.0047760

#include "square_wave_transmitter.h" #include <math.h> #include <string.h> // 全局变量 static DAC_HandleTypeDef *tx_dac = NULL; static TIM_HandleTypeDef *tx_tim = NULL; static uint16_t dac_buffer[TX_BUFFER_SIZE]; static uint8_t tx_data[TX_FRAME_LEN]; static uint8_t tx_bit_index = 0; // 当前比特在字节中的位置(0-7) static uint8_t tx_byte_index = 0; // 当前字节在帧中的位置 static uint16_t sample_counter = 0; // 当前比特内的样本计数 static uint8_t current_bit = 0; // 当前传输的比特 volatile uint8_t tx_complete = 1; // 传输完成标志 // 曼彻斯特编码 (IEEE 802.3标准) // 0 = 低->高跳变, 1 = 高->低跳变 #define MANCHESTER_0 LOW_LEVEL, HIGH_LEVEL #define MANCHESTER_1 HIGH_LEVEL, LOW_LEVEL void SquareWave_Tx_Init(DAC_HandleTypeDef *hdac, TIM_HandleTypeDef *htim) { tx_dac = hdac; tx_tim = htim; // 启动定时器和DAC HAL_TIM_Base_Start(tx_tim); HAL_DAC_Start_DMA(tx_dac, DAC_CHANNEL_1, (uint32_t*)dac_buffer, TX_BUFFER_SIZE, DAC_ALIGN_12B_R); } // 数据打包函数 static void PackData(float temperature) { // 温度范围: -55°C ~ +125°C (符合DS18B20范围) uint16_t scaled_temp = (uint16_t)((temperature + 55.0f) * 100.0f); tx_data[0] = PREAMBLE; // 前导码字节1 tx_data[1] = PREAMBLE; // 前导码字节2 tx_data[2] = scaled_temp >> 8; // 温度高字节 tx_data[3] = scaled_temp & 0xFF; // 温度低字节 tx_data[4] = tx_data[2] ^ tx_data[3]; // 异或校验 tx_data[5] = POSTAMBLE; // 结束符字节1 tx_data[6] = POSTAMBLE; // 结束符字节2 } // 获取下一比特 (使用曼彻斯特编码) static uint8_t GetNextManchesterBit(void) { static uint8_t manchester_phase = 0; // 曼彻斯特编码相位 (0或1) uint8_t bit_value; if (manchester_phase == 0) { // 曼彻斯特前半周期 bit_value = (tx_data[tx_byte_index] >> (7 - tx_bit_index)) & 0x01; manchester_phase = 1; } else { // 曼彻斯特后半周期 bit_value = !((tx_data[tx_byte_index] >> (7 - tx_bit_index)) & 0x01); manchester_phase = 0; // 移动到下一比特 tx_bit_index++; if (tx_bit_index >= 8) { tx_bit_index = 0; tx_byte_index++; } } return bit_value; } void SquareWave_Tx_Start(float temperature) { if (!tx_complete) return; // 上一次传输未完成 PackData(temperature); // 重置传输状态 tx_byte_index = 0; tx_bit_index = 0; sample_counter = 0; tx_complete = 0; // 获取第一个比特 current_bit = GetNextManchesterBit(); } void SquareWave_Tx_DMACompleteCallback(DAC_HandleTypeDef *hdac) { if (hdac != tx_dac) return; for (int i = 0; i < TX_BUFFER_SIZE; i++) { if (!tx_complete) { // 根据当前比特设置电平 dac_buffer[i] = current_bit ? HIGH_LEVEL : LOW_LEVEL; // 更新时间计数器 if (++sample_counter >= (SAMPLES_PER_BIT / 2)) { sample_counter = 0; // 获取下一比特 (曼彻斯特编码) current_bit = GetNextManchesterBit(); // 检查传输是否完成 if (tx_byte_index >= TX_FRAME_LEN) { tx_complete = 1; } } } else { // 传输完成,输出空闲电平 dac_buffer[i] = IDLE_LEVEL; } } } #ifndef __SQUARE_WAVE_TRANSMITTER_H #define __SQUARE_WAVE_TRANSMITTER_H #include "stm32f4xx_hal.h" // 传输参数 #define TX_SAMPLE_RATE 50000 // DAC采样率50kHz #define TX_BIT_RATE 1200 // 数据速率1200bps #define TX_BUFFER_SIZE 512 // DMA缓冲区大小 #define TX_FRAME_LEN 7 // 数据帧长度(字节) #define SAMPLES_PER_BIT (TX_SAMPLE_RATE / TX_BIT_RATE) // 电平定义 #define HIGH_LEVEL 4095 // DAC高电平(3.3V) #define LOW_LEVEL 0 // DAC低电平(0V) #define IDLE_LEVEL 2048 // 空闲电平 // 帧结构 #define PREAMBLE 0xAA // 前导码 #define POSTAMBLE 0x55 // 结束符 extern volatile uint8_t tx_complete; void SquareWave_Tx_Init(DAC_HandleTypeDef *hdac, TIM_HandleTypeDef *htim); void SquareWave_Tx_Start(float temperature); void SquareWave_Tx_DMACompleteCallback(DAC_HandleTypeDef *hdac); #endif 没有输出波,DAC的采样率是100Khz
07-11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值