关于STM32串口收发,以及数据类型的任意转换及识别字符命令进行相应赋值。**

关于STM32串口收发,以及数据类型的任意转换及识别字符命令进行相应赋值。

1 关于STM32串口收发,以及数据类型的任意转换及识别字符命令进行响应赋值。

对于STM32而言,串口这个外设是十分重要的,如果彻底搞懂这个外设,对于我们STM32无疑有很大的帮助

由于代码功能可进行修改便可实现任意功能,所以讲代码分为主模块,功能模块两部分

1.实现代码的主模块

首先关于初始化,其余的代码都一样,只不过多了一个

USART_ITConfig(DEBUG_USARTx, USART_IT_IDLE, ENABLE);	

/这个中断我们可查对应手册得知,此中断对应的是接受一帧数据的中断,通俗的说就是,我们人和人讲话,我们都是一个字一个字得说和听,但是大脑真正处理的时候,处理的是这一句完整的话,一帧中断的意思可以理解为,我们发完了一句完整的“话”,然后让cpu产生一个中断,去处理我们这句完整的话

2.中断串口处理函数

char  rece_buffer[128];
  int RxCounter;
void USART1_IRQHandler(void )
{
  u8 clear=clear;//这个变量用于清除IDLE中断,下面会做解释

	 USART_ClearFlag(USART1,USART_FLAG_TC);

	 if(USART_GetITStatus(USART1,USART_IT_RXNE)!=Bit_RESET)        
	   {
 
           rece_buffer[RxCounter++]=USART1->DR;
		   USART_ClearITPendingBit(USART1, USART_IT_RXNE);
//通过接受中断,将发送的数据一个一个得存放在数组里		   
	   }
		 
	 else if(USART_GetFlagStatus(USART1,USART_FLAG_IDLE)!=Bit_RESET)
	  {//当我们发完了一帧数据后,该中断就会产生
                clear=USART1->SR;
                clear=USART1->DR;//这两行代码在作用上完全类似于   USART_ClearITPendingBit(USART1, USART_IT_RXNE);
                //查看手册,对应寄存器可以知道,当我们依次读SR,DR寄存器之后,这个标志位就会自动清除。	
               RxCounter=0;//这个为接收数据数组的计数数据,这里清零后,方便下一次接收数据
               //如果没有这个清零,下次接收就会出问题,
   //比如第一次我们接收了5个数据,分别对   rece_buffer的0  1  2  3  4  放了数据,当我们第二次接收数据,因为RxCounter
   //并未清零,会继续给RxCounter的 5  6  7  .........赋值,如此会对我们的数据处理造成很大影响           
      }
      }   				


此代码便是我们功能代码的主体

3.数据的类型的转换

我们都知道串口发送,如果不选择以十六进制发送,则发送的为字符类型,如何把字符转换成数据类型方便我们使用呢?
在这之前关于printf函数的重定向相信大家都不是问题。

#include <stdio.h>//因为我们用到了sscanf以及print函数,所以要加入该头文件
char  rece_buffer[128];
  int RxCounter;
void USART1_IRQHandler(void )
{
  u8 clear=clear;
double num;
	 USART_ClearFlag(USART1,USART_FLAG_TC);

	 if(USART_GetITStatus(USART1,USART_IT_RXNE)!=Bit_RESET)        
	   {
 
           rece_buffer[RxCounter++]=USART1->DR;
		   USART_ClearITPendingBit(USART1, USART_IT_RXNE);

	   }
		 
	 else if(USART_GetFlagStatus(USART1,USART_FLAG_IDLE)!=Bit_RESET)
	  {
                clear=USART1->SR;
                clear=USART1->DR;
                RxCounter=0;
                printf ("%s\r\n",rece_buffer);//此代码只是为了验证与转换后的结果相同	
				sscanf (rece_buffer,"%lf",&num );//这两行代码可以把字符串变成浮点,整型等等!
//该函数的公式为sscanf( 数组,"渴望转换成为类型",转换数据赋值处 ),通俗地说就是把我们数组里的数据,转换成%lf,然后赋值到num;
//如果想赋值为int ,把%lf 改成 %n即可
				printf ("%f\r\n",num);	
						
                    
      }
      }   				


识别命令字符及其字符串

我们学习stm32的时候,经常会想,我可不可以从串口里发送一个命令,比如 “open led”,我们就打开led,输入"m",我们熄灭
,没错,当然可以实现,仍然是同一个模块,只不过稍微改动而已

char  rece_buffer[128];
  int RxCounter;
