STM32串口 ASCII 的数字接收与发收

STM32 ASCII 的数字接收与发收

STM32串口 ASCII 的数字接收与发收

串口发送

先重定义,如下

int fputc(int ch,FILE* f)
{
	HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,1);
	 return ch;
}

数据量大的可用DMA,亲测有效

int fputc(int ch,FILE* f)
{
	while(HAL_UART_Transmit_DMA(&huart1,(uint8_t*)&ch,1)!=HAL_OK);
	 return ch;
}

发送的内容用printf即可

串口的数字接收

接收ASCII的数字并组合,此函数可处理 有小数的正负和无小数的正负

//此函数用于接收ascii码的数字,可方便后续的计算
/*
uint8_t *rxbuffer 存放数据的数组
*/
float	readstring (uint8_t *rxbuffer)
{
  float str = 0;//返回的变量
	int sum = 0;
	float t = 0,c = 0,z=0,a = -1;//作为中间变量
	uint8_t flag = 0;//做标记位,判断有无小数点
	for(int i = 0;i<50;i++)//50是因为创建了一个50的数组来存放数据,可根据自己情况改变
	{
		if(rxbuffer[i]=='.')//记录小数点位置
		{
			flag =1;
			c = i-1;//记录此时的位置
		}
		if(rxbuffer[i]==0x0D&&rxbuffer[i+1] == 0x0A)//ascii数据接收完毕
		{
			sum = i-1;//记录次数位置
			//数字处理
			//没有小数点处理
			if(rxbuffer[sum] >= 'A')
			{
				flag = 2;
			}
			if(flag==0)
			{
				//判断正
				if(rxbuffer[0]!='-')
				{
					for(int j = 0;j<=sum;j++)
					{
						str += (rxbuffer[j]-'0')*(int)(pow(10,sum-t));
						t++;
					}
					
				}
				//判断负
				if(uart1_rx_buffer[0]=='-')
				{
					for(int j = 1;j<=sum;j++)
					{
						str += (rxbuffer[j]-'0')*(int)(pow(10,sum-t-1));
						t++;
					}
					str = -str;
				}
			}
			//有小数点处理
			else if(flag ==1)
			{
				//判断正
				if(rxbuffer[0]!='-')
				{
					for(int l = 0;l<=c;l++)
					{
						str += (rxbuffer[l]-'0')*(int)(pow(10,c - z));
						z++;
					}
					for(int p = c+2;p<=sum;p++)
					{
						str += (rxbuffer[p]-'0')*(pow(10,a));
						a--;
					}			
				}
				//判断负
				if(rxbuffer[0]=='-')
				{
					for(int l = 1;l<=c;l++)
					{
						str += (rxbuffer[l]-'0')*(int)(pow(10,c - z-1));
						z++;
					}
					for(int p = c+2;p<=sum;p++)
					{
						str += (rxbuffer[p]-'0')*(pow(10,a));
						a--;
					}
					str = -str;
				}				
			}
			else if(flag == 2)//有字母时不处理
			{
				str = 0;
			}
			break;//退出本次处理数据的循环
		}
	}
	return str;
}
发布了1 篇原创文章 · 获赞 0 · 访问量 81

猜你喜欢

转载自blog.csdn.net/qq_45321807/article/details/104072124