打印
[其他ST产品]

stm32循环buffer数据处理实例

[复制链接]
341|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
接着上次的《stm32实用循环buffer》,给大家提供一个参考实例,根据实际情况改改就能用。
/******************************************************************************
* [url=home.php?mod=space&uid=288409]@file[/url]         : usart2.c
* [url=home.php?mod=space&uid=187600]@author[/url]   : qianxin.chen@qq.com
* [url=home.php?mod=space&uid=895143]@version[/url]  : V0.0.1
* [url=home.php?mod=space&uid=212281]@date[/url]         : 20-February-2020
* @Brief        : This file provides all the usart2 functions.
******************************************************************************
* @Attention:
* Non
*
******************************************************************************/
/* Includes -----------------------------------------------------------------*/
#include "includes.h"
#include "usart2.h"
#include "fifo.h"        //fifo头文件
#include "crc.h"        //用于校验
#include "usart1.h"        //用于printf打印

/* Define -------------------------------------------------------------------*/
#define USART2_FIFO_LEN 64
#define FRAME_HEAD1 0xAA
#define FRAME_TAIL1 0x55
#define FRAME_TAIL2 0x55       
#define FRAME_LEN 5
#define complement(a) (FRAME_LEN-a)

/* Variables ----------------------------------------------------------------*/
struct fifo fifo2;
static unsigned char copy_len = FRAME_LEN;
#ifdef FIX_BUFFER //用于区分固定分配或动态分配buffer
unsigned char fifo_buf[USART2_FIFO_LEN];
#endif

/* Functions ----------------------------------------------------------------*/
/* must init this function */
void init_usart2_fifo(void)
{       
        signed int ret;
       
        ret = fifo_alloc(&fifo2, USART2_FIFO_LEN);
#ifdef FIX_BUFFER
        ret = fifo_init(&fifo2, fifo_buf, USART2_FIFO_LEN);
#endif
        if(ret<0){
                printf("fifo2 alloc fail!\n");
        }
}

void usart2_Init(u32 bound)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);        
       
        USART_DeInit(USART2);        
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;       
        GPIO_Init(GPIOA, &GPIO_InitStructure);
   
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);

        USART_InitStructure.USART_BaudRate = bound;
        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(USART2, &USART_InitStructure);
        USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);

        USART_Cmd(USART2, ENABLE);
}

void usart2_send_data(u8 *sdata, u8 len)
{
        u8 i;
       
        GPIO_ResetBits(GPIOA, GPIO_Pin_4);
        USART_ClearFlag(USART2,USART_FLAG_TC);
        for(i=0;i<len;i++)
                {
                USART_SendData(USART2, sdata[i]);
                while(USART_GetFlagStatus(USART2, USART_FLAG_TC)!=SET);
        }
        GPIO_SetBits(GPIOA, GPIO_Pin_4);
}

void USART2_IRQHandler(void)
{
        unsigned int ret;
        unsigned char buf[1];
       
        OSIntEnter();        //如果没有用ucos屏蔽此行
        if(USART_GetITStatus(USART2, USART_IT_RXNE)!= RESET){       
                USART_ClearITPendingBit(USART2,USART_IT_RXNE);
                buf[0] = USART_ReceiveData(USART2);
                ret = fifo_in(&fifo2, buf, 1);
                if(ret<1){
                   printf("fifo2 in err!\n");
                }         
         }
         OSIntExit();        //如果没有用ucos屏蔽此行
}

/* 在buffer中查找、校验符合条件的帧数据 */
void usart2_data_handler(void)
{
        unsigned int len;
        unsigned char buf[FRAME_LEN];
        /* 执行到这里的时候,只要有数据就循环处理,直到处理完数据 */
        while((fifo_used(&fifo2))>((copy_len))){
                len = fifo_out(&fifo2, buf+complement(copy_len), (copy_len));        //fifo中提取需要的长度字节
                if(len <1){
                        printf("usart2 fifo out err!\n");
                }
                /* 校验帧头、帧尾、和crc校验 */
                //if(buf[0] == FRAME_HEAD1 && buf[FRAME_LEN-1]==FRAME_TAIL1 && buf[FRAME_LEN-1]==FRAME_TAIL2
                //&& (buf[sizeof(buf)-2] == crc8_maxim(buf+CRC_OFFSET, (sizeof(buf)-SIZE_SUB+1)))){
                /* 只校验帧头、帧尾 */
                if(buf[0] == FRAME_HEAD1 && buf[FRAME_LEN-1]==FRAME_TAIL1 && buf[FRAME_LEN-1]==FRAME_TAIL2){
                        copy_len=FRAME_LEN;
                        {
                                /* 帧数据处理 */
                        }
                        continue;
                }
                else{
                        /* 不符合帧数据条件,循环查找帧头,并把找到的帧头移动到buf的前面,下次提取的数据附加在后边 */                       
                        for(copy_len=1;copy_len<FRAME_LEN;copy_len++){
                                if(buf[copy_len] == FRAME_HEAD1){
                                        memcpy(buf,buf+copy_len,(complement(copy_len)));
                                  break;
                                }
                        }
                }
        }
}




使用特权

评论回复
沙发
怎么总是重复啊|  楼主 | 2021-12-31 23:40 | 只看该作者
头文件:

/*******************************************************************************
* @File         : usart.h
* @Author   : qianxin.chen@qq.com
* @Version  : V0.0.0
* @Date         : 20-February-2016
* @Brief        : This file provides all the write internal usart2 functions.
********************************************************************************
* @Attention:
* Non
*
*******************************************************************************/

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef _USART2_H
#define _USART2_H
#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include "includes.h"

/* function prototypes -------------------------------------------------------*/
void init_usart2_fifo(void);         
void usart2_Init(u32 bound);
void usart2_send_data(u8 *sdata,u8 len);
void USART2_IRQHandler(void);
void usart2_data_handler(void);

#ifdef __cplusplus
}
#endif
#endif

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

174

帖子

0

粉丝