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,像上面的printf是不能达到效果的。
因此可以采用以下的方法:

//创建一个变量存字符串
char TXDate[]=”abcd“;
//假设用串口一来发送
HAL_UART_Transmit(&huart1,(uint8_t*)&TXDate,strlen(TXDate),strlen(TXDate));

但有时有些应用不只是发单一的字符串,有些变量会在字符串发送,可以利用C语言的sprintf函数的帮助来实现。

//创建一个变量存字符串,数组大小跟实际情况变化
char TXDate[20];
//创建一个发送的变量
float x;
//假设用串口一来发送
sprintf(char,"char:%.2f\n",x);
HAL_UART_Transmit(&huart1,(uint8_t*)&TXDate,strlen(TXDate),strlen(TXDate));

串口的接收

接收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
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!对于STM32串口接收数字,您可以按照以下步骤进行操作: 1. 初始化串口:首先需要初始化您所使用的串口接口。可以使用STM32提供的库函数进行初始化,包括设置波特率、数据位、停止位和校验位等。 2. 接收数据:在接收数据之前,您需要创建一个接收缓冲区,用来存储接收到的数据。可以使用数组或者指针来实现。然后,可以使用串口接收中断或者轮询的方式来接收数据。 - 使用中断方式:通过使能串口接收中断,并编写一个中断服务函数来处理接收到的数据。在中断服务函数中,将接收到的数据存储到接收缓冲区中,并进行相应的处理。 - 使用轮询方式:在主循环中通过查询串口接收寄存器的状态位来判断是否有数据接收。如果有数据接收,就将数据存储到接收缓冲区中,并进行相应的处理。 3. 处理接收的数字:当接收到数字后,您可以进行相应的处理。可以将接收到的数字换为需要的数据类型,比如整数、浮点数等,然后进行进一步的操作。 需要注意的是,串口接收数据时要考虑数据的粘包和丢包问题,可以通过添加帧头或者帧尾来解决。另外,如果接收到的数据是ASCII码示的数字,可以使用库函数进行换;如果是二进制数据,则需要自己进行解析。 希望以上信息能对您有所帮助!如果您还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值