[经验分享] 单片机中不同数据类型转换处理以及如何快速添加报警代码

[复制链接]
182|3
八层楼 发表于 2026-2-5 17:15 | 显示全部楼层 |阅读模式
1.单片机中不同数据类型转换处理
#include "type_util.h"

//变量定义
TYPECONVERT TypeConverter;
BITSET                        BitSetter;


/*------------------------------------------------------------------
>>        Summary        :u8转换为u8
>>        Input        :       
>>        Return        :
------------------------------------------------------------------*/
void TYPU_u82u8(uint8_t *pU8Value, uint8_t * pU8ValueGoal ,uint16_t length)
{
        uint16_t i;
        for(i=0;i<length;i++)
        {
                pU8ValueGoal[i] = pU8Value[i];
        }
}


/*------------------------------------------------------------------
>>        Summary        :u8转换为u16
>>        Input        :       
>>        Return        :
------------------------------------------------------------------*/
void TYPU_u82u16(uint8_t *pU8Value, uint16_t * pU16Value ,uint16_t length)
{
        uint16_t i;
        for(i=0;i<length;i++)
        {
                pU16Value[i] = (uint16_t)pU8Value[i];
        }
}


/*------------------------------------------------------------------
>>        Summary        :u16转换为u8
>>        Input        :       
>>        Return        :
------------------------------------------------------------------*/
void TYPU_u162u8(uint16_t * pU16Value  ,uint8_t *pU8Value, uint16_t length)
{
        uint16_t i;
        for(i=0;i<length;i++)
        {
                pU8Value[i] = (uint8_t)pU16Value[i];
        }
}


/*------------------------------------------------------------------
>>        Summary        :float转换为ulong
>>        Input        :       
>>        Return        :
------------------------------------------------------------------*/
void TYPU_Float2ulong(uint32_t *pUValue, float fValue)
{
    memset(TypeConverter.byteData, 0, 4);

    TypeConverter.floatData = fValue;
    *pUValue = TypeConverter.ulongData;
}


/*------------------------------------------------------------------
>>        Summary        :ulong转换为float
>>        Input        :       
>>        Return        :
------------------------------------------------------------------*/
void TYPU_Ulong2float(float *pFValue, uint32_t uValue)
{
    memset(TypeConverter.byteData, 0, 4);

    TypeConverter.ulongData = uValue;
    *pFValue = TypeConverter.floatData;
}


/*------------------------------------------------------------------
>>        Summary        :float转换为bytes            
>>        Input        :pData必须指向至少包含4个BYTE的数组       
>>        Return        :
------------------------------------------------------------------*/
void TYPU_Float2bytes(uint8_t *pData, float fValue)
{
    memset(TypeConverter.byteData, 0, 4);

    TypeConverter.floatData = fValue;

    pData[0] = TypeConverter.byteData[3];
    pData[1] = TypeConverter.byteData[2];
    pData[2] = TypeConverter.byteData[1];
    pData[3] = TypeConverter.byteData[0];
}


/*------------------------------------------------------------------
>>        Summary        :bytes转换为float            
>>        Input        :pData必须指向至少包含4个BYTE的数组       
>>        Return        :
------------------------------------------------------------------*/
void TYPU_Bytes2float(float *pFValue, uint8_t *pData)
{
    memset(TypeConverter.byteData, 0, 4);

    TypeConverter.byteData[0] = pData[3];
    TypeConverter.byteData[1] = pData[2];
    TypeConverter.byteData[2] = pData[1];
    TypeConverter.byteData[3] = pData[0];

    *pFValue = TypeConverter.floatData;
}

/*------------------------------------------------------------------
>>        Summary        :输入float是否是非数
>>        Input        :
>>        Return        :
------------------------------------------------------------------*/
bool TYPU_FloatIsNaN(float* pValue)
{
  return (bool)(*(uint32_t*)pValue == 0xFFFFFFFF);
}






/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __TYPE_UTIL_H
#define __TYPE_UTIL_H
//#include "type_util.h"
#include <string.h>
#include <stdbool.h>
#include "main.h"

//类型转换
typedef union
{
        uint8_t                byteData[4];
        uint16_t        uintData[2];
        uint32_t        ulongData;
        float        floatData;
}TYPECONVERT;

//位设置
typedef union
{
    uint8_t byte;

    struct{
    uint8_t bit0       :1;                                    
    uint8_t bit1       :1;                                    
    uint8_t bit2       :1;                                      
    uint8_t bit3       :1;                                    
    uint8_t bit4       :1;                                    
    uint8_t bit5       :1;                                      
    uint8_t bit6       :1;                                      
    uint8_t bit7       :1;                                       
    }bit;
}BITSET;

/* Exported variables --------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
void TYPU_u82u8(uint8_t *pU8Value, uint8_t * pU8ValueGoal ,uint16_t length);
void TYPU_u82u16(uint8_t *pU8Value, uint16_t * pU16Value ,uint16_t length);
void TYPU_u162u8(uint16_t * pU16Value  ,uint8_t *pU8Value, uint16_t length);
void TYPU_Float2ulong(uint32_t *pUValue, float fValue);
void TYPU_Ulong2float(float *pFValue, uint32_t uValue);
void TYPU_Float2bytes(uint8_t *pData, float fValue);
void TYPU_Bytes2float(float *pFValue, uint8_t *pData);
bool TYPU_FloatIsNaN(float* pValue);

#endif



2.如何快速添加报警代码
#include "alarm_util.h"

uint8_t                curAlarm[ALARM_MAX_NUMBER];                        //Device current alarm cache
uint8_t                curAlarmCounter = 0;                                //Device current alarm count

/*------------------------------------------------------------------
>>        Summary        :Init alarm data
>>        Input        :       
>>        Return        :
------------------------------------------------------------------*/
void ALAM_Init(void)
{
        ALAM_DeleteAllAlarm();
}


