STM32通过usart接收中断修改参数值

第一次写博客,主要是想记录一下学习历程,以后可以回过头来看看。
话不多说,进入正题,这个通过蓝牙与32的USART配合,
直接通过串口助手发送可以修改想修改的参数
(我这个程序比较初级,需要在程序的枚举类型里提前
添加可能需要修改的元素,如果有更好的方法,还请教教我 ♪(´∇`*)  )
例如:
	kpz=150\n(这里我设置'\n'为结束标志)
#include"stdio.h"
#include "stdlib.h"
#include"string.h"
#include"usart.h"

float dezhi;
char* xuanze;
//下面的命名规则是在需要改的变量名后加个r,以作区别
enum {
     
        kpzr=1,		
        kdzr,
        kpvr,
        kivr,
        resetr,
    }k;
//
void USART1_IRQHandler(void)           
{
     
  static int i=0;
  static char a[100];
  char str1[100],b[100];
 /*中断里是对输入的字符串做处理,分出目标变量名
 与目标值,并将目标值转为浮点型*/
  if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){
      
   	a[i]=USART_ReceiveData(USART1);
  	i++;
   	if(a[i-1]=='\n'){
     
    		sscanf(a,"%[^=]",b);
    		xuanze=b;
    		sscanf(a+strlen(b)+1,"%[^\n]",str1);
    		dezhi=atof(str1);
    		i=0;
  	}
  }
  USART_ClearFlag(USART1,USART_FLAG_RXNE);
  USART_ClearITPendingBit(USART1,USART_FLAG_RXNE);
} 

int main(void)
{
     
  while(1)
  {
     
  //此处加判断可以减少不必要的if判断
  	if(xuanze!=NULL)
  	{
     
  		if(!strcmp(xuanze,"kpz")){
     
		  k=kpzr;
		  xuanze=NULL;
	  	  goto sw;
	    	}
	    	if(!strcmp(xuanze,"kdz")){
     
	    	  k=kdzr;
	    	  xuanze=NULL;
	    	  goto sw;
	    	}
	    	if(!strcmp(xuanze,"kpv")){
     
	    	  k=kpvr;
	    	  xuanze=NULL;
	    	  goto sw;
	    	}
	    	if(!strcmp(xuanze,"kiv")){
     
	    	  k=kivr;
	    	  xuanze=NULL;
	    	  goto sw;
	    	}
	    	if(!strcmp(xuanze,"reset")){
     
	    	  k=resetr;
	    	  xuanze=NULL;
	    	  goto sw;
	    	}
	    	sw:
	    	switch(k)
	    	{
     
	        	case kpzr: kpz=dezhi;break;
	        	case kdzr: kdz=dezhi;break;
	        	case kpvr: kpv=dezhi;break;
	        	case kivr: kiv=dezhi;break;
	        	case resetr: kpz=0;kdz=0;kpv=0;kiv=0;break;
	    	}
	}
  }
}  

可能有些小错误,因为是我现写的,纯手打,有错还请指出,谢谢。

你可能感兴趣的:(stm32,usart接收中断,用蓝牙修改参数)