环形缓冲区简介 STM32环形缓冲区示例,环形缓冲区

环形缓冲区简介
在单片机中串口通信是我们使用最频繁的,使用串口通信就会用到串口的数据接收与发送,环形缓冲区方式接收数据可以更好的保证数据丢帧率第。
在通信程序中,经常使用环形缓冲器作为数据结构来存放通信中发送和接收的数据。环形缓冲区是一个先进先出的循环缓冲区,可以向通信程序提供对缓冲区的互斥访问。
环形缓冲区的一个有用特性是:当一个数据元素被用掉后,其余数据元素不需要移动其存储位置。相反,一个非圆形缓冲区(例如一个普通的队列)在用掉一个数据元素后,其余数据元素需要向前搬移。换句话说,环形缓冲区适合实现先进先出缓冲区,而非环形缓冲区适合后进先出缓冲区。

STM32环形缓冲区示例

串口配置示例

#include "usart.h"/********************串口初始化函数封装*************************硬件接口:USART1_TX -- PA9(发送)**USART1-RX --PA10(接收)**USART2_TX -- PA2(发送)**USART2-RX --PA3(接收)**USART3_TX -- PB10(发送)**USART3_RX -- PB11(接收)形参:USART_TypeDef *USARTx -- 要配置的哪个串口**u32 baud --波特率**u32 sysclk --时钟频率(USART1 --72MHZ ,USAT2\USART3 --36MHZ)*************************************************************/void Usartx_Init(USART_TypeDef *USARTx,u32 baud,u32 sysclk){if(USART1 == USARTx){/*1.开时钟*/RCC->APB2ENR|=1CRH|=0x000008B0;//上下拉输入,复用推挽输出#ifdef USART1_IQRUSART1->CR1|=1CRL|=0x00008B00;#ifdef USART2_IRQUSART2->CR1|=1CRH|=0x00008B00;#ifdef USART3_IRQUSART3->CR1|=1CR1|=1SR&1SR&1<<7)){}return>中断接收数据 - - 环形缓冲区接收

/********************串口接收数据结构体********************/#define USART1_LEN 200 //缓冲区大小typedef struct {char buff[USART1_LEN];//缓冲区 u8 usart1_rx_len;//保存的数据长度 u8 usart1_flag;//数据接收完成标志u8 w;//写u8 r;//读}USART1_RX;USART1_RX USART1_rx={{0},0,0,0,0};//串口接收数据缓冲区初始化void USART1_IRQHandler(void){u8 c;if(USART1->SR&1CR1|=1

读取缓冲区数据

/**********************从缓冲区读取数据**********************形参:u8 *tx_data -- 读取数据保存地址***********************************************************/u8 Usart1_Annular_txdata(u8 *tx_data){ u8 len=0; //缓冲区为空 或者 USART1_rx.usart1_flag 数据接收完成标志(为了兼容字符串接收处理) if(USART1_rx.usart1_rx_len==0 || USART1_rx.usart1_flag==0)return 0; while(USART1_rx.usart1_rx_len) { *tx_data=USART1_rx.buff[USART1_rx.r];//读取缓冲区数据 USART1_rx.r= (USART1_rx.r+1)%USART1_LEN; USART1_rx.usart1_rx_len--;//缓冲区长度-1 tx_data++; len++; } USART1_rx.usart1_flag=0;//清除标志位 *tx_data='\0';//接收到的字符保存为字符串 return len;//返回读取到的字符个数}

主函数

#include "stm32f10x.h"#include "usart.h"#include "led.h"#include "timer.h"u8 buff[200];int main(){ u8 stat=0;Led_Init();//LED初始化Usartx_Init(USART1,115200,72);TIMx_Init(TIM2,72,20000);//通过定时器2辅助串口接收数据,20msprintf("串口初始化完成\r\n");/*轮询*/while(1){ stat=Usart1_Annular_txdata(buff); if(stat) { Usartx_SendString(USART1,buff,stat); }}}

审核编辑:汤梓红

相关推荐

相关文章