/*------------------------------------------------------------------
>>        Summary        :Add alarm code, Arrange in ascending order of values
>>        Input        :       
>>        Return        :
------------------------------------------------------------------*/
void ALAM_AddAlarm(uint8_t alarmCode)
{
        uint8_t i=0, temp;   
       
        //If the alarm has existed, can't add.
        for(i = 0; i < curAlarmCounter; i++)
        {
                if(curAlarm[i] == alarmCode)
                {
                        return;
                }
        }
       
        //Insert alarm code.
        if(curAlarmCounter <= 0)
        {
                curAlarmCounter = 0;
        }
        else if(curAlarmCounter >= ALARM_MAX_NUMBER)
        {
                curAlarmCounter = ALARM_MAX_NUMBER - 1;
        }
       
        curAlarm[curAlarmCounter++] = alarmCode;
       
}


/*------------------------------------------------------------------
>>        Summary        :Delete the alarm
>>        Input        :       
>>        Return        :
------------------------------------------------------------------*/
void ALAM_DeleteAlarm(uint8_t alarmCode)
{
        uint8_t i = 0 , j = 0 ;
       
        for(i = 0; i < curAlarmCounter; i++)
        {
                //循环读取报警码缓存数组判断删除报警码是否存在,存在则执行删除操作
                if(curAlarm[i] == alarmCode)
                {
                        for(j = 0; j < (curAlarmCounter - 1 - i); j++)
                        {
                                //删除该位报警码,后面的报警码依次前移覆盖原先地址报警码
                                curAlarm[i+j] = curAlarm[i+1+j];   
                        }
                       
                        curAlarm[--curAlarmCounter] = 0x0;
                        if(curAlarmCounter == 0)
                        {
                                //做一些紧急的处理
                //完成后可以做灯光提示
                        }
                        return;
                }
        }
}


/*------------------------------------------------------------------
>>        Summary        :Delete all alarm
>>        Input        :       
>>        Return        :
------------------------------------------------------------------*/
void ALAM_DeleteAllAlarm(void)
{
        uint8_t i = 0;
       
        curAlarmCounter = 0;
       
        for(i = 0; i < ALARM_MAX_NUMBER; i++)
        {
                curAlarm[i] = 0x0;
        }
    //完成后可以做灯光提示
}

/*------------------------------------------------------------------
>>        Summary        :Get all existed alarms
>>        Input        :       
>>        Return        :
------------------------------------------------------------------*/
void ALAM_GetAllAlarms(uint8_t* pAlarms, uint8_t alarmsMaxLen)
{
        uint8_t i = 0;
        uint8_t len = curAlarmCounter;
       
        //目前报警码个数是否超过预存缓存长度,超过则按预存长度重新赋值
        if(curAlarmCounter > alarmsMaxLen)
        {
                len = alarmsMaxLen;
        }
        //将已存报警码赋值给新预缓存数组
        for(i = 0; i < len; i++)
        {
                pAlarms[i] = curAlarm[i];
        }
}


/*------------------------------------------------------------------
>>        Summary        :查询当前报警码   
>>        Input          :
>>        Output        :
------------------------------------------------------------------*/
bool ALAM_InquireAlarmCode(uint8_t alarmCode)
{
        uint8_t i;
       
        for(i = 0; i < curAlarmCounter; i++)      //循环读取报警码缓存数组判断查询的报警码是否存在
        {
                if(curAlarm[i] == alarmCode)
                {
                        return true;                   //当前报警码存在则返回1
                }
        }
        return false;                      //当前报警码不存在则返回0
}


/*------------------------------------------------------------------
>>        Summary        : 获取当前报警代码
>>        Input        :       
>>        Return        :
------------------------------------------------------------------*/
//void ALAU_GetCurAlarmCode(uint8_t *pAlaCodes, uint16_t *len)
//{
//  uint8_t i, j;
//  
//  j=0;
//  for(i=0; i < CUR_ALARM_NUM; i++)
//  {
//    if(CurAlarmCode[i] != ALA_Null)
//      pAlaCodes[j++] = CurAlarmCode[i];
//  }
//  
//  *len = (u16)j;
//}




#ifndef __ALARM_UTIL_H
#define __ALARM_UTIL_H
#include "main.h"
#include <stdbool.h>


#define ALARM_MAX_NUMBER 30 //Alarm array max length

extern uint8_t curAlarmCounter;


void ALAM_Init(void);
void ALAM_AddAlarm(uint8_t alarmCode);
void ALAM_DeleteAlarm(uint8_t alarmCode);
void ALAM_DeleteAllAlarm(void);
void ALAM_GetAllAlarms(uint8_t* pAlarms, uint8_t alarmsMaxLen);
bool ALAM_InquireAlarmCode(uint8_t alarmCode);

#endif



————————————————
版权声明:本文为CSDN博主「掀开月亮的白纱裙78」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_63947198/article/details/154640393

tpgf 发表于 2026-2-14 14:37 | 显示全部楼层
单片机中数据类型转换的核心目标是:在有限的存储资源下,确保数据精度不丢失、运算结果正确,同时避免因溢出或隐式转换导致的逻辑错误
暖茶轻语 发表于 2026-3-4 20:55 | 显示全部楼层
关于数据类型转换,代码中使用了联合体(union)来实现不同数据类型之间的转换,这是一种非常高效的方法。
zhuotuzi 发表于 2026-4-15 13:14 | 显示全部楼层
单片机核心就几类数据:char/unsigned char、int、float、uint16_t、uint32_t,转换分强制转换和运算转换。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

181

主题

4561

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部
0