【STM32CubeMX+HAL库】串口通信接收变量(uint8转float)

本文介绍了STM32学习中的串口通信函数,如HAL_UART_Transmit和HAL_UART_Receive,以及如何使用中断和DMA模式。针对如何通过串口处理float类型数据,作者提出了利用联合体的方法,并提供了一个实例展示如何在串口中断回调函数中设置和打印float变量。此外,还提到了重写printf函数以便在单片机上使用的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以此文章,记录本人stm32的学习之路...

声明:以下方法适合初学者,大佬请划走     (/ω\)

1、串口发送/接收函数

  • HAL_UART_Transmit();串口发送数据,使用超时管理机制 
  • HAL_UART_Receive();串口接收数据,使用超时管理机制
  • HAL_UART_Transmit_IT();串口中断模式发送  
  • HAL_UART_Receive_IT();串口中断模式接收
  • HAL_UART_Transmit_DMA();串口DMA模式发送
  • HAL_UART_Transmit_DMA();串口DMA模式接收

这几个函数的参数基本都是一样的,我们挑两个讲解一下

HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size,uint32_t timeout)

功能:串口发送指定长度的数据。如果超时没发送完成,则不再发送,返回超时标志(HAL_TIMEOUT)。\n\n

参数:

  • UART_HandleTypeDef *huart      UATR的句柄    如 :   UART_HandleTypeDef huart1;   别名就是huart1  
  • *pData      需要发送的数据 
  • Size    发送的字节数
  • Timeout   最大发送时间,发送数据超过该时间退出发送   

串口中断同样重要,这里就不再赘述,具体可看: http://t.csdn.cn/FRaFG

由此可见,串口收发数据主要依靠uint8_t类型的数组等,那如何通过串口收发float类型变量呢?

我们想到,可以借助联合体。具体学习联合体通道:http://t.csdn.cn/EvNf6

我们通过一个例子来简单讲解一下联合体:

 运行

 观察到,在给联合体变量中一位成员赋值后,另一成员的值也随之确定了。

反过来再验证一遍:

 

 运行

 通俗而言,结构体变量中所有成员共用一段空间,因此成员之间的值相互影响,相互制约。

因此,我们可以通过联合体的这一特性,进行串口“收发float型变量”(同样适用于其他数据类型)

这里借用一道题目进行讲解:

 第三点,Vpp值可设定

在仅有单片机与电脑的情况下,如何实现?

typedef union float_data
{
	float v;   //需要设置的Vpp变量
	uint8_t byte[4];//定义的串口接受数组
}float_data;
float_data v_data;//联合体变量
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)  //串口中断回调
{
  if(huart->Instance==huart1.Instance)
	{
	  printf("%.2f",v_data.v);              //串口打印需设置的Vpp变量的值
	}
	HAL_UART_Receive_IT(&huart1,v_data.byte,4);
}

注意,此处printf函数需重写,不然无法打印到串口调试助手

重写方法如下

 勾选MicroLIB,否则printf函数无法使用。

int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}
int fgetc(FILE *f)
{
  uint8_t ch = 0;
  HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
  return ch;
}

重写fputc与fgetc函数

连接单片机,下载烧录,调试

 可以看到,通过发送16进制数据,实现了float类型数据的随意设置。

转换查询可参考:http://www.styb.cn/cms/ieee_754.php

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值