STM32 串口输出备忘 发送/接收 浮点数

本例使用DMA模式 

一、USART 发送字串:
#include "main.h"
//
#include "string.h"
#include "stdio.h"
#include "stdlib.h"
#include "gpio.h"

//
char str[256] = {"bi1rfk"};                   //自定义字串
uint8_t Tx_buff[256] = {0};                   //UART Tx缓冲           


void main(void)
{
	
	     //格式化字串,利用sprintf()函数, 需包换头文件 string.h
	     sprintf(Tx_buff, "my callsign is: %s\n", str); 	
	     
	     //HAL串口输出
         HAL_UART_Transmit_DMA(&huart1, Tx_buff , sizeof(Tx_buff)); 
	
	
}

-----------------------------------------
运行结果:my callsign is: bi1rfk
二、USART 发送浮点数 
#include "main.h"
//
#include "string.h"
#include "stdio.h"
#include "stdlib.h"
#include "gpio.h"

//
uint8_t Tx_buff[256] = {0};                  //UART Tx缓冲
float pi = 3.141592                          //圆周率PI


void main(void)
{
	
	     //将浮点数PI转换为字符串,然后按字串方法发送
	     sprintf((char*)Tx_buff, "%f", pi); 	
	     
	     //HAL串口发送
         HAL_UART_Transmit_DMA(&huart1, (uint8_t*)Tx_buff , sizeof(Tx_buff)); 
	
	
}

-----------------------------------------
运行结果:3.141592
三、USART接收浮点数
#include "my_main.h"//
//
#include "string.h"
#include "stdio.h"
#include "stdlib.h"
#include "gpio.h"

//
char Rx_buff[256] = {0};
float x = 0.0;
int i = 0;

void main(void)
{
    //接收浮点数形式的字串 
    HAL_UART_Receive_DMA(&huart1, (uint8_t*)Rx_buff, sizeof(Rx_buff));
    
    //atof()将字串转换为浮点数, c语言标准函数库, 需包含头文件 stdlib.h
	x = atof(Rx_buff);
	
    //atoi()函数,字串转换为整数
    i = atoi(Rx_buff);
	     
	
}

---------------------------------

<think>好的,用户的问题是关于如何在STM32中使用串口发送接收浮点数的示例代码。我需要结合提供的参考资料来给出合适的解决方案。 首先,发送浮点数方面,引用[2]提到了使用snprintf将浮点数格式化为字符串发送。这应该是一个可行的方法,因为直接发送浮点数的二进制数据可能会有大小端或对齐的问题。所以发送部分应该用类似的方法,将浮点数转为字符串,再通过串口发送接收部分,用户提到引用[1]中的情况,当接收到任意字符后,存储在buf数组中,并不断回传。这说明需要先接收字符串数据,然后解析为浮点数。比如,用户可能发送的是类似“12.34”的字符串,需要将其转换为浮点数。因此,接收端需要用类似sscanf或atof函数来转换接收到的字符串。 另外,引用[3]提到多串口的情况,但用户的问题可能只需要单个串口的处理,所以暂时可以忽略多串口的复杂情况。不过需要注意,如果同时使用多个串口,方法可能需要调整,但示例代码可能先专注于单串口。 接下来,我需要考虑STM32的具体实现。发送函数可能需要使用HAL库的HAL_UART_Transmit,而接收则可能使用中断或轮询方式。例如,在接收时,可以使用中断来收集字符,直到接收到换行符或特定结束符,然后将接收缓冲区中的字符串解析为浮点数。 代码结构方面,发送浮点数的函数可以像引用[2]那样,使用snprintf生成字符串,再发送接收部分则需要一个缓冲区,存储接收到的字符,并在适当的时候解析。 需要注意的问题包括:缓冲区的大小,防止溢出;浮点数的精度和格式;以及接收时的数据完整性,比如是否接收到完整的字符串后再解析。 可能还需要处理的情况是,如果用户发送的字符串无法正确转换为浮点数,比如非数字字符,这时候需要错误处理。但示例代码可能先假设用户发送的是正确的格式。 总结步骤: 1. 发送端:将浮点数格式化为字符串,通过UART发送。 2. 接收端:接收字符串到缓冲区,解析为浮点数。 3. 示例代码需要包括发送接收的实现,使用HAL库函数。 4. 注意缓冲区管理和错误处理。 现在需要将这些思考整理成结构化的回答,提供示例代码,并生成相关问题。</think>### STM32串口发送接收浮点数方法 #### 发送浮点数步骤 1. **浮点转字符串**:使用`snprintf()`将浮点数格式化为字符串,例如保留两位小数:`snprintf(buffer, sizeof(buffer), "%.2f", num)`[^2] 2. **发送字符串**:通过UART发送生成的字符串,如`HAL_UART_Transmit(&huart1, (uint8_t*)buffer, strlen(buffer), 100)` #### 接收浮点数步骤 1. **接收字符串**:通过串口中断或DMA接收数据存入缓冲区`rx_buf` 2. **字符串转浮点**:使用`atof()`或`sscanf()`解析缓冲区内容,如`sscanf(rx_buf, "%f", &received_num)` #### 完整示例代码 ```c // 发送浮点数函数 void send_float(float num) { char tx_buf[32]; snprintf(tx_buf, sizeof(tx_buf), "%.2f\n", num); // 添加换行符作为结束标记 HAL_UART_Transmit(&huart1, (uint8_t*)tx_buf, strlen(tx_buf), 100); } // 接收配置 #define RX_BUF_SIZE 64 char rx_buf[RX_BUF_SIZE]; uint8_t rx_index = 0; // 串口中断回调 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart->Instance == USART1) { if (rx_index < RX_BUF_SIZE-1) { char ch = (char)rx_byte; // 假设通过HAL_UART_Receive_IT接收单字节 if (ch == '\n') { // 检测结束符 rx_buf[rx_index] = '\0'; float received = atof(rx_buf); rx_index = 0; // 处理接收到的浮点数 } else { rx_buf[rx_index++] = ch; } } HAL_UART_Receive_IT(huart, &rx_byte, 1); // 重新使能接收 } } ``` #### 注意事项 1. **精度控制**:格式字符串`%.2f`中的数字控制小数位数[^2] 2. **缓冲区安全**:确保接收缓冲区足够大(建议至少32字节) 3. **数据完整性**:建议添加帧头/帧尾或校验机制 4. **浮点支持**:确保工程设置中启用了`Use float with printf`选项
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值