【CubeMX学习笔记】使用数据包收发float型数据

目录

一、浮点型数据接收

(一)数据包接收

1)逻辑结构

2)代码部分(以下全部放在serial.c中)

(二)对浮点型数据的处理(这里以接收三轴浮点数为例)

二、float型数据的发送

一、浮点型数据接收

(一)数据包接收

1)逻辑结构

2)代码部分(以下全部放在serial.c中)

1、先定义如下变量:

uint8_t recvData;   //接收数据缓存
uint8_t recvFlag;   //标志位

uint8_t recvPacket[128] = {0};  //存放接收的数据

2、main中调用一次开启接收中断

void USART_IT_Enable()
{
    HAL_UART_Receive_IT(&huart1, &recvData, 1);
}

3、编写回调函数

/* 中断回调函数 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    static uint8_t recvState = 0;  //状态标志位
    static uint8_t i = 0;         //存放数据的数组的下标

    //状态机
    if (0 == recvState)
    {
        if (recvData == 0xFF)
        {
            recvState = 1;
            i = 0;
        }
    }
    else if (1 == recvState)
    {
        recvPacket[i] = recvData;
        i++;

        if (i >= DATALENGTH)  //指定接收数据的长度
        {
            recvState = 2;
        }
    } 
    else if (2 == recvState)
    {
        if (recvData == 0xFE)
        {
            //到这里已经接收完成,添加对recvPacket的操作
            i = 0;
            recvState = 0;
            recvFlag = 1;    //表示接收完成
        }

    }

    HAL_UART_Receive_IT(&huart1, (uint8_t *)&recvData, 1);   //再开启接收中断
}

(二)对浮点型数据的处理(这里以接收三轴浮点数为例)

//先定义一个全局变量
float aim_x = 0, aim_y = 0, aim_z = 0;

//数据解析函数
static void Analysis_Data(uint8_t re_data[],float *x,float *y,float *z)
{
    *x = Aplice_Float(re_data,0);  //解析xyz数据
    *y = Aplice_Float(re_data,1);
    *z = Aplice_Float(re_data,2);
}

//字符拼接函数
static float Aplice_Float(uint8_t Tobe_Spliced[],int k)
{
    uint8_t byteStream[sizeof(float)] = {0};

    int added = 4*k; //用于拆分数据
    // 逐字节接收字节流
    for (int i = added; i < sizeof(float)+added; i++) {
        byteStream[i - added] = Tobe_Spliced[i];
    }

    float data;
    memcpy(&data, byteStream, sizeof(float));//转换成float型

    return data;
}

//返回三轴数据
void Get_xyz(float *x, float *y, float *z)
{
    *x = aim_x;
    *y = aim_y;
    *z = aim_z;
}

二、float型数据的发送

//串口发送函数
void bsp_USART_SendData(float floatData)
{
    HAL_UART_Transmit(&huart1,(uint8_t*)0xA5,1,0xfffff);//头部标识
    // 将 float 数据的地址强制转换为字节流的地址
    uint8_t* byteStream = (uint8_t*)&floatData;

    // 通过 USART 逐字节发送字节流
    for (int i = 0; i < sizeof(float); i++) {
        HAL_UART_Transmit(&huart1,&byteStream[i],1,0xffff);
    }
}

通过以上代码自收发,实验测试如下:

  • 19
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值