STM32
直播中

kasdlak

8年用户 1207经验值
擅长:光电显示
私信 关注
[问答]

请问STM32串口如何接收一帧数据?

请问STM32串口如何接收一帧数据?

回帖(1)

李永清

2021-12-9 10:15:13
stm32支持接受单个数据或者一帧数据,若配置单个数据接收中断的话,会出现接收包丢包,数据不完整的情况!因此在stm32的串口中断中,还有一个IDLE中断,用来产生串口接受一帧数据而产生的中断,比如说串口发来n个数据,会产生n次接收中断和一次IDLE中断,因此方便使用者来接收主机发送或者从机返回的数据!
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);
                }       
                                       
}
最终获得需要是数据



举报

更多回帖

发帖
×
20
完善资料,
赚取积分