找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 935|回复: 15
打印 上一主题 下一主题
收起左侧

单片机缓存数据接收满了然后进行平移 代码怎么写?

  [复制链接]
跳转到指定楼层
楼主
ID:302293 发表于 2022-3-8 13:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
   缓存数据接收满了,数据向左移动,代码怎么写
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:401564 发表于 2022-3-8 18:33 | 只看该作者
你说的是接到一个字节的数据,还是说一个数组的数据
向左移动是什么意思
回复

使用道具 举报

板凳
ID:302293 发表于 2022-3-9 08:41 | 只看该作者
Y_G_G 发表于 2022-3-8 18:33
你说的是接到一个字节的数据,还是说一个数组的数据
向左移动是什么意思

是的,比如刷ID卡获取的数据,只存20张的卡号,当刷第21张时,卡号向前移动
回复

使用道具 举报

地板
ID:415064 发表于 2022-3-9 09:01 | 只看该作者
把前面的干掉或者覆盖
回复

使用道具 举报

5#
ID:827243 发表于 2022-3-9 09:15 | 只看该作者
这种数据结构叫先进先出的队列,一般用数组实现,设定20个元素的数组 qu[20],两个指针,进队指针 pIn 和出队指针 pOut

1. 初始化 pIn = pOut = 0;
2. 入队列  qu[pIn]=data; pIn++; if (pIn>=20) pIn=0;if (pIn==pOut)  队列已满
3. 出队列  if (pIn == pOut) 队列空,无数据可取 else 取出 qu[pOut] ; pOut++; if (pOut>=20) pOut=0;
回复

使用道具 举报

6#
ID:302293 发表于 2022-3-9 10:59 | 只看该作者
daemondong 发表于 2022-3-9 09:15
这种数据结构叫先进先出的队列,一般用数组实现,设定20个元素的数组 qu[20],两个指针,进队指针 pIn 和出 ...

                if(CardNum_Old<20)//没有刷卡记录!!!注意待测试
                        {
                                //原有卡号整体平移
                                if(CardNum_Old>0)
                                {
                                        for(i=0;i<CardNum_Old*6;i++)
                                        {
                                                EEData_Tran=CardNum_Data[(6*CardNum_Old)-i];
                                                CardNum_Data[(6*(CardNum_Old+1))-i]=EEData_Tran;
                                        }
                                }
回复

使用道具 举报

7#
ID:401564 发表于 2022-3-9 11:15 | 只看该作者
5#已经给出答案了,这方法FIFO,你可以想象成一根两头通的管子,东西从这一头放进去,超过管子长度了,就从那一头挤出去了
我不太喜欢思考,如果是我的话,就用两个数组A和B,长度为20,A数组满了就把这个数组的数据覆盖到B,再把A清除,B数组保持有一组
整体下来就是保持有20-40个数据
用结构的话,就直接B=A;就完成了数据的复制了
回复

使用道具 举报

8#
ID:302293 发表于 2022-3-9 11:34 | 只看该作者
daemondong 发表于 2022-3-9 09:15
这种数据结构叫先进先出的队列,一般用数组实现,设定20个元素的数组 qu[20],两个指针,进队指针 pIn 和出 ...

消息满了往前移动4字节,后面的补上空出的地址
回复

使用道具 举报

9#
ID:884147 发表于 2022-3-9 15:14 | 只看该作者
sr861126 发表于 2022-3-9 08:41
是的,比如刷ID卡获取的数据,只存20张的卡号,当刷第21张时,卡号向前移动

可以考虑移指针而不是移数据,数据一旦存入位置就固定了,只移动指针,新数据永远存在指针为1的位置
回复

使用道具 举报

10#
ID:466505 发表于 2022-3-9 16:34 | 只看该作者
建链表,随意删除插入
回复

使用道具 举报

11#
ID:879809 发表于 2022-3-9 19:31 | 只看该作者
这个问题的答案,都写在《数据结构》这本书里面了,找本看看吧。
回复

使用道具 举报

12#
ID:161164 发表于 2022-3-9 21:33 | 只看该作者
假设每次只移一字节
uchar save_buff[20];

for(i = 0;i<19;i++)
{
save_buff[i] = save_buff[i+1];
}
save_buff[19] = new_data;
回复

使用道具 举报

13#
ID:401564 发表于 2022-3-9 21:57 | 只看该作者
lkc8210 发表于 2022-3-9 21:33
假设每次只移一字节
uchar save_buff[20];

9#已经告诉楼主方法了,但楼主好像不太理解,他又重新发个帖子问........
你这个方法,楼主应该是可以理解的
回复

使用道具 举报

14#
ID:624769 发表于 2022-3-9 22:49 | 只看该作者
用12楼的方法,可以达到你想要的目的, 但是,建议你用5楼的方法, 原因很简单, C语言,在做数组搬移的工作的时候,虽然代码只有寥寥几句,工作量是相当的大的,在460800波特率的前提下,32个字节的数组搬移速度,都跟不上串口的接收的速度。也许你现在的项目,勉强可以用数组搬移,但是,如果缓冲池更大(128字节)? 传输速率更高(2MHz波特率)呢? 所以,出于长远考虑,还是要用 5 楼的方法比较靠谱。
回复

使用道具 举报

15#
ID:962286 发表于 2022-3-10 09:25 | 只看该作者
一个合理FIFO从来都是改变指针指向目标存的值,而不是移数据。
回复

使用道具 举报

16#
ID:824490 发表于 2022-3-10 20:42 | 只看该作者
建一个环形数组缓冲区,每写入一个数据,把指针指向下一个数据,当数组指针下标溢出则返回数组首址。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表