完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
/*========================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={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; //接收完成判断 } } } } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1561 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1501 浏览 1 评论
933 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
665 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1555 浏览 2 评论
1847浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
609浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
503浏览 3评论
507浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
488浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-10 15:14 , Processed in 0.523847 second(s), Total 45, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号