找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2019|回復(fù): 15
收起左側(cè)

單片機緩存數(shù)據(jù)接收滿了然后進行平移 代碼怎么寫?

  [復(fù)制鏈接]
ID:302293 發(fā)表于 2022-3-8 13:38 | 顯示全部樓層 |閱讀模式
   緩存數(shù)據(jù)接收滿了,數(shù)據(jù)向左移動,代碼怎么寫
回復(fù)

使用道具 舉報

ID:401564 發(fā)表于 2022-3-8 18:33 | 顯示全部樓層
你說的是接到一個字節(jié)的數(shù)據(jù),還是說一個數(shù)組的數(shù)據(jù)
向左移動是什么意思
回復(fù)

使用道具 舉報

ID:302293 發(fā)表于 2022-3-9 08:41 | 顯示全部樓層
Y_G_G 發(fā)表于 2022-3-8 18:33
你說的是接到一個字節(jié)的數(shù)據(jù),還是說一個數(shù)組的數(shù)據(jù)
向左移動是什么意思

是的,比如刷ID卡獲取的數(shù)據(jù),只存20張的卡號,當(dāng)刷第21張時,卡號向前移動
回復(fù)

使用道具 舉報

ID:415064 發(fā)表于 2022-3-9 09:01 | 顯示全部樓層
把前面的干掉或者覆蓋
回復(fù)

使用道具 舉報

ID:827243 發(fā)表于 2022-3-9 09:15 | 顯示全部樓層
這種數(shù)據(jù)結(jié)構(gòu)叫先進先出的隊列,一般用數(shù)組實現(xiàn),設(shè)定20個元素的數(shù)組 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) 隊列空,無數(shù)據(jù)可取 else 取出 qu[pOut] ; pOut++; if (pOut>=20) pOut=0;
回復(fù)

使用道具 舉報

ID:302293 發(fā)表于 2022-3-9 10:59 | 顯示全部樓層
daemondong 發(fā)表于 2022-3-9 09:15
這種數(shù)據(jù)結(jié)構(gòu)叫先進先出的隊列,一般用數(shù)組實現(xiàn),設(shè)定20個元素的數(shù)組 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;
                                        }
                                }
回復(fù)

使用道具 舉報

ID:401564 發(fā)表于 2022-3-9 11:15 | 顯示全部樓層
5#已經(jīng)給出答案了,這方法FIFO,你可以想象成一根兩頭通的管子,東西從這一頭放進去,超過管子長度了,就從那一頭擠出去了
我不太喜歡思考,如果是我的話,就用兩個數(shù)組A和B,長度為20,A數(shù)組滿了就把這個數(shù)組的數(shù)據(jù)覆蓋到B,再把A清除,B數(shù)組保持有一組
整體下來就是保持有20-40個數(shù)據(jù)
用結(jié)構(gòu)的話,就直接B=A;就完成了數(shù)據(jù)的復(fù)制了
回復(fù)

使用道具 舉報

ID:302293 發(fā)表于 2022-3-9 11:34 | 顯示全部樓層
daemondong 發(fā)表于 2022-3-9 09:15
這種數(shù)據(jù)結(jié)構(gòu)叫先進先出的隊列,一般用數(shù)組實現(xiàn),設(shè)定20個元素的數(shù)組 qu[20],兩個指針,進隊指針 pIn 和出 ...

消息滿了往前移動4字節(jié),后面的補上空出的地址
回復(fù)

使用道具 舉報

ID:884147 發(fā)表于 2022-3-9 15:14 | 顯示全部樓層
sr861126 發(fā)表于 2022-3-9 08:41
是的,比如刷ID卡獲取的數(shù)據(jù),只存20張的卡號,當(dāng)刷第21張時,卡號向前移動

可以考慮移指針而不是移數(shù)據(jù),數(shù)據(jù)一旦存入位置就固定了,只移動指針,新數(shù)據(jù)永遠(yuǎn)存在指針為1的位置
回復(fù)

使用道具 舉報

ID:466505 發(fā)表于 2022-3-9 16:34 | 顯示全部樓層
建鏈表,隨意刪除插入
回復(fù)

使用道具 舉報

ID:879809 發(fā)表于 2022-3-9 19:31 | 顯示全部樓層
這個問題的答案,都寫在《數(shù)據(jù)結(jié)構(gòu)》這本書里面了,找本看看吧。
回復(fù)

使用道具 舉報

ID:161164 發(fā)表于 2022-3-9 21:33 | 顯示全部樓層
假設(shè)每次只移一字節(jié)
uchar save_buff[20];

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

使用道具 舉報

ID:401564 發(fā)表于 2022-3-9 21:57 | 顯示全部樓層
lkc8210 發(fā)表于 2022-3-9 21:33
假設(shè)每次只移一字節(jié)
uchar save_buff[20];

9#已經(jīng)告訴樓主方法了,但樓主好像不太理解,他又重新發(fā)個帖子問........
你這個方法,樓主應(yīng)該是可以理解的
回復(fù)

使用道具 舉報

ID:624769 發(fā)表于 2022-3-9 22:49 | 顯示全部樓層
用12樓的方法,可以達到你想要的目的, 但是,建議你用5樓的方法, 原因很簡單, C語言,在做數(shù)組搬移的工作的時候,雖然代碼只有寥寥幾句,工作量是相當(dāng)?shù)拇蟮模?60800波特率的前提下,32個字節(jié)的數(shù)組搬移速度,都跟不上串口的接收的速度。也許你現(xiàn)在的項目,勉強可以用數(shù)組搬移,但是,如果緩沖池更大(128字節(jié))? 傳輸速率更高(2MHz波特率)呢? 所以,出于長遠(yuǎn)考慮,還是要用 5 樓的方法比較靠譜。
回復(fù)

使用道具 舉報

ID:962286 發(fā)表于 2022-3-10 09:25 | 顯示全部樓層
一個合理FIFO從來都是改變指針指向目標(biāo)存的值,而不是移數(shù)據(jù)。
回復(fù)

使用道具 舉報

ID:824490 發(fā)表于 2022-3-10 20:42 | 顯示全部樓層
建一個環(huán)形數(shù)組緩沖區(qū),每寫入一個數(shù)據(jù),把指針指向下一個數(shù)據(jù),當(dāng)數(shù)組指針下標(biāo)溢出則返回數(shù)組首址。
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表