历史上的今天
今天是:2025年03月06日(星期四)
2019年03月06日 | stm32 环形缓冲区
2019-03-06 来源:eefocus
/*========================ringbuff.H========================================*/
#ifndef __RingBuff__H
#define USER_RINGBUFF 1 //使用环形缓冲区形式接收数据
#if USER_RINGBUFF
/**如果使用环形缓冲形式接收串口数据***/
#define RINGBUFF_LEN 200 /*最好是2^N,此时就可以进行用取模运算 https://www.cnblogs.com/rechen/p/5143841.html*/
#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={0,0,0,TIMEOUT};
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; //接收完成判断
}
}
}
}
史海拾趣
|
好东东共享,Cadence SPB15.7 视频教程第1-7讲(于博士版) 可在线观看,也可以下载。 文件太大,传不上来。 给个地址,自己去下载吧。 http://www.sig007.com/videoclass/107.html http://www.sig007.com/videoclass/108.html http://www.sig007.com/videoclass/109.html http://www.sig007.com/video ...… 查看全部问答> |
|
状况: 使用GPRS拨号的时候。如果直接拔掉设备,那么网络连接图标要很久才能消失。。。 我写了一个Filter驱动看了一下,发现在IRP_MN_SURPRISE_RMOVE之后还有数据包在发送。。等了一些时间才收到IRP_MN_REMOVE.(就延时了)。 我直接在Filter驱 ...… 查看全部问答> |
|
我的情况是这样的:2450 WinCE5.0 唤醒后,机器卡死:除了显示屏显示一静态图像外,系统不响应其他的外设。 通过打印信息知道,与EINT9注册了的那个事件(我命名为Event_EINT9)不断地被置成通知状态。 因此系统就在那个处理中断的线程里循环,导 ...… 查看全部问答> |
|
RT,不知道能不能对地址以外的空间读写的异常来判断一个EEPROM的大小,比如一个8K的,我向8K以外的区域写数据,如果出现异常,而7K区域没异常,我就认为这个EEPROM是8K的,不知道这样行不行… 查看全部问答> |
|
从 容栅数显卡尺 的接口读数据时出现的问题,重点怀疑单片机读数显卡尺数据时出错,有经验者请入,多谢! 本人打算将容栅数显卡尺的输出导出到电脑上进行显示以及进行别的控制. 自己制作了电平转换电路以及单片机的串口传输电路,由单片机进行数据读取,然后通过串口传输给电脑进行显示,但是电脑显示的读数与在示波器上看到的不一致,跳动很大.可以确定单片 ...… 查看全部问答> |




