STM32串口环形队列

一 环线队列

在设计串口驱动的过程中,要遵循的两条准则是:
1:尽量的减少程序运行的时间。
2:尽量的减少程序所占用的内存。

单片机相对于电脑来说,单片机的储存空间和电脑的存储空间根本不是一个量级。电脑并不用过多考虑内存的多少,而单片机就需要考虑所写的代码占用了多少内存,是否超过了单片机的存储空间。

本次的学习的环形队列就比较好的解决了这一个问题,顾名思义,是将数据放在一个头尾相接的数组之中,当然这只是想象的,但是代码可以将其实现。

 可以将发送缓冲区建立成一个环形的缓冲区,在这个环形缓冲区内,通过头指针(HostIndex)和尾指针(HostIndex)来定位空白区和数据区。
(1):头指针(HostIndex)指向有数据区的顶部,每次写入数据,都更新头指针,如果到了缓冲区的末端(EndIndex),就自动返回到缓冲区的起始处(StartIndex),直到写入到尾指针处为止,这时缓冲区已经被装满,不能再装入数据。
(2):尾指(TailIndex)针指向有数据区的尾部,当数据发送完毕后,更新尾指针的位置,如果到了缓冲区的末端(EndIndex),就自动返回到缓冲区的起始处(StartIndex),直到遇到头指针为止,这是证明所有的数据已经发送完毕。

如此图

1 实验题目

所以我设计这样一个题目:将未知长度的数组1每隔一段时间,以环线队列的方式全部存入数组2之中。如果这个数组2之中有新数据,就需要串口进行发送,直到发送完毕。

二 程序框图

  首先定义,数组1数据存到数组2 叫做 存。     数组2数据 通过串口发送 叫做  发。

解释一下,首指针在这里表示每存一位数据,首指针就会+1,尾指针同理,每发送一位数据,尾指针就会+1。

每次函数进来,time都会+1,没有到1000时,就会跳过存阶段,就会去判断是否该发送了,具体需要判断 上一次是否发完和发送完成标志位是否为1 (发送已经完成),time达到1000时,就会存数据。

三 代码部分

1 利用 cubemx 生成初始化代码

时钟部分省略,参数根据自己进行调整。

 2 编写模块代码

本次实验使用的是 stm32c8t6 型号单片机

uint16_t   x[10] = {1,2,3,4,5,6,7,8,9,10};  /*假设的数组1*/

uint32_t   time;
uint16_t   buf[16]; 数组2
uint8_t   i;
uint8_t   current = 0; 首指针
uint8_t   prent = 0;  尾指针

/**
 * \brief   环形队列 串口发送
 *
 * \param   [in]  需要发送的数组
 *
 * \retval  无
 */

void UART_CircleTransmit(uint16_t param[])
{
time ++;
if(time > 1000000)
	{
	for(i = 0;i < (sizeof(x) / sizeof(x [0]));i++)
		{
		buf[(current + i)%16] = param[i];
		}
		current=(current + i)%16;
	}
if(current != prent && (USART1->SR & 1<<6))
		{
		USART1-> DR = buf[prent++] ;
		prent = prent%16 ; 
		time = 0;
		}
}

3 测试效果

 这张图是 存完数据,通过串口全部发出之后,存的第二次,从第10位开始存,存到15位之后有从头开始存,将之前的1覆盖掉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值