stm32 環形緩衝區

2021-09-01 12:55:12 字數 3122 閱讀 1642

/*********************====ringbuff.h*****************************************/

#ifndef __ringbuff__h

#define user_ringbuff 1 //使用環形緩衝區形式接收資料

#if user_ringbuff

/**如果使用環形緩衝形式接收串列埠資料***/

#define ringbuff_len 200 /*最好是2^n,此時就可以進行用取模運算

#define flase 1

#define true 0

#define timeout 3

typedef struct

u16 head; //消費者模型,從隊頭刪除

u16 tail; //生產者模型,從隊尾新增

u16 lenght; //接收資料的長度為ringbuff.lenght=ring_buff.tail-ring_buff.head

u8 ring_buff[ringbuff_len];

}ringbuff_t;

typedef struct

bool btimeoutcounten;

bool btimeout;

u16 timeoutcount;

u16 timelimt; //一般為幾個字元傳送的時間

}timeout_t;

void ringbuff_init(void);

u8 write_ringbuff(u8 data);

u8 read_ringbuff(u8 *rdata);

#endif //end of user_ringbuff

#endif //end of __ringbuff__h

/*********************====ringbuff.c*****************************************/

#include "ringbuff.h"

ringbuff_t ringbuff;//建立乙個ringbuff的緩衝區

timeout_t rcvtimeout=;

void ringbuff_init(void)

//初始化相關資訊

ringbuff.head = 0;

ringbuff.tail = 0;

ringbuff.lenght = 0;

* 說明:被接收中斷函式呼叫

u8 write_ringbuff(u8 data)

#if 0

//if((ringbuff.tail -ringbuff.head)== ringbuff_len) //判斷緩衝區是否已滿

if(ringbuff.lenght== ringbuff_len)

return flase;

ringbuff.ring_buff[(ringbuff.tail++)&(mringbuff_len-1)] = data //前提.tail和.head資料型別是unsigned int,且mringbuff_len是2的詞冪,ringbuff.lenght=ring_buff.tail-ring_buff.head

#else

if(ringbuff.lenght >= ringbuff_len) //判斷緩衝區是否已滿

return flase;

ringbuff.ring_buff[ringbuff.tail]=data;

ringbuff.tail = (ringbuff.tail+1)%ringbuff_len;//防止越界非法訪問

#endif

ringbuff.lenght++;

return true;

u8 read_ringbuff(u8 *rdata)

#if 0

//if((ringbuff.tail -ringbuff.head)== 0) //判斷緩衝區是否已空

if(ringbuff.lenght==0)

return flase;

*rdata =ringbuff.ring_buff[(ringbuff.head++)&(mringbuff_len-1)]; //前提.tail和.head資料型別是unsigned int,且mringbuff_len是2的詞冪,ringbuff.lenght=ring_buff.tail-ring_buff.head

#else

if(ringbuff.lenght == 0)//判斷非空

return flase;

*rdata = ringbuff.ring_buff[ringbuff.head];//先進先出fifo,從緩衝區頭出

ringbuff.head = (ringbuff.head+1)%ringbuff_len;//防止越界非法訪問

#endif

ringbuff.lenght--;

return true;

void usart1_irqhandler(void)

if(usart_getitstatus(usart1, usart_it_rxne) != reset) //接收中斷

usart_clearitpendingbit(usart1,usart_it_rxne); //清楚標誌位

write_ringbuff(usart_receivedata(usart1)); //讀取接收到的資料

rcvtimeout.btimeoutcounten =1;

rcvtimeout.timeoutcount=0;

void tim3_irqhandler(void)

if (tim_getitstatus(tim3, tim_it_update) != reset) //檢查指定的tim中斷發生與否:tim 中斷源

tim_clearitpendingbit(tim3, tim_it_update );

if(rcvtimeout.btimeoutcounten)

if(++rcvtimeout.timeoutcount == rcvtimeout.timelimt)

rcvtimeout.btimeoutcounten=0;

rcvtimeout.timeoutcount=0;

rcvtimeout.btimeout=1; //接收完成判斷

STM32串列埠環形緩衝區

目錄 1 概述 2 1 概述 1.1 本篇實現串列埠驅動,實現printf函式的重定向,實現串列埠的中斷接受和傳送,效仿modbus協議中的3.5t超時機制,判斷是否接受完畢 1.2 如果串列埠僅僅是實現乙個控制台,列印一些debug資料,使用printf函式 串列埠傳送資料忙等待 如果是需要用串列...

環形緩衝區

include include include include include define buffsize 1024 1024 define min x,y x y x y pthread mutex t lock pthread mutex initializer struct cycle b...

環形緩衝區

define print buf size 16 1024 static char g pcnetprintbuf 環形緩衝區的首位址 static int g ireadpos 0 環形緩衝區讀的位置 static int g iwritepos 0 環形緩衝區寫的位置 intinit 判斷環形緩...