|
发表于 2016-10-5 11:57:01
|
显示全部楼层
本帖最后由 circle_head 于 2016-10-5 21:54 编辑
最近真好想要学这个呢,看了下程序,在这里总结一下自己对环形队列的理解。
1 楼主的环形队列中规定了一个数据长度,相当于开辟了一个缓存区,也就是定义了一个长度为16的数组
2 当第一次有串口数据到来的时候,接收的数据首先存储在数组的第一位,再来的数据依次往后存储,程序中也会记录下接收数据的个数 ucRXCharCount 也会记录下缓存数组中最后接收数据的位置ucRXWriteIndex(无论如何 一次性 接收的数据不能大于数组的长度,否则最先接收的数据会被覆盖),一次性收的数据要小于等于16(如果想要多的可以增长数组)。
3 缓存数据的使用: 首先 主函数中会将缓存中的数据依次读出,读出了n位数就用ucRXCharCount减去n ,并且也会记录下从缓存中读到了第几位ucRXReadIndex 。在读出数据并使用的过程中若有新的串口数据过来。 缓存会在原来接收数据的位置ucRXWriteIndex的
基础上依次增加,超过数组长度时就从数组的首地址开始增加,接收的个数也要增加。
我的理解基本就是这样的,,,,,
补充一点nos002的解释
ucTXWriteIndex &= TXBUFSIZE-1; // adjust index to borders of buffer
这个指针算法好,比%高效太多了,队列长度定义成2^N |
|