精华内容
下载资源
问答
  • hal库实现stm32串口中断接收数据

    千次阅读 2020-12-01 14:14:21
    先设置并开启串口中断接收 该函数功能为开启串口接收中断,并指定存储接收数据的缓存区,设置从串口接收的数据大小。这里要特别注意,该函数只有从串口接收到Size个数据后才会返回,不然会阻塞。 HAL_UART_Receive_...

    stm32cubemx设置中断和异步通信模式。
    在这里插入图片描述

    先设置并开启串口中断接收
    该函数功能为开启串口接收中断,并指定存储接收数据的缓存区,设置从串口接收的数据大小。这里要特别注意,该函数只有从串口接收到Size个数据后才会返回,不然会阻塞。

    HAL_UART_Receive_IT(&huart1, multiInOne.uartBuffer[0].rxdBuf, 5);

    接收中断处理函数设置再次使能串口中断接收:
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    {
    if(huart->Instance == USART1)
    {
    HAL_UART_Receive_IT(multiInOne.uartBuffer[0].huartHandle, multiInOne.uartBuffer[0].rxdBuf, 5);
    }
    }

    串口最容易犯的错误是波特率设置错误,所以切记切记,波特率要设置正确。

    注意:如果加奇偶校验位,需要设置数据位为9位数据位。另外还要注意是MSB先发送还是LSB先发送。
    如:
    数据结构是“起始位(1比特)+数据(8比特)+偶奇偶校验(1比特)+止动位(1比特)”,通过LSB第1发送。
    在这里插入图片描述

    展开全文
  • STM32串口中断接收方式对于初学者有一定帮助STM32串口中断是最简单的
  • 该程序编写了STM32F103三个串口初始化程序,可快速调用,同时支持接收和发送单个字符和多个字符,并存储数据,方便接收数据后的通信协议校验,支持自定义接收数据最大长度,重写printf函数。
  • 本人目前在写一个32串口中断接收数据的程序,想把一串数据比如:A4 A2 A3 A4 A4...接收并存到一个数组中作数据分析,现在卡在了中断接收这一块,把数据接收到数组get_ch[8]之后,不能在主程序中使用这个数组并且进行...
  • 本例程通过PC机的串口调试助手将数据发送至STM32接收数据后将所接收的数据又发送至PC机,具体下面详谈
  • 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
    	}
    	 
    }

     

     

     

     

     

     

     

    展开全文
  • 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串口中断接收和中断发送

    万次阅读 多人点赞 2016-03-12 15:12:14
    STM32串口USART1中断接收和中断发送 先贴出中断函数: void USART1_IRQHandler(void){  if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {  USART_ClearITPendingBit(USART1, USART_IT_RX

    STM32串口USART1中断接收和中断发送


    先贴出中断函数:

    void USART1_IRQHandler(void){
            if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
                     USART_ClearITPendingBit(USART1, USART_IT_RXNE);
                     USART1_Buffer[i++]=USART_ReceiveData(USART1);  //USART1_Buffesh是一个自己定义的接收数组
                     if(i>3){
                          SendFlag = 1;
                     }
             }
            if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET){    //USART_IT_TC这里也可替换
                    if(Open_Send_Flag){     //这是一个发送的标志
                          uart1_sendstring(temp_data);
                         USART_ITConfig(USART1, USART_IT_TXE, DISABLE);   //USART_IT_TC
                         Open_Send_Flag = 0;
                     }
                    else{
                         USART_ITConfig(USART1, USART_IT_TXE, DISABLE);   //USART_IT_TC
                     }
             }
    }

    发送字符串的函数:

    void uart1_sendstring(uint8_t* cp)
    {
        while((*cp)!='\0')
        {
            Usart1_Send_isr(*cp);
            cp++;
        }
    }

    发送单个字符的函数:

    void Usart1_Send_isr(uint8_t ch){
         USART_SendData(USART1, (uint8_t)ch);
         while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET ); //这里做缓冲区是否发送完判断
    }

    然后在中断函数外面发送数据的时候,打开发送中断。USART_ITConfig(USART1, USART_IT_TXE, ENABLE);    //USART_IT_TC

    之后再贴出两个简单的串口接收和发送的测试小例子:


    第一种: 中断接收并把接收到的数据直接发送。
    void USART1_IRQHandler(void){
          unsigned char RxData;
          if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
                USART_ClearITPendingBit(USART1, USART_IT_RXNE);
                RxData=USART_ReceiveData(USART1); 
                RxData = RxData + 1;
               USART_SendData(USART1,RxData);
          }
    }

    优点:简单,适合很少量数据传输。
    缺点:无缓存区,并且对数据的正确性没有判断,数据量稍大可能导致数据丢失 。

    第二种: 中断接收之后判断数据头和数据尾,如果正确就直接发送出去。
    void USART1_IRQHandler(void){
    
    
     if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
           USART_ClearITPendingBit(USART1, USART_IT_RXNE);
           USART1_Buffer[i++]=USART_ReceiveData(USART1); 
       }
     if((USART1_Buffer[0] == 0x01) && (USART1_Buffer[i-1] == 0x02)){
          Flag = 1;
     }
     if(USART_GetFlagStatus(USART1,USART_FLAG_ORE) == SET){  //溢出,不明白?
      USART_ClearFlag(USART1,USART_FLAG_ORE);
      USART_ReceiveData(USART1); 
     }
     if(Flag){
      for(j = 0;j<20;j++){
            USART_SendData(USART1,USART1_Buffer[j]);
      }
     }
    }


    展开全文
  • 简介:STM32与上位机之间用通信协议(自己定义)进行串口通信。怎么判断上位机发过来的指令是正确的,而不是一串乱码?怎么从正确的指令中提取出想要的命令代号,从而实现想要的功能? 方法:读取上位机发来的命令,...
  • STM32 串口中断 接收ASCII码整数 转换为 多位整形数据 maixpy IDE 写K210的串口发送函数,数据会以ASCII码的形式发送出来 下面的代码K210发送的是一个不大于三位数的ASCII码数据,使用STM32串口中断服务函数进行接收...
  • STM32串口中断接收实验的详细说明准备代码实现总结 准备 材料:STM32F407ZGT6最小系统板,串口1通过跳线帽连接到了CH340上。 需求:从电脑向板子的串口1发送一个字符串(以回车和换行结尾,字符串末尾两个字符为0x0...
  • STM32串口中断接收实验(HAL库)

    万次阅读 2018-09-10 20:11:39
    简介:STM32与上位机之间用通信协议(自己定义)进行串口通信。怎么判断上位机发过来的指令是正确的,而不是一串乱码?怎么从正确的指令中提取出想要的命令代号,从而实现想要的功能? 方法:读取上位机发来的命令...
  • STM32 串口中断总结

    万次阅读 多人点赞 2017-12-25 17:03:17
    本文以USART1为例,叙述串口中断的编程过程。 1、先来讲述一下在应用串口中断时涉及到的一些库文件。 首先对于STM32外设库文件的应用编程,misc.c和stm32f10x_rcc.c是肯定要添加到。 接下来就是我们要用到的相关...
  • 简介:STM32与上位机之间用通信协议(自己定义)进行串口通信。怎么判断上位机发过来的指令是正确的,而不是一串乱码?怎么从正确的指令中提取出想要的命令代号,从而实现想要的功能?(闲来无事,写个玩玩,原创!第...
  • STM32实现中断超时接收不定长度的数据,写入flash读出并返回
  • 【背景】 芯片:STM32L071CBT6 MX生成的库函数为固定长度接收,不能随时接收不定长数据: 【处理】 在user_code区域添加cpc_RxIRQHandler(); 屏蔽原来的中断函数: 【特别...
  • 对于串口中断函数USART_RX_STA接收标记位解析,费话不多说了,直接上代码。 #define USART1_REC_LEN 200 u8 USART1_RX_BUF[USART1_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节. //接收状态 //bit15, 接收完成...
  • STM32串口中断测试, 已通过串口调试助手测试,可按照规定格式接收数据
  • STM32串口中断接收一个完整的数据

    万次阅读 2017-08-19 16:41:12
    (2) 上位机发送一帧数据的时间间隔不能大于主循环周期; (3)数据帧满足下面格式:  帧头部(Head) 类型(Type) 长度(Length) 值(Value) CRC校验 2字节 1...
  • STM8 串口中断接收例程.有需要的下载
  • 自己实现STM32串口中断接收服务函数

    千次阅读 2020-04-12 15:12:20
    重写串口中断服务函数 void USART6_IRQHandler(void) { uint32_t isrflags = READ_REG(huart6.Instance->SR); uint32_t cr1its = READ_REG(huart6.Instance->CR1); uint32_t errorflags = 0x00U; uint8_t dump; ...
  • stm32串口接收中断

    热门讨论 2012-11-06 21:39:32
    stm32串口接收中断 很好使用的 可以接收一连串的字符 比例程好用

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,993
精华内容 4,397
关键字:

stm32串口中断接收数据