单片机实现环形队列_单片机模块化程序: 难道有环形队列串口发送数据就万事大吉了吗...

本文介绍了如何使用环形队列解决单片机串口发送数据时可能产生的覆盖问题,通过两个环形队列分别管理发送数据和发送数据个数,确保数据发送间隔,避免数据错误。在中断发送中,通过计数和延时管理,确保每次发送间隔至少10ms。此外,还讨论了这种方法增加内存开销和对printf功能的影响,提出可能的优化方案。
摘要由CSDN通过智能技术生成

1.问个问题,下面程序有没有BUG数组

2.环形队列虽然解决了一开始的中断发送数据覆盖问题,可是呢却引入了新的问题函数

3.而后看看中断发送测试

4.想没想明白是什么问题spa

5.发送数据1 和发送数据2 之间没有延时......3d

咱作程序的时候常常碰到各个地方都须要发送串口的数据,可是若是两个发送函数一个先发送完,另外一个紧接着就发送了.......code

这时候就有问题了,发给一个设备,原本都是正确的数据,可是因为这么一整,数据便成了错的了.blog

好如今解决这个问题队列

主要目的就是发送的数据还须要管理一下,让发送的数据之间有时间间隔内存

好,再加个环形队列开发

这个环形队列呢,记录要发送的数据个数

如今就有两个环形队列,

一个环形队列数存储数据,就是咱一开始用的

另外一个环形队列是存储此次要发送的数据个数

那么每次发送数据变为

而后中断发送里面

Usart1ManageSendDatLen记录的是此次发送的数据个数

发送的时候Usart1ManageSendDatLen -- , 变为0,就说明发完了如今的数据了

发送的数据个数是在定时器里面获取

if(USART_GetITStatus(USART1,

实现一个环形队列需要以下步骤: 1. 定义队列数组和队头、队尾指针 ```c #define QUEUE_SIZE 5 unsigned char queue[QUEUE_SIZE]; unsigned char head = 0, tail = 0; ``` 2. 实现入队操作 ```c void enQueue(unsigned char data) { if ((tail + 1) % QUEUE_SIZE == head) // 队列已满 { // 处理队列已满情况 return; } queue[tail] = data; tail = (tail + 1) % QUEUE_SIZE; // 队尾指针后移一位 } ``` 3. 实现出队操作 ```c unsigned char deQueue() { if (head == tail) // 队列为空 { // 处理队列为空情况 return 0; } unsigned char data = queue[head]; head = (head + 1) % QUEUE_SIZE; // 队头指针后移一位 return data; } ``` 4. 测试代码 ```c #include <reg52.h> void enQueue(unsigned char data); unsigned char deQueue(); void main() { unsigned char data; enQueue('A'); enQueue('B'); enQueue('C'); data = deQueue(); data = deQueue(); enQueue('D'); enQueue('E'); data = deQueue(); data = deQueue(); data = deQueue(); data = deQueue(); data = deQueue(); } void enQueue(unsigned char data) { if ((tail + 1) % QUEUE_SIZE == head) // 队列已满 { // 处理队列已满情况 return; } queue[tail] = data; tail = (tail + 1) % QUEUE_SIZE; // 队尾指针后移一位 } unsigned char deQueue() { if (head == tail) // 队列为空 { // 处理队列为空情况 return 0; } unsigned char data = queue[head]; head = (head + 1) % QUEUE_SIZE; // 队头指针后移一位 return data; } ``` 在上述代码中,我们先入队了三个元素,然后出队两个元素,再入队两个元素,最后出队所有元素。运行该代码可以得到以下结果: ``` data = 'A' data = 'B' data = 'D' data = 'E' 队列为空 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值