/**
******************************************************************************
* 文件名程: CZF算法库-进制转换-校验.c
* 作 者: CZF2394146329
* 版 本: V2.0
* 编写日期: 2019-01-16
* 功能说明:
1、求解insertion得n次方(c库里有)
2、8421BCD码转十进制数
3、float转8421BCD码
4、遥控器接收机占空比的解算
5、遥控器接收机占空比的解算
6、
7、
8、
9、
******************************************************************************
* 注意:
******************************************************************************
**/
/************************ Function Definition *****************************
* 函数功能:求解insertion得n次方
* 输入参数:int insertion, int n
* 返 回 值:insertion得n次方
* 说 明:
********************************************************************************/
int power (int insertion, int n);
int power (int insertion, int n)
{
int result = 1;
while (n > 0)
{
result = result * insertion;
n--;
}
return result;
}
/************************** 函数定义********************************************
* 函数功能:8421BCD码转十进制数
* 输入参数:uint8_t data
* 返 回 值:uint8_t的十进制正整数
* 说 明:
********************************************************************************/
uint8_t BCDtoHEX(uint8_t data);
uint8_t BCDtoHEX(uint8_t data)
{
uint8_t temp;
temp = ((data>>4)*10 + (data&0x0f));
return temp;
}
/************************** 函数定义********************************************
* 函数功能:float转8421BCD码
* 输入参数:float data
* 返 回 值:-9999到+9999的8421BCD码: 0s XX XX 3个字节;s=0 表示正;s=1表示负
* 说 明:举例
********************************************************************************/
uint8_t BackRealtimeVelocity[3]={0x00,0x00,0x00};
void float_to_BCD(float data);
void float_to_BCD(float data)
{
uint8_t temp[4]={0x00};
float fTempData;
fTempData=data;
if (fTempData < 0)
{
BackRealtimeVelocity[0]=0x01;
fTempData=fabs(fTempData);
temp[0]=(uint8_t)(fTempData*0.0001);
temp[1]=(uint8_t)(fTempData*0.001);
temp[2]=(uint8_t)(fTempData*0.01);
temp[3]=(uint8_t)(fTempData*0.1);
BackRealtimeVelocity[1]=
TempRatio[m]=BCDtoHEX(Temp[m][1]&0x0f)*100+BCDtoHEX(Temp[m][2])+BCDtoHEX(Temp[m][3])*0.01;
}
temp = ((data>>4)*10 + (data&0x0f));
return temp;
}
/************************** 函数定义********************************************
* 函数功能:遥控器接收机占空比的解算
* 输入参数:&gSerialUSART1
* 返 回 值:
* 说 明:调用方式ReadReceiverRatio(&gSerialUSART1);
接收机8个通道的占空比是按照XX.YY存储;表明0.XXYY
********************************************************************************/
void ReadReceiverRatio(struct SerialIFDef *gUSART)
{
uint8_t Temp[10][7];//临时存储遥控器控制数据包指令
uint8_t TempBite[10][5];//临时存储数据包解算时的低4位和高4位
float TempRatio[10];//本函数中解算使用,用来临时记录遥控器接收机8个通道的占空比
if((gUSART->RxBuffer[0]==0x1A)&&(gUSART->RxBuffer[37]==0x5F))//表明包头和包尾正确,接收数据包完整,指令格式合格
{
//if(gUSART->RxBuffer[36]==0x01)//校验和未写
if((gUSART->RxBuffer[1]==0x33)&&(gUSART->RxBuffer[2]==0x35)&&(gUSART->RxBuffer[3]==0x01))//解算每个通道的占空比速度
{
for(int i = 7; i>=0; i--)
{
for(int j = 3; j>=0; i--)
{
Temp[i][j]=gUSART->RxBuffer[4+i*4+j+];//数据域中的每个字节提取出来另外存储
}
}
for(int m = 7; m>=0; m--)
{
if( ( (int)(Temp[m][0]>>4) )==i )//判断确实是属于第m个通道的占空比
{
TempRatio[m]=BCDtoHEX(Temp[m][1]&0xf0)*100+BCDtoHEX(Temp[m][2])+BCDtoHEX(Temp[m][3])*0.01;
if((Temp[m][1]>>4)==0x01)//符号位判断符号正负,0x00为正,0x01为负
{TempRatio[m]=-TempRatio[m];}
ReceiverRatio[m]=TempRatio[m];//解算好的占空比赋值到全局变量中去
}
}
}
}
}
/************************** 函数定义********************************************
* 函数功能:遥控器接收机占空比的解算
* 输入参数:&gSerialUSART1
* 返 回 值:
* 说 明:调用方式ReadReceiverRatio(&gSerialUSART1);
接收机8个通道的占空比是按照XX.YY存储;表明0.XXYY
********************************************************************************/
void UARTUnpackage(struct SerialIFDef *tpUSARTPtr)
{
uint8_t *tpRxdPtr;//定义一个临时的
uint8_t tLength;
uint8_t tPWMCnter = 0;
uint16_t tSum = 0;
uint8_t tBCDABC_AB, tBCDABC_C;
float tTempABC_AB, tTempABC_C, tTempABC_S;
tpRxdPtr = tpUSARTPtr->RxBuffer;
tLength = tpUSARTPtr->RxBufferCnter;
if(tpRxdPtr[0] != 0x1A) //Port number;标识符
{
return;
}
//if((tpRxdPtr[1] + 1) != tLength) //Package length;
//{
// return;
//}
if(tpRxdPtr[2] != 0x01) //From which controller;地址码
{
return;
}
for(uint8_t tCnter = 1; tCnter < (tLength - 1); tCnter++)
{
tSum += tpRxdPtr[tCnter];
}//校验和
if(tpRxdPtr[tLength - 1] != (tSum & 0xFF)) //Sum
{
return;
}
if(tpRxdPtr[0x03] == 0x01) //Function code:0x01;
{
for(uint8_t tCnter = 0x04; tCnter < tLength; NULL)
{
tPWMCnter = tpRxdPtr[tCnter++] - 1; //Motor number;
if(tpRxdPtr[tCnter++] == 0x00)
{
tTempABC_S = 1.0F;
}
else
{
tTempABC_S = -1.0F;
}
tBCDABC_AB = tpRxdPtr[tCnter++];
tBCDABC_C = tpRxdPtr[tCnter++];
tTempABC_AB = 10.0F * (tBCDABC_AB >> 0x04) + (tBCDABC_AB & 0x0F);
tTempABC_C = 0.1F * (tBCDABC_C >> 0x04);
gReceiverRatio[tPWMCnter] = tTempABC_S * (tTempABC_AB + tTempABC_C);
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
CZF算法库-进制转换-校验.rar_校验_进制转换
共1个文件
c:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 158 浏览量
2022-09-23
04:24:26
上传
评论
收藏 2KB RAR 举报
温馨提示
BCD转十进制;十进制转BCD;CRC校验;XOR校验 的算法实现;
资源推荐
资源详情
资源评论
收起资源包目录
CZF算法库-进制转换-校验.rar (1个子文件)
CZF算法库-进制转换-校验.c 6KB
共 1 条
- 1
资源评论
周楷雯
- 粉丝: 78
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功