精华内容
下载资源
问答
  • 因此在stm32串口中断中,还有一个IDLE中断,用来产生串口接受一帧数据而产生的中断,比如说串口发来n个数据,会产生n次接收中断和一次IDLE中断,因此方便使用者来接收主机发送或者从机返回的数据! 原文链接:...

    stm32支持接受单个数据或者一帧数据,若配置单个数据接收中断的话,会出现接收包丢包,数据不完整的情况!因此在stm32的串口中断中,还有一个IDLE中断,用来产生串口接受一帧数据而产生的中断,比如说串口发来n个数据,会产生n次接收中断和一次IDLE中断,因此方便使用者来接收主机发送或者从机返回的数据!

    原文链接:https://blog.csdn.net/qq_35341807/article/details/79157437

    1、配置串口中断

    void USART1_Configuration(void)
    {
    	USART_InitTypeDef USART_InitStructure;
    	GPIO_InitTypeDef GPIO_InitStructure;
    	/* Configure USART1 Rx (PA.10) as input floating */
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;		  //¸¡¿ÕÊäÈëģʽ	   
    	GPIO_Init(GPIOA, &GPIO_InitStructure);
    	
    	/* Configure USART1 Tx (PA.09) as alternate function push-pull */
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;			  //¸
    	GPIO_Init(GPIOA, &GPIO_InitStructure);
    	
    	USART_InitStructure.USART_BaudRate = 9600;						//
    	USART_InitStructure.USART_WordLength = USART_WordLength_8b;		//
    	USART_InitStructure.USART_StopBits = USART_StopBits_1;			//
    	USART_InitStructure.USART_Parity = USART_Parity_No;				//
    	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;   //
    	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;					
    	/* Configure USART1 */
    	USART_Init(USART1, &USART_InitStructure);							
    	/* Enable USART1 Receive and Transmit interrupts */
    	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);                    //
    	USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);//
    	/* Enable the USART1 */
    	USART_Cmd(USART1, ENABLE);	                  //
    }
    

    关键

    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//没收到一个字节进入一次中断
    USART_ITConfig(USART1, USART_IT_IDLE, ENABLE); //开启串口空闲中断,每收到一帧数据进入一次中断
    

    2、串口中断函数

    处理一帧数据中所需要的内容

    一帧数据原始内容:
    在这里插入图片描述
    我要提取出这帧数据中的31.93

    char rece_buffer[BUFSIZ];
    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;
    	   }
    		 
    	 else if(USART_GetFlagStatus(USART1,USART_FLAG_IDLE)!=Bit_RESET)
    	        {					
                    clear=USART1->SR;
                    clear=USART1->DR;						
    	              RxCounter=0;
    						
    						//温度传感器的一帧数据,对需要的内容进行提取
    						if((rece_buffer[0]=='o')&&(rece_buffer[1]=='b')&&(rece_buffer[2]=='j'))
    						{
    								if(rece_buffer[9]=='-')  //¸ºÊý
    								{
    								;
    								}
    						else
                {
    								if(rece_buffer[10]=='.')   //x.xx
    								{
    								obj=(rece_buffer[9]-0x30)*100+(rece_buffer[11]-0x30)*10+(rece_buffer[2]-0x30);
    								}
    								if(rece_buffer[11]=='.')   //xx.xx
    								{
    								obj=(rece_buffer[9]-0x30)*1000+(rece_buffer[10]-0x30)*100+(rece_buffer[12]-0x30)*10+(rece_buffer[13]-0x30);
    								}
    								if(rece_buffer[12]=='.')   //xxx.xx
    								{
    								obj=(rece_buffer[9]-0x30)*10000+(rece_buffer[10]-0x30)*1000+(rece_buffer[11]-0x30)*100+(rece_buffer[13]-0x30)*10+(rece_buffer[14]-0x30)*10;
    								}
    								
    						    obj_T=obj/100;
    						}
    						printf("目标温度:%f",obj_T);
    						}
    						//printf("%s",rece_buffer);
                    }	
    					
    }
    

    最终获得需要是数据
    在这里插入图片描述

    展开全文
  • STM32串口接收一帧数据的写法,数据包括帧头,功能帧,数据帧,校验位!
  • 教你使用stm32接收串口一帧数据

    万次阅读 多人点赞 2018-01-25 08:47:39
    因此在stm32串口中断中,还有一个IDLE中断,用来产生串口接受一帧数据而产生的中断,比如说串口发来n个数据,会产生n次接收中断和一次IDLE中断,因此方便使用者来接收主机发送或者从机返回的数据!若想发送一帧...

    stm32支持接受单个数据或者一帧数据,若配置单个数据接收中断的话,会出现接收包丢包,数据不完整的情况!因此在stm32的串口中断中,还有一个IDLE中断,用来产生串口接受一帧数据而产生的中断,比如说串口发来n个数据,会产生n次接收中断和一次IDLE中断,因此方便使用者来接收主机发送或者从机返回的数据!若想发送一帧数据到串口请参照我博客中的另一篇文章——教你如何使用stm32发送一帧数据! 为了方便大家移植,提醒大家此次代码中的代码不需要任何修改,只需要复制粘贴即可!

    第一步:首先配置串口中断!

    我配置的是串口3,可根据自己的使用情况更改配置。需要更改的地方:时 钟RCC,GPIO_PIN,中断入口,将所   有的USART3改为你配置的串口即可)

    	GPIO_InitTypeDef GPIO_InitStructure;	
    	NVIC_InitTypeDef NVIC_InitStructure;	
    	USART_InitTypeDef  USART_InitStructure;
    
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
    
    	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//TX
    	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
    	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
    	GPIO_Init(GPIOB,&GPIO_InitStructure);
    	
    	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
    	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;//RX
    	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
    	GPIO_Init(GPIOB,&GPIO_InitStructure);
     
    
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); 
    	NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; 
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; 
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; 
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
    	NVIC_Init(&NVIC_InitStructure);
    
    
    	USART_InitStructure.USART_BaudRate=2400;   
    	USART_InitStructure.USART_WordLength=USART_WordLength_8b;
    	USART_InitStructure.USART_StopBits=USART_StopBits_1;
    	USART_InitStructure.USART_Parity=USART_Parity_No;
    	USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
    	USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
    	USART_Init(USART3,&USART_InitStructure);
    	USART_Cmd(USART3, ENABLE);
    	USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
    	USART_ITConfig(USART3, USART_IT_IDLE, ENABLE);

    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);

    重要提醒:这句话是打开串口接受中断。每收到一个字节进入一次中断!

    USART_ITConfig(USART3, USART_IT_IDLE, ENABLE);

    重要提醒:这句话是打开串口接受一帧数据中断。每收到一帧数据进入一次中断!

    至此,串口配置完成,下面进入中断入口函数中!

    第二步:写中断处理函数

    void USART3_IRQHandler(void)	
    {
    	 u8 clear=clear;
    	 USART_ClearFlag(USART3,USART_FLAG_TC);
    
    	 if(USART_GetITStatus(USART3,USART_IT_RXNE)!=Bit_RESET)        
    	   {
    
               rece_buffer[RxCounter++]=USART3->DR;
    	   }
    		 
    	 else if(USART_GetFlagStatus(USART3,USART_FLAG_IDLE)!=Bit_RESET)
    	        {					
                    clear=USART3->SR;
                    clear=USART3->DR;						
    	        RxCounter=0;
                    }	
    					
    }
    至此串口配置完成,程序运行时,只需要将配置串口函数放到主函数中,当串口发来一帧数据后即可将所有数据存到 接受缓冲数组中!


    展开全文
  • STM32串口中断接收一帧数据

    千次阅读 2021-01-03 22:52:57
    STM32串口中断接收一帧数据 IDLE即串口空闲中断,串口收到一帧数据后,发生的中断。比如说给单片机一次发来1个字节,或者一次发来8个字节,这些一次发来的数据,就称为一帧数据,也可以叫做一包数据。因为只有接收...

    STM32串口中断接收一帧数据

    IDLE即串口空闲中断,串口收到一帧数据后,发生的中断。比如说给单片机一次发来1个字节,或者一次发来8个字节,这些一次发来的数据,就称为一帧数据,也可以叫做一包数据。因为只有接收到一帧数据以后,你才可以判断这次收了几个字节和每个字节的内容是否符合协议要求。STM32单片机带IDLE中断,一帧数据结束后,产生IDLE中断,利用这个中断来接收不定长的数。(产生IDLE中断后 以帧为单位进行判断)

    如何配置IDLE中断?

    RXNE中断和IDLE中断的区别

    当接收到1个字节,就会产生RXNE中断,当接收到一帧数据,就会产生IDLE中断。比如给单片机一次性发送了8个字节,就会产生8次RXNE中断,1次IDLE中断。
    下面我们就配置好串口IDLE中断吧。

    /* 使能接收中断*/  
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);  
    /* 使能空闲中断*/  
    USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);  
    USART_Cmd(USART1, ENABLE);  
    char i = 0;  
    void USART1_IRQHandler(void)  
    {  
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//接收到一个字节  
            {      
                ch[i++] = USART_ReceiveData(USART1);   
            }   
    
     else if(USART_GetITStatus(USART1,USART_IT_IDLE) != RESET)//接收到一帧数据  
        { 
           USART1->SR;//先读SR  
           USART1->DR;//再读DR  
            i = 0;  
            printf("%s",ch);  
        }  
    }  
    展开全文
  • stm32串口中断接收一帧数据

    万次阅读 多人点赞 2017-02-18 17:11:53
    最近用到stm32串口,中断个字符个字符接收好心累,网上度了一下发现了篇好的帖子,和大家分享一下,原贴地址:http://www.51hei.com/bbs/dpj-39885-1.html 再次感谢原贴楼主的分享,为了方便大家,我把原文...

    最近用到stm32的串口,中断一个字符一个字符接收好心累,网上度了一下发现了一篇好的帖子,和大家分享一下,原贴地址:http://www.51hei.com/bbs/dpj-39885-1.html

    再次感谢原贴楼主的分享,为了方便大家,我把原文复制过来》

     

    今天说一下STM32单片机的接收不定长度字节数据的方法。由于STM32单片机带IDLE中断,所以利用这个中断,可以接收不定长字节的数据,由于STM32属于ARM单片机,所以这篇文章的方法也适合其他的ARM单片机。
    IDLE中断什么时候发生?
    IDLE就是串口收到一帧数据后,发生的中断。什么是一帧数据呢?比如说给单片机一次发来1个字节,或者一次发来8个字节,这些一次发来的数据,就称为一帧数据,也可以叫做一包数据。
    如何判断一帧数据结束,就是我们今天讨论的问题。因为很多项目中都要用到这个,因为只有接收到一帧数据以后,你才可以判断这次收了几个字节和每个字节的内容是否符合协议要求。
    看了前面IDLE中断的定义,你就会明白了,一帧数据结束后,就会产生IDLE中断。这个中断真是太TMD有用了。省去了好多判断的麻烦。
    如何配置好IDLE中断?
    下面我们就配置好串口IDLE中断吧。

    这是串口CR1寄存器,其中,对bit4写1开启IDLE中断,对bit5写1开启接收数据中断。(注意:不同系列的STM32,对应的寄存器位可能不同)
    (RXNE中断和IDLE中断的区别?
    当接收到1个字节,就会产生RXNE中断,当接收到一帧数据,就会产生IDLE中断。比如给单片机一次性发送了8个字节,就会产生8次RXNE中断,1次IDLE中断。)

     

    这是状态寄存器,当串口接收到数据时,bit5就会自动变成1,当接收完一帧数据后,bit4就会变成1.
    需要注意的是,在中断函数里面,需要把对应的位清0,否则会影响下一次数据的接收。比如RXNE接收数据中断,只要把接收到的一个字节读出来,就会清除这个中断。IDLE中断,如何是F0系列的单片机,需要用ICR寄存器来清除,如果是F1系列的单片机,清除方法是“先读SR寄存器,再读DR寄存器”。

     

    	/* 使能接收中断*/
    	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    	/* 使能空闲中断*/
    	USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);
    	USART_Cmd(USART1, ENABLE);

    重点是使能空闲中断。

     

     

     

    uint8_t ch[20];
    char i = 0;
    void USART1_IRQHandler(void)
    {
    
    	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//接收到一个字节
    	{ 	
    	    //ch = USART1->DR;
    			ch[i++] = USART_ReceiveData(USART1);
    	
    	} 
    	else if(USART_GetITStatus(USART1,USART_IT_IDLE) != RESET)//接收到一帧数据
    	{
    		USART1->SR;//先读SR
    		USART1->DR;//再读DR
    		i = 0;
    		printf("%s",ch);//只是测试,所以直接在中断里调用printf
    	}
    	 
    }

     

     

     

     

     

     

     

    展开全文
  • 本例程针对CubeMx LL库使用过程串口接收数据丢包的问题进行测试; 关于CubeMx的配置,相信大家都基本会,网上好多教程配置一下串口就行(配置个LED,个USART(这里是USART1),这里注意的是需要配置串口中断,本...
  • 使用stm32串口发送一帧数据,具体程序如下,相关知识点请自行脑补。 1、串口发送字符串 /***************** 发送一个字节 **********************/ //myUSARTx:具体串口 //ch: 一个8位的字节 void Debug_SendByte...
  • 基于cube生成的stm32f407 UART串口例程,带解析功能,支持接收和发送模式,其中接收模式可以接收任意长度的串口数据
  • 写的比较垃圾,将就着用。欢迎各位大佬指导, 我这里要用串口中断接收两种帧头的数据,1. 以0x0D 0x0A为帧头的数据。... //接收标志,用于判断串口是否正在接收一帧数据 uint8_t rxBuff[20]; //用于存放接收...
  • 关于STM32串口3的使用,接收并解析一帧数据

    千次阅读 多人点赞 2020-06-03 10:21:38
    关于STM32串口3的使用,接收并解析一帧数据stm32串口1被使用时,我们可以使用其他串口来使用。 步骤: 串口3定义、初始化; 串口3中断服务函数(接收一帧数据并判断是否正确); 主函数使用; 首先,我们要将...
  • STM8S003F3P接收一帧数据,以#为帧头,|为帧尾,数组长度是200,可根据芯片型号和数据大小来调整,开发环境:STVD
  • stm32串口接收程序 分处理

    千次阅读 多人点赞 2019-05-23 14:25:23
    stm32串口接收程序 分处理采用状态机的分方式   接收程序是所有单片机入门教程的必经之路,但是很多教程和例程只讲了如何去接收一个8位的字符数据,但实际操作时我们常常需要接收的是各式各样的数据帧,这一...
  • 我在项目中通过改为2048也可以通过接收2k的数据,代码量很少,才200多行,很容易看懂,可以移植到不同系列的STM32上,希望这程序能帮助到曾经跟我一样到处找资源解决HAL库与标准库串口使用上不同而痛苦的朋友们
  • 在进行数据传输的时候,发送一帧数据,为了保证其安全性,可以对一帧数据里面的东西进行“加密” #include <stdio.h> typedef struct My_Test { int head; //帧头 int length; int type; int command;...
  • 这里写自定义目录标题前言所涉及的芯片STM32F103RCT6MAX3483主要特点使用说明代码部分初始化相关代码.h文件.C文件与MAX3483相关的代码部分.h文件.c文件中断服务代码.c文件末尾 前言 这是我的第篇CSDN,记录一些...
  • 基于对串口FIFO的通信数据帧进行接收和分析处理 (关于串口FIFO使用可以参见作者另篇博文) 算法流程: 串口中断函数接收数据到FIFO。 根据通信协议GetInterUARTMessage()函数对数据帧进行判断获取。 根据通信协议...
  • STM32串口接收不定长数据的几种方法

    千次阅读 2020-05-19 23:13:13
    下面针对接收一帧含有多个字节的不定长数据接收方式进行讨论。 1、第一种方法:采用标志位(比如0X0D,0X0A)结束法 非常常见的一种接收方式,正点原子的例程便是采用的这种方式,以回车键作为一次数据结束的标志。...
  • 要想接收不定长度数据,就需要让单片机在接收完成一帧数据之后,自动告知系统数据已经接收完成了,这个过程其实都是通过单片机的中断机制实现的,stm32单片机串口接收有一个空闲中断机制,只要我们在配置中断的时候...
  • STM32串口按照格式接收数据,比如头为0x7E,尾为0x7F,那么程序可以接收这两个数据间的所有数据,本程序增加了数据传输超时检测功能,也就是在同一内两个数据之间的时间间隔如果超出预定的时间则接收数据状态...
  • CSDN上有很多关于STM32串口接收不定长数据的文章,但实际使用后发现照搬他们的代码,程序根本就不能正确接收数据,其中最关键的句有问题。其余内容完全正确。 文章末尾提供了源码链接,欢迎批评指正 *******...
  • STM32f103 串口接收不定长数据

    千次阅读 多人点赞 2018-12-12 13:48:08
    推荐方法三 方法1:串口接受数据,定时器来...那么初始化完成之后,当外部给单片机发送数据的时候,假设这帧数据长度是200个字节,那么在单片机接收个字节的时候并不会产生串口中断,而是DMA在后台把数据默...
  • STM32 HAL库+串口DMA+空闲中断(IDLE)实现不定长数据接收,可以用来参考学习使用,简单易懂。
  • 配合定时器中断,通过超时的方法,完成串口数据帧接收
  • 串口3接收数据我用个字符串进行存储,我发送数据的格式为a12b23c34d45e6,所以会根据a,b,c,d,e来进行识别,获取字母后面的数字来通wifi发送到onenet上面进行显示
  • stm32串口接收完整的数据包

    千次阅读 2019-07-18 17:04:30
    本文由来源昵称:太阳上乘凉 原文:... 参考了文章:《stm32串口中断接收方式详细比较》 ... 借鉴了第四种中断方式 ...串口的配置这里不做说明,仅对stm32接收中断中的数据进行解析。 数据...
  • 串口接收 串口接收流程 编程USARTx_CR1的M位来定义字长。 编程USARTx_CR2的STOP位来定义停止位位数。 编程USARTx_BRR寄存器确定波特率。...当串口接收数据时 USARTx_SR(ISR)的RXNE位置1。表明移

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,712
精华内容 1,484
关键字:

stm32串口接收一帧数据