精华内容
下载资源
问答
  • STM32串口接收数据

    千次阅读 2018-07-15 13:33:28
    参考:STM32串口接收粉尘传感器数据


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

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

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

    1. GPIO_InitTypeDef GPIO_InitStructure;
    2. NVIC_InitTypeDef NVIC_InitStructure;
    3. USART_InitTypeDef USART_InitStructure;
    4. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);
    5. RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
    6. GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10; //TX
    7. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
    8. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
    9. GPIO_Init(GPIOB,&GPIO_InitStructure);
    10. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
    11. GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11; //RX
    12. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
    13. GPIO_Init(GPIOB,&GPIO_InitStructure);
    14. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
    15. NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
    16. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    17. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    18. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    19. NVIC_Init(&NVIC_InitStructure);
    20. USART_InitStructure.USART_BaudRate= 2400;
    21. USART_InitStructure.USART_WordLength=USART_WordLength_8b;
    22. USART_InitStructure.USART_StopBits=USART_StopBits_1;
    23. USART_InitStructure.USART_Parity=USART_Parity_No;
    24. USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
    25. USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
    26. USART_Init(USART3,&USART_InitStructure);
    27. USART_Cmd(USART3, ENABLE);
    28. USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
    29. USART_ITConfig(USART3, USART_IT_IDLE, ENABLE);

    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);

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

    USART_ITConfig(USART3, USART_IT_IDLE, ENABLE);

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

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

    第二步:写中断处理函数

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



    转载自:教你使用stm32接收串口的一帧数据!


    展开全文
  • STM32串口收发数据

    热门讨论 2012-11-15 16:49:26
    STM32的USART进行初始化,并使能接收中断,当PC机发送数据时,触发USART接收中断,再通过函数发送接收到的数据到PC机上。
  • STM32串口接收数据处理方法

    千次阅读 2021-03-31 09:16:44
    STM32串口接收数据处理方法 STM32串口接收定长数据处理方法 STM32串口接收定长数据的处理方法非常简单,我目前做项目都是用的这个,也可用做处理MODBUS协议,直接上代码。 void USART1_IRQHandler(void) //串口1...

    STM32串口接收数据处理方法

    STM32串口接收定长数据处理方法

    STM32串口接收定长数据的处理方法非常简单,我目前做项目都是用的这个,也可用做处理MODBUS协议,直接上代码。

    void USART1_IRQHandler(void)                	//串口1中断服务程序
    {
    	u8 Res;
    	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断
    	{
    		USART_ClearITPendingBit(USART1,USART_IT_RXNE);     //清中断
    		Res =USART_ReceiveData(USART1);	//读取接收到的数据
    		switch(USARTReceIn)
    		{
    			case 0:
    				if((Res==SW_ID)||(Res==255))
    					USARTReceBuff[USARTReceIn++] = Res;
    				else
    					USARTReceIn = 0;
    				break;
    		
    			default:
    				USARTReceBuff[USARTReceIn++] = Res;
    				break;
    		}
    		if(USARTReceIn >= 8)
    		{
    			USARTReceFullFlag = 1;	 
    		}
         }
    } 
    

    执行逻辑解释

    首先定义一个全局变量接收完成标志位USARTReceFullFlag,假如我需要接收数据长度是8,那么在串口中断接收到数据长度>=8时,就让这个标志位置1,也可在串口中断函数中判断接收到的数据头。
    然后在其他地方执行时,直接判断标志位,进行处理相关内容,注意:需要把标志位和接收序列清零。

    if(USARTReceFullFlag)
    {
    	if((USARTReceBuff[2] == 0x01)&&(USARTReceBuff[6] == 0xcc)&&(USARTReceBuff[7] == 0xdd))
    	{
    		Play_Choice_voice(0x01);
    	}
    	USARTReceFullFlag = 0;
    	USARTReceIn = 0;
    }
    
    展开全文
  • 串口接收数据后,在串口助手打印缓存区有数据,可是无法转换成json格式的数据。printf也无法打印json格式的数据 [img=https://img-bbs.csdn.net/upload/202007/30/1596096135_119812.png][/img]
  • stm32串口接收数据的几种方式

    千次阅读 2021-01-26 11:12:09
    stm32串口接收数据的几种方式 转载自:http://bbs.elecfans.com/jishu_357017_1_1.html 本例程通过PC机的串口调试助手将数据发送至STM32,接收数据后将所接收的数据又发送至PC机,具体下面详谈。。。 实例一...

     

    转载自:http://bbs.elecfans.com/jishu_357017_1_1.html

     

    本例程通过PC机的串口调试助手将数据发送至STM32,接收数据后将所接收的数据又发送至PC机,具体下面详谈。。。

     

    实例一:

    void USART1_IRQHandler(u8 GetData)

    {

    u8 BackData;

    if(USART_GetiTStatus(USART1, USART_IT_RXNE) != RESET) //中断产生

    {  

    USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清除中断标志.

                GetData = UART1_GetByte(BackData);   //也行GetData=USART1->DR;   

    USART1_SendByte(GetData);      //发送数据

    GPIO_SetBits(GPIOE, GPIO_Pin_8 ); //LED闪烁,接收成功发送完成

    delay(1000);

    GPIO_ResetBits(GPIOE, GPIO_Pin_8 );

    }

    }  

    这是最基本的,将数据接收完成后又发送出去,接收和发送在中断函数里执行,main函数里无其他要处理的。

    优点:简单,适合很少量数据传输

    缺点:无缓存区,并且对数据的正确性没有判断,数据量稍大可能导致数据丢失 。

     

     

    实例二:

    void USART2_IRQHandler()  

    {

    if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET) //中断产生

    {  

    USART_ClearITPendingBit(USART2,USART_IT_RXNE); //清除中断标志

    Uart2_Buffer[Uart2_Rx_Num] = USART_ReceiveData(USART2);

    Uart2_Rx_Num++;

    }

     

    if((Uart2_Buffer[0] == 0x5A)&&(Uart2_Buffer[Uart2_Rx_Num-1] == 0xA5))  //判断最后接收的数据是否为设定值,确定数据正确性

    Uart2_Sta=1;

    if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) == SET) //溢出

    {

    USART_CleaRFlag(USART2,USART_FLAG_ORE);  //读SR

    USART_ReceiveData(USART2); //读DR  

    }     

    }

       

    if( Uart2_Sta )

    {

    for(Uart2_Tx_Num=0;Uart2_Tx_Num < Uart2_Rx_Num;Uart2_Tx_Num++)

    USART2_SendByte(Uart2_Buffer[Uart2_Tx_Num]); //发送数据

     

    Uart2_Rx_Num = 0; //初始化

    Uart2_Tx_Num = 0;

    Uart2_Sta = 0;

    }

    这是加了数据头和数据尾的接收方式,数据头和尾的个数可增加,此处只用于调试之用。中断函数用于接收数据以及判断数据的头尾,第二个函数在main函数里按照查询方式执行。

    优点:较简单,采用缓存区接收,对提高数据的正确行有一定的改善 。

    缺点:要是第一次数据接收错误,回不到初始化状态,必须复位操作 。

     

    实例三:

    vvoid USART2_IRQHandler()

    {

         if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET) //中断产生

         {

            USART_ClearITPendingBit(USART2,USART_IT_RXNE); //清除中断标志.

            Uart2_Buffer[Uart2_Rx] = USART_ReceiveData(USART2);

            Uart2_Rx++;

            Uart2_Rx &= 0x3F; //判断是否计数到最大

          }

          if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) == SET) //溢出

          {

              USART_ClearFlag(USART2,USART_FLAG_ORE); //读SR

              USART_ReceiveData(USART2); //读DR

           }

    }

      

    if( Uart2_Tx != Uart2_Rx )

    {

        USART2_SendByte(Uart2_Buffer[Uart2_Tx]); //发送数据

        Uart2_Tx++;

        Uart2_Tx &= 0x3F; //判断是否计数到最大

    }  

    采用FIFO方式接收数据,由0x3F可知此处最大接收量为64个,可变,中断函数只负责收,另一函数在main函数里执行,FIFO方式发送。

    优点:发送和接收都很自由,中断占用时间少,有利于MCU处理其它。

    缺点:对数据的正确性没有判断,一概全部接收。

     

    实例四:

    void USART2_IRQHandler()

    {

         if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET) //中断产生

         {

            USART_ClearITPendingBit(USART2,USART_IT_RXNE); //清除中断标志

            Uart2_Buffer[Uart2_Rx] = USART_ReceiveData(USART2);

            Uart2_Rx++;

            Uart2_Rx &= 0xFF;

         }

         if(Uart2_Buffer[Uart2_Rx-1] == 0x5A) //头

            Uart2_Tx = Uart2_Rx-1;

         if((Uart2_Buffer[Uart2_Tx] == 0x5A)&&(Uart2_Buffer[Uart2_Rx-1] == 0xA5)) //检测到头的情况下检测到尾

         {

                Uart2_Len = Uart2_Rx-1- Uart2_Tx; //长度

                Uart2_Sta=1; //标志位

         }

         if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) == SET) //溢出

         {

                USART_ClearFlag(USART2,USART_FLAG_ORE); //读SR

                USART_ReceiveData(USART2); //读DR

         }

    }

     

    if( Uart2_Sta )

    {

            for(tx2=0;tx2 <= Uart2_Len;tx2++,Uart2_Tx++)

                    USART2_SendByte(Uart2_Buffer[Uart2_Tx]); //发送数据

            Uart2_Rx = 0; //初始化

            Uart2_Tx = 0;

            Uart2_Sta = 0;

    }

     

    数据采用数据包的形式接收,接收后存放于缓存区,通过判断数据头和数据尾(可变)来判断数据的“包”及有效性,中断函数用于接收数据和判断头尾以及数据包长度,另一函数在main函数里执行,负责发送该段数据。

    优点:适合打包传输,稳定性和可靠性很有保证,可随意发送,自动挑选有效数据。

    缺点:缓存区数据长度要根据“包裹”长度设定, 要是多次接收后无头无尾,到有头有尾的那一段数据恰好跨越缓存区最前和最后位置时,可能导致本次数据丢失,不过这种情况几乎没有可能。

    展开全文
  • 最近做项目发现自己的32串口使用学的太烂了(只是懂了串口的实现原理,但是使用上-空白),就有集中学习了一下串口接收数据的方式:在ProcessOn上整理了思维导图分享如下:(主要整理接受不定长数据的方法,目前整理...

    STM32串口收发数据方式总结


    2021-5-3更新

    重新梳理了一下,并用代码一一实现:(HAL库)

    大致三种方式:阻塞、中断、DMA

    		//-----串口收发方式测试------------------------------------------------------------------------------------------------------------------
    
    		
    		//1、阻塞模式:HAL_UART_Transmit、HAL_UART_Receive
    		//(1)阻塞发送--函数体中完成发送过程
    		HAL_UART_Transmit(&huart2, usart2_data_buffer, sizeof(usart2_data_buffer), 1000);
    		//(1)阻塞接收--函数体中完成接收过程,要么收到指定长度的数据,要么超时--没有开启中断标志位,不涉及中断
    		HAL_UART_Receive(&huart2, usart2_data_buffer, 10, 10000);
    		
    		//2、中断模式:HAL_UART_Transmit_IT、HAL_UART_Receive_IT
    		//使用中断,要在开启中断的同时,设定中断标志位,不然程序也不知道什么情况下中断噻
    		//个人感觉中断发送用的不是太多,毕竟发送的数据是知道的,直接用阻塞的方式发送就行了。可能一些对实时性要求比较高的地方比较好用吧
    		//中断接收用的还是比较多的,因为不知道从机会发来什么数据,什么时候发,什么时候发完一次
    		//(1)中断发送--使用标志位:TXE:发送数据寄存器空--__HAL_UART_ENABLE_IT(huart, UART_IT_TXE);
    		HAL_UART_Transmit_IT(&huart2, usart2_data_buffer, sizeof(usart2_data_buffer));
    		//(1)中断接收--使用标志位:RXNE:读数据寄存器非空--__HAL_UART_ENABLE_IT(huart, UART_IT_RXNE);
    		HAL_UART_Receive_IT(&huart2, usart2_data_buffer, 10);
    				
    		//(2)中断接收--使用标志位:RXNE:读数据寄存器非空 + IDLE:监测到总线空闲
    		//加了个检测空闲中断,IDLE就是串口收到一帧数据后,发生的中断。可以有效的解决“从机什么时候发完一次”的问题
    		//一帧数据即一次性发来的数据,数据间的时间间隔小于某个值(具体多少不太清楚,但是平时串口收发两次中间间隔肯定大于这个值)
    		//参考链接:http://bbs.21ic.com/icview-1594484-1-2.html?_dsign=0b20e05f
    		//在需要的地方开启这两个标志位中断,然后直接在中断服务函数中判断就行了,开启一次就行了,不用放在循环里	
    		__HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);
    		__HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);
    	
    		//3、DMA模式:HAL_UART_Transmit_DMA、HAL_UART_Receive_DMA
    		//DMA,直接内存访问,第一次在32程序中用到,原理就是跳过cpu直接进行内存访问
    		//32实现方式和很简单,指定源地址和目的地址,地址增量这三个必要的参数,其他的就是一些中断位等等,开启DMA就可以传输了
    		//像配置串口那样配置一下DMA通道时钟,选择通道优先级,并开启中断(因为HAL_UART_Transmit_DMA用到了中断)
    		//(1)DMA发送--使用起来就像中断一样,发了之后就不用管了,主程序该干嘛干嘛,DMA自己就操作了
    		HAL_UART_Transmit_DMA(&huart2, usart2_data_buffer, sizeof(usart2_data_buffer));
    		//(1)DMA接收--比较省心,还节约cpu资源
    		HAL_UART_Receive_DMA(&huart2, usart2_data_buffer, 10);
    
    
    		//-----串口收发方式测试------------------------------------------------------------------------------------------------------------------

    并重新梳理了一下中断模式下数据接收处理流程

     

     

     


    2019-11-07

    最近做项目发现自己的32串口使用学的太烂了(只是懂了串口的实现原理,但是使用上-空白),就有集中学习了一下串口接收数据的方式:在ProcessOn上整理了思维导图分享如下:(主要整理接受不定长数据的方法,目前整理了两种方法,DMA的以后有空再整理)

    附图片:


    展开全文
  • /* STM32串口3接收1字节 */ /* 说明:串口3接收中断 */ /* */ /*******************************************************************/ void USART3_IRQHandler(void) { u8 dat; if(USART_...
  • STM32串口收发数据的DMA配置过程

    千次阅读 2019-09-01 23:08:13
    DMA,全称Direct Memory Access,即直接存储器访问, DMA 传输方式无需 CPU 干预,通过硬件为 RAM 和 I/O 设备开辟一...step1:STM32串口配置 使用串口初始化函数来配置: void usart_init(void) { //第一步:GPI...
  • STM32串口发送数据接收数据方式总结

    万次阅读 多人点赞 2018-05-13 20:34:22
    之前写了篇关于ESP8266使用AT指令进行互相通讯的实验,在写STM32串口接发数据的程序中,觉得有必要将之前学的有关于串口方面的使用经历加以总结。 串口发送数据: 1. 串口发送数据最直接的方式就是标准调用...
  • stm32 串口收发数据不稳定问题

    千次阅读 2017-03-01 19:01:00
    用中断接收串口数据时,有时会存在串口接收数据错乱的问题,此时需要配置的时候为 uint8 u8Data; if ( USART_GetITStatus(USART1,USART_IT_RXNE) == SET ) { USART_ClearITPendingBit(USART1,USART_IT_RXNE); //...
  • 1:STM32多机通讯,安卓板为上位机,下位机为几个STM32串口接收数据(应该是2~10个),请大神指教, 2:要有程序代码提供(最好是有寄存器配置版本的。如是库函数版的请说清楚)
  • 在使用STM32串口时,有时候串口接受一段时间数据之后便会卡死不在进入中断接收数据。原因是串口中断标志没有清除,导致终端锁死,此时需要判断对应的标志位,重新启动中断。 if((huart1.Instance->CR1 & 0x...
  • STM32串口接收数据出现漏接的现象

    千次阅读 2015-01-20 23:37:34
    今天在写IAP调试的时候发现接收到的数据不对...还有在测试的时候,我为了方便把打印接收的数据也放到中断里面,同样也会出现漏接的现象,所以当使用串口接收数据的时候,要保证接收到的数据及时保存,中断尽量不要运行
  • // 开启串口DMA接收 USART_Cmd(USART2, ENABLE); } void USART2_IRQHandler(void) { uint8_t temp = 0; uint8_t i = 0; if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET) { //USART_...
  • 在板子上搞个串口通信,发现串口助手发过去的和收到的不是同一个数据,比如发01, 到芯片一接收就变成了40,网上查了好久,可能是时钟问题,然后用RCC_GetClocksFreq函数一看,发现 初始化都是0啊 ![图片说明]...
  • USART1挂载APB2上面,而USART2和USART3挂载在APB1上面(就这里没看,搞了大半天才发现挂载总线错了) 两个AHB/APB桥在AHB和2个APB总线间提供同步连接。...下面是实际项目中,判断串口接收数据是否完成的一个流程描述。
  • STM32串口接收不定长数据程序,并进行处理,非常方便而且注释明确
  • stm32串口收发.rar

    2019-07-27 12:30:05
    里面有stm32串口收发数据的测试代码,收发两套程序都有,详细注释。代码基于stm32f407系列。下载后可自行移植。
  • STM32F407ZGT6 使用Hal库(Cube配置) 采用 方法1 串口空闲中断+串口接收中断配合 方法2 串口空闲中断+DMA方式 实现串口接收不定长数据并发送接收到的数据
  • STM32为基础展示如何使用DMA收发串口数据 STM32F103 DMA收发 经过稳定测试 初始化后直接用
  • STM32CUBEMX配置教程(九)STM32串口DMA收发数据 基于STM32H743VI 使用STM32CUBEMX两年了,始终觉得这个工具非常的方便,但因为不是经常使用,导致有些要点总是会有些遗忘,因此写下这一系列教程以供记忆,顺便让我...
  • STM32 串口接收不定长字节数据

    千次阅读 2019-06-28 14:37:29
    STM32 串口接收不定长字节数据(基于空闲终端+接收中断)
  • **STM32串口接收不定长数据原理与源程序** CSDN上有很多关于STM32串口接收不定长数据的文章,但实际使用后发现照搬他们的代码,程序根本就不能正确接收数据,其中最关键的一句有问题。其余内容完全正确。 文章...
  • STM32串口发送数据

    万次阅读 2019-05-15 15:35:53
    串口通信经常作为开发调试的工具,所以先介绍下串口通信。 串口通讯(Serial Communication)...目前STM32一般只使用 RXD、TXD 以及 GND 三条信号线,直接传输数据信号。 STM32串口通信外设有USART和UART。USART是...
  • 之前写了篇关于ESP8266使用AT指令进行互相通讯的实验,在写STM32串口接发数据的程序中,觉得有必要将之前学的有关于串口方面的使用经历加以总结。 串口发送数据: 1. 串口发送数据最直接的方式就是标准调用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,549
精华内容 6,619
关键字:

stm32串口接收数据