void USART1_IRQHandler(void )
{
  u8 clear=clear;

	 USART_ClearFlag(USART1,USART_FLAG_TC);

	 if(USART_GetITStatus(USART1,USART_IT_RXNE)!=Bit_RESET)        
	   {
 
           rece_buffer[RxCounter++]=USART1->DR;
		   USART_ClearITPendingBit(USART1, USART_IT_RXNE);
	   }
		 
	 else if(USART_GetFlagStatus(USART1,USART_FLAG_IDLE)!=Bit_RESET)
		
	        {
                clear=USART1->SR;
                clear=USART1->DR;	

         				

if(rece_buffer[0]=='p')//这个k就是命令字符
{//字母区分大小写的

/*这里写LED的关灭程序,以及其他执行模块*/

	
	  RxCounter=0;//这个清零很重要,切记!!!
					
}
if(rece_buffer[0]=='k'&&  rece_buffer[1]=='d'&&rece_buffer[2] =='a'&&rece_buffer[3]=='w'  )
	//这个kdaw就是命令字符串。*****************************,如果想改变命令字符串,依葫芦画瓢,照着增加或者减少即可,
	//如果要增加特殊符号,如空格等等,请查阅对于的字符表示形式
{//字母区分大小写的

/*这里写LED的关灭程序,以及其他执行模块*/	
	  RxCounter=0;
					
}
}
}

识别字符串命令及其赋值

比如我们希望输入k7854\r\n,就对k变量赋值7854,而输入其他,如m7854\r\n,则对m赋值7854

char  rece_buffer[128];
char  rece_buffer1[128];//两个数组,,用于数据的移位
  int RxCounter;

void USART1_IRQHandler(void )
{
  u8 clear=clear;
	float  num;
	 USART_ClearFlag(USART1,USART_FLAG_TC);
	 if(USART_GetITStatus(USART1,USART_IT_RXNE)!=Bit_RESET)        
	   {
 
           rece_buffer[RxCounter++]=USART1->DR;
		   USART_ClearITPendingBit(USART1, USART_IT_RXNE);
	   }
		 
	 else if(USART_GetFlagStatus(USART1,USART_FLAG_IDLE)!=Bit_RESET)
		
	        {		u8 i;			
                clear=USART1->SR;
                clear=USART1->DR;	
				
				
if(rece_buffer[0]=='k')
{  RxCounter=0;
 for(i=0;i<=(sizeof(rece_buffer)/sizeof(rece_buffer[0]));i++)
	   {
		rece_buffer1[i]=rece_buffer[i+1];
		//比如我们输入 k 854 ,rece_buffer里面的数据为 k  8   5   4,然后把后面的三个数据赋给cece_buffer1为 8  5   4
		}
				printf ("%s\r\n",rece_buffer1);	
				sscanf (rece_buffer1,"%f",&num );//将字符转变为浮点
				printf ("%f\r\n",num);	
				printf ("rece_buffer[0]=%c\r\n",rece_buffer[0])	;
	            printf ("rece_buffer[1]=%c\r\n",rece_buffer[1])	;
	//printf只是为了验证,无实际意义
}
else {printf ("你输入了错误命令");
    RxCounter=0;
    printf ("rece_buffer[0]=%c\r\n",rece_buffer[0])	;
	printf ("rece_buffer[1]=%c\r\n",rece_buffer[1])	;}


}
			


}

**

如此便实现了串口常用的几种功能

  • 21
    点赞
  • 172
    收藏
    觉得还不错? 一键收藏
  • 21
    评论
对于STM32串口收发数据,你需要先配置串口的参数,然后使用相应的函数进行数据的收发。 首先,在STM32的开发环境中,你需要找到对应的串口外设,并配置相应的引脚作为串口功能。然后,通过设置寄存器来配置串口的波特率、数据位、停止位、校验位等参数。 接下来,你可以使用HAL库或者直接操作寄存器的方式来进行数据的收发。如果使用HAL库,可以使用`HAL_UART_Receive()`函数来接收数据,使用`HAL_UART_Transmit()`函数来发送数据。如果直接操作寄存器,你可以通过读写USART寄存器来实现数据的收发。 以下是一个简单的例子,使用HAL库进行串口接收和发送数据的示例代码: ```c #include "stm32f4xx.h" #include "stm32f4xx_hal.h" #define UART_HANDLE huart2 UART_HandleTypeDef UART_HANDLE; void UART_Init(void) { UART_HANDLE.Instance = USART2; UART_HANDLE.Init.BaudRate = 115200; UART_HANDLE.Init.WordLength = UART_WORDLENGTH_8B; UART_HANDLE.Init.StopBits = UART_STOPBITS_1; UART_HANDLE.Init.Parity = UART_PARITY_NONE; UART_HANDLE.Init.Mode = UART_MODE_TX_RX; UART_HANDLE.Init.HwFlowCtl = UART_HWCONTROL_NONE; HAL_UART_Init(&UART_HANDLE); } void UART_ReceiveData(uint8_t* data, uint16_t size) { HAL_UART_Receive(&UART_HANDLE, data, size, HAL_MAX_DELAY); } void UART_SendData(uint8_t* data, uint16_t size) { HAL_UART_Transmit(&UART_HANDLE, data, size, HAL_MAX_DELAY); } int main(void) { uint8_t tx_data[] = "Hello, world!"; uint8_t rx_data[20]; HAL_Init(); UART_Init(); while (1) { UART_SendData(tx_data, sizeof(tx_data)); UART_ReceiveData(rx_data, sizeof(rx_data)); } } ``` 以上是一个简单的示例代码,通过USART2进行串口数据的收发。你可以根据自己的需求修改波特率、数据位、停止位、校验位等参数,并根据实际情况调整接收和发送数据的大小。 希望能帮到你!如果有任何问题,请随时提问。
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值