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

一,原理

主设备(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>;

  • 6
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
下面是基于STM32的HAL库进行开发的通过串口接收电压值的代码示例: ```c #include "stdio.h" #include "string.h" #define UART_BUFFER_SIZE 16 UART_HandleTypeDef huart1; ADC_HandleTypeDef hadc1; uint8_t uartBuffer[UART_BUFFER_SIZE]; uint8_t uartIndex = 0; void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart->Instance == USART1) { if (uartIndex < UART_BUFFER_SIZE - 1 && uartBuffer[uartIndex - 1] == '\r' && uartBuffer[uartIndex] == '\n') { // 处理串口接收到的数据 float voltage = atof((char *)uartBuffer); printf("Received voltage: %.2f V\r\n", voltage); // 清空缓冲区 memset(uartBuffer, 0, UART_BUFFER_SIZE); uartIndex = 0; } else { // 继续接收数据 uartIndex++; HAL_UART_Receive_IT(&huart1, &uartBuffer[uartIndex], 1); } } } int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART1_UART_Init(); MX_ADC1_Init(); HAL_ADC_Start(&hadc1); HAL_UART_Receive_IT(&huart1, &uartBuffer[uartIndex], 1); while (1) { HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY); float voltage = HAL_ADC_GetValue(&hadc1) * 3.3 / 4096; printf("Voltage: %.2f V\r\n", voltage); HAL_Delay(500); } } ``` 该代码中使用了HAL库提供的回调函数`HAL_UART_RxCpltCallback()`来处理串口接收到的数据,在每次接收到数据时判断是否接收完毕,如果接收完毕则将接收到的数据换为浮点数并打印输出。在`main()`函数中,使用`HAL_UART_Receive_IT()`函数开启串口接收中断,以便在接收到数据时调用回调函数进行处理。同时,使用`HAL_ADC_GetValue()`函数获取ADC采样值,并计算出对应的电压值进行打印输出。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值