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
|
|