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);
	     
	
}

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

### 串口接收浮点数 在嵌入式系统或单片机开发中,通过串口通信传输数据是非常常见的操作。当需要通过串口接收到的是一个浮点数时,通常会涉及到以下几个步骤: #### 1. **确定发送端的数据格式** - 发送方可能会将浮点数转换为字符串形式(如ASCII编码),例如 `"3.14"` 或者直接发送二进制表示的浮点数值(通常是IEEE754标准下的`float`或`double`类型)。 #### 2. **选择合适的接收方式** - 如果发送的是**字符串格式**,则接收后可以使用类似 `atof()` 函数将其从字符串转换为浮点数。 ```c char buffer[20]; // 假设最大长度足够存储浮点数字符串 float receivedFloat; // 接收串口数据存放在buffer中... sscanf(buffer, "%f", &receivedFloat); ``` - 如果发送的是**二进制格式**(即原始的浮点数字节序列),那么你需要确保按正确的字节序读取并解析该值。对于Little-endian和Big-endian的区别要特别注意。 #### 3. **处理波特率、校验位等配置** 确保发送端和接收端之间的串口设置一致非常重要。包括但不限于波特率、停止位、校验位等方面都需要匹配才能保证数据完整无误地传递。 #### 4. **考虑缓冲区溢出及错误检测机制** 实际应用中还应加入必要的容错措施,比如超时判断、CRC 校验等功能防止因线路干扰导致的数据丢失或损坏问题影响最终结果准确度。 --- 下面是一个简单的例子展示如何通过串口接收来自PC或其他设备传来的浮点数,并把它保存到变量里: ```c #include <stdio.h> #include <stdlib.h> // 模拟函数用于模拟实际硬件平台上的串行通讯功能. void UART_ReceiveString(char *str) { // 这里只是示例代码,在真实环境中应该由底层驱动完成真正的UART读写工作 } int main() { char buffer[20]; printf("等待接收...\n"); UART_ReceiveString(buffer); // 调用库提供的API获取外部输入信息 if (sscanf(buffer, "%f", &value) == 1){ printf("成功接收浮点数:%f\n", value); } else { printf("无法解析有效的浮点数字.\n"); } } ``` 这个案例假设了已经存在了一个能够正常工作的 `UART_ReceiveString()` API 来负责具体的物理层交互细节;而我们要做的就是在上层逻辑层面把所获得的信息转化为所需的形式——这里就是提取其中包含的有效浮点数值部分而已。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值