STM32串口接收变量(浮点型 float;整型int)

该博客介绍了如何使用STM32通过串口接收从设备发送的数据,并将其转换为浮点型存储在数组中。从设备数据格式为[变量一,变量二,变量三],接收函数通过中断单次处理一个字符,利用静态变量保留历史数据,使用atof函数将字符串转换为浮点数。同时,博客强调了关键点,如静态变量的作用、atof函数的使用、sizeof的计算及memset的内存初始化功能。

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

一,原理

主设备(stm32)串口接收数据时,使用单次中断即接收一个字符后触发中断。
从设备串口发送的数据格式为 [变量一,变量二,变量三] (方括号和逗号不可缺少),例如:[-12.3,12,234] ;注意发送的变量(包括小数点和负号)长度小于8,小数点后位数最好小于2位。
函数将接收到的变量转换成实数(浮点型 float;整型int)储存在(arrays)数组中,数组默认保存三个实数(可更改)。

二,函数代码

/**
*函数功能  :接收到的数据转换成浮点型
*rx   	  :单次接收到的字符
*arrays	  :浮点型数组   默认可储存三个数据
**/
void Read_Usart(char rx,float *arrays)
{
	static char shuzu[3][8]={0};		//接收3个数据(可更改),每个数据包含小数点和负号可容纳8位(十进制)  发送的字符(包含点.在内)长度最好<8
	static int begin=0,x=0,y=0;		//有效数据标志,二维数组元素变量
	int num;
	if(rx=='[')		//起始标志
	{
		begin=1;
		x=0;
		y=0;
	}
	else if(rx==']')	//结束标志 在结束时字符转换为实数
	{
		begin=0;
		for(num=0;num<=x;num++)
		{
			arrays[num]=(float)atof(shuzu[num]);//需要添加头文件<stdlib.h>
		}
		/* 打印数据 */
		for(num=0;num<=x;num++)
		{
			printf("%d : %f\r\n",num+1,arrays[num]);
		}
		printf("\r\n");
		memset(shuzu,0,sizeof(shuzu));	//清空数组,初始化为0
	}
	else if(rx==',')
	{
		x++;
		y=0;
	}
	else if(begin==1)
	{
		shuzu[x][y]=rx;
		y++;
	}	
}

三,重点

1,static: 静态变量,保证每次接收数据时,之前的数据不会被覆盖。
2,atof :一个字符串处理函数,功能是把字符串转换成浮点数,使用时 头文件为<stdlib.h>,语法格式为:double atof(const char *nptr)。
3,sizeof:一种内存容量度量函数,功能是返回一个变量或者类型的大小(以字节为单位);例如:shuzu[]={“1234”}, num=sizeof(shuzu); num的值为5(包括\n)。
4,memset:作用是将某一块内存中的内容全部设置为指定的值, 这个函数通常为新申请的内存做初始化工作;头文件<string.h>;

### 使用 `sprintf` 函数在 STM32 编程中的方法 `sprintf` 是标准 C 库中的一个函数,用于将格式化的字符串写入缓冲区。它通常被用来构建动态字符串或将数据换为字符串形式以便进一步处理或显示。 #### 基本语法 以下是 `sprintf` 的基本语法: ```c int sprintf(char *str, const char *format, ...); ``` - **参数说明** - `str`: 指向存储结果的字符数组(目标缓冲区)。 - `format`: 格式化字符串,定义输出的内容和样式。可以包含普通字符以及特殊格式符(如 `%d`, `%f`, `%s` 等)。 - `...`: 可变参数列表,提供给格式化字符串使用的实际值。 返回值是一个整数,表示成功写入的目标缓冲区中字符的数量(不包括终止的 `\0` 字符),如果发生错误则返回负值[^1]。 #### 在 STM32 中的应用注意事项 当在嵌入式环境中使用 `sprintf` 时需要注意以下几点: 1. **内存管理**: 需要确保目标缓冲区有足够的空间来容纳生成的结果字符串及其结尾的空字符 (`\0`)。否则可能会引发越界访问问题,导致程序崩溃或其他不可预测的行为。 2. **库支持**: 默认情况下,在某些精简版的新lib或者裁剪过的固件项目里可能不会启用完整的stdio功能集。因此确认编译器链接阶段包含了必要的C运行时库文件变得尤为重要[^2]。 3. **性能考量**: 虽然方便易用,但由于涉及大量字符串操作,频繁调用此类函数会消耗较多CPU周期与RAM资源,特别是在低功耗应用场景下需谨慎评估其影响。 #### 示例代码展示 下面给出一段简单的例子演示如何利用该函数打印数值并保存至指定位置: ```c #include "stm32f4xx_hal.h" #include <stdio.h> void Example_SPrintf(void){ uint8_t dataBuffer[50]; // 定义足够大的缓存区域 int numberValue = 123; float floatValue = 456.789; /* 将不同类型的变量组合成一条消息 */ sprintf((char*)dataBuffer,"Integer Value:%d Float Value:%.2f",numberValue,floatValue); // 发送通过串口或者其他外设发送出去... } ``` 在这个实例当中我们创建了一个名为Example_SPrintf()的方法内部实现了把整形浮点型混合起来形成最终可读性强的信息流过程.
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值