#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 判斷環形緩...