历史上的今天
返回首页

历史上的今天

今天是: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; //接收完成判断

}

}

}

}


推荐阅读

史海拾趣

DEVCON公司的发展小趣事

在竞争激烈的电子行业中,提供优质的服务是赢得客户信任的关键。DEVCON公司深知这一点,因此不断创新服务模式,提升服务质量。公司建立了完善的售后服务体系,为客户提供及时、专业的技术支持和解决方案。同时,公司还积极开展培训活动,提升员工的技能水平和服务意识。这些创新举措赢得了客户的广泛赞誉和信赖,为DEVCON公司的稳定发展提供了有力保障。

Amecon Magnetics公司的发展小趣事

在竞争激烈的电子行业中,品质是企业生存和发展的关键。Amecon Magnetics公司始终将品质管理放在首位,建立了严格的质量管理体系,确保从原材料采购到产品出厂的每一个环节都符合高标准的质量要求。这种对品质的执着追求使得公司的产品赢得了客户的广泛好评和信赖,为公司树立了良好的品牌形象。

Dongguan City Niuhang Electronics Co.LTD公司的发展小趣事

随着公司业务的不断拓展,Dongguan City Niuhang Electronics Co.LTD意识到技术创新的重要性。公司投入大量资金和技术人员,专注于芯片新技术、封装自动化的研究和开发。经过数年的努力,公司成功研发出一系列高性能的二极管、整流器等产品,其中多项技术获得国家级发明专利。这些创新产品不仅提升了公司的市场竞争力,也为公司赢得了业界的广泛认可。

DYMO公司的发展小趣事

在XX世纪XX年代,DYMO公司推出了一款具有划时代意义的标签打印机。这款打印机采用了全新的打印技术,能够打印出清晰、耐用的标签,并且支持多种字体和图案。这一创新技术让DYMO公司在标签打印领域取得了领先地位,并为其后续的产品线奠定了坚实的基础。

台湾稳态公司的发展小趣事

台湾稳态公司在创立之初,便明确了自身的技术发展方向和市场定位。公司创始人凭借在电子行业多年的技术积累和敏锐的市场洞察力,带领团队专注于某一特定领域的研发和生产。通过不断的技术创新和优化,稳态公司逐渐在市场中树立起了自己的技术优势和品牌形象。

广东爱晟电子(exsense)公司的发展小趣事

2020年新冠疫情期间,爱晟电子积极响应政府号召,全力支持抗疫工作。公司不仅向抗疫一线捐赠了防疫物资,还组织员工参与志愿服务。同时,公司还利用自身的技术优势,研发出适用于医疗设备的NTC热敏电阻,为抗击疫情提供了有力支持。这些行动彰显了爱晟电子的社会责任感和担当精神。

问答坊 | AI 解惑

好东东共享,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 ...…

查看全部问答>

linux文件系统的制作

我是在FPGA上移植了linux可是不知道怎么生成文件系统,向大家请教!…

查看全部问答>

TI芯片介绍

我们平时可能只会以芯片的型号来区分DSP,很少关注到芯片后缀的那些字母,但这些后缀的字母有时候和我们的开发也有一定的关系,记得刚开始烧写2812FLASH的时候,总是无法成功,后来咨询了供应商的客服之后,才知道原来我们所使用的芯片是TI推出的比 ...…

查看全部问答>

请教一个关于cancel IRP的问题

状况: 使用GPRS拨号的时候。如果直接拔掉设备,那么网络连接图标要很久才能消失。。。 我写了一个Filter驱动看了一下,发现在IRP_MN_SURPRISE_RMOVE之后还有数据包在发送。。等了一些时间才收到IRP_MN_REMOVE.(就延时了)。 我直接在Filter驱 ...…

查看全部问答>

唤醒后死机了,发现没有中断信号却不断产生中断??

我的情况是这样的:2450 WinCE5.0 唤醒后,机器卡死:除了显示屏显示一静态图像外,系统不响应其他的外设。 通过打印信息知道,与EINT9注册了的那个事件(我命名为Event_EINT9)不断地被置成通知状态。 因此系统就在那个处理中断的线程里循环,导 ...…

查看全部问答>

还是EEPROM,怎么用软件判断EEPROM的大小

RT,不知道能不能对地址以外的空间读写的异常来判断一个EEPROM的大小,比如一个8K的,我向8K以外的区域写数据,如果出现异常,而7K区域没异常,我就认为这个EEPROM是8K的,不知道这样行不行…

查看全部问答>

从 容栅数显卡尺 的接口读数据时出现的问题,重点怀疑单片机读数显卡尺数据时出错,有经验者请入,多谢!

本人打算将容栅数显卡尺的输出导出到电脑上进行显示以及进行别的控制. 自己制作了电平转换电路以及单片机的串口传输电路,由单片机进行数据读取,然后通过串口传输给电脑进行显示,但是电脑显示的读数与在示波器上看到的不一致,跳动很大.可以确定单片 ...…

查看全部问答>

关于ATmega128的一个问题,希望大家帮我看看,谢谢

unsigned char SMSCenterID[11]=\"13800200500\";  这个句子怎样修改啊…

查看全部问答>