51单片机串口通信 环形缓冲区队列(FIFO)
来源:互联网 发布:云计算好学么 编辑:程序博客网 时间:2024/06/05 04:22
51单片机串口通信 环形缓冲区队列
最近在做毕业设计刚好涉及到51单片机,简单的研究一下发现51单片机串口只有一个字节的缓存,如果遇到单片机串口中断没有及时处理SBUF的值或者串口中断长时间未退出很容易照成数据丢失,于是就自己写了个缓冲区,代价就是消耗一部分内存空间,时间-空间本来就是一对矛盾体,想减少串口通信中数据丢失问题只能牺牲部分空间,来减少数据通信过程中的丢失问题。
- 核心代码如下所示:
/** 用途: 小内存环形缓冲区(FIFO模式) 作者: 南栀<kellygod95@gmail.com>*/#define BUFFER_MAX 16 //缓冲区大小typedef struct _circle_buffer{ unsigned char head_pos; //缓冲区头部位置 unsigned char tail_pos; //缓冲区尾部位置 unsigned char circle_buffer[BUFFER_MAX]; //缓冲区数组 }circle_buffer;circle_buffer buffer;void bufferPop(unsigned char* _buf){ if(buffer.head_pos==buffer.tail_pos) //如果头尾接触表示缓冲区为空 *_buf=0xFF; else { *_buf=buffer.circle_buffer[buffer.head_pos]; //如果缓冲区非空则取头节点值并偏移头节点 if(++buffer.head_pos>=BUFFER_MAX) buffer.head_pos=0; }}void bufferPush(const unsigned char _buf){ buffer.circle_buffer[buffer.tail_pos]=_buf; //从尾部追加 if(++buffer.tail_pos>=BUFFER_MAX) //尾节点偏移 buffer.tail_pos=0; //大于数组最大长度 制零 形成环形队列 if(buffer.tail_pos==buffer.head_pos) //如果尾部节点追到头部节点 则修改头节点偏移位置丢弃早期数据 if(++buffer.head_pos>=BUFFER_MAX) buffer.head_pos=0;}
考虑到看到此博文的人可能有很多小白并不知道如何使用,在此简单的说一下,假设你已经能进行简单的串口发送接收了,然后串口中断部分可以这样写
void serial1(void) interrupt 4{ if(RI) { bufferPush(SBUF); RI=0; } if(TI) { TI=0; }}
在主程序中我们只需要调用函数就行了如:
void main(){ unsigned char dat ;//读取缓冲区一个字符,如果dat=0xff表示缓冲区为空,所以接收的字符不能有0xff。 bufferPop(&dat);}
bufferPop函数中没调用一次,便从缓冲区取出一个字符,头部指针就会进行偏移,具体看源码并不是很复杂 只是一个数组类型的环形FIFO缓冲区。
有一点要注意的是,如果缓冲区满的话,后面的数据会覆盖最前面的数据。
你可以把缓冲区设置大些,就可以尽可能的减少数据覆盖问题,但是带来的额外问题就是51或者其他系列的单片机RAM是非常小的,并不像PC中缓冲区动不动就1024KB。所以缓冲区设置多大,根据自己需求调整就行了。
0 0
- 51单片机串口通信 环形缓冲区队列(FIFO)
- 环形队列FIFO
- FIFO环形缓冲区的实现
- STM32串口环形缓冲区
- 51单片机串口通信
- 51单片机串口通信
- 51单片机 串口通信
- 缓冲区设计--环形队列
- 缓冲区设计--环形队列
- 环形缓冲区[队列]
- 环形队列FIFO实现方法
- 51单片机之串口通信(一)
- 51单片机串口通信(电脑发送)
- 数据结构-环形队列(FIFO)多字节读写
- 菜鸟单片机随写(51单片机串口通信)
- 环形队列串口(发)应用
- 环形队列串口(收)应用
- 环形队列串口应用
- u-boot之mkconfig分析
- ubuntu16.04 LTS 配置jdk1.8出现的问题
- 优化MYSCHOOL二学期第三章
- (学习总结)鸟哥基础篇第三版:第十八章
- 嵌入式数据库(十一 )
- 51单片机串口通信 环形缓冲区队列(FIFO)
- redis3.0.7源码阅读(六)redis整数集合
- jacob合并几个word文件到一个word文件
- 紫书 例题 7-13 快速幂计算 UVA1374 IDA*搜索
- android 学习笔记8-广播接收者 有序 无序广播 案例
- IOC容器的初始化与依赖注入过程
- LetCode 412
- Oracle DataGuard学习笔记(2)物理Standby的配置
- 4Sum