欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 單片機(jī)串口收到的數(shù)據(jù)大于緩沖區(qū)怎么辦? [打印本頁(yè)]

作者: nanshancc    時(shí)間: 2022-8-17 20:10
標(biāo)題: 單片機(jī)串口收到的數(shù)據(jù)大于緩沖區(qū)怎么辦?
stc89c516RD+單片機(jī)開發(fā)板
好像ram就只有1280B, 就是1k多一點(diǎn)

想通過esp8266訪問網(wǎng)絡(luò)文件下載下來(lái)(到sd卡里),就一個(gè)http響應(yīng)頭就占了幾百字節(jié)
我的緩沖區(qū)是256字節(jié)(加上其他數(shù)據(jù),很容易就把ram占滿了),做成環(huán)形那種的
不過服務(wù)端隨便返回一點(diǎn)數(shù)據(jù)加上http頭,就超過256字節(jié)了,就是說buffer接收到的已經(jīng)不是完整的了,即使不斷循環(huán)讀取,也可能讀不完整的是嗎?要下載的文件是10M左右的,這可怎么辦,是不是要高檔一點(diǎn)的stm32才行呀?已經(jīng)買了好多東西,沒銀子了

作者: xuyaqi    時(shí)間: 2022-8-18 06:13
先用簡(jiǎn)單單片機(jī)學(xué)習(xí)簡(jiǎn)單應(yīng)用,基礎(chǔ)好了再學(xué)復(fù)雜應(yīng)用。
作者: 小黑屋525    時(shí)間: 2022-8-18 08:37
51單片機(jī)確實(shí)資源不太夠,不過可以替換成最新的STC8或者STC32這種資源應(yīng)該就夠用了,程序向下兼容,不需要怎么改,價(jià)格也不是很貴。
作者: Y_G_G    時(shí)間: 2022-8-18 08:52
STC8A8K64D4
8K的SRAM,還有MDA
STC32
12K的SRAM,32位單片機(jī)
作者: 學(xué)mcu的菜雞    時(shí)間: 2022-8-18 08:59
啊,我當(dāng)初是直接使用esp32玩的,從聯(lián)網(wǎng)到控制全部能實(shí)現(xiàn);當(dāng)然我控制所需的IO不多
作者: coody_sz    時(shí)間: 2022-8-18 10:01
換STC8H8K64U或STC32G12K128吧,速度快10倍以上,內(nèi)存分別為8K和12K。
作者: cccc888    時(shí)間: 2022-8-18 11:32
邊讀邊分析,不是合適的信息就舍棄,遇到包頭后,把后面的信息記錄。
如果采集公共信息(如電腦上可以訪問的天氣信息網(wǎng)頁(yè)),也可以這樣做。
如chrome瀏覽器,右鍵檢查。一般網(wǎng)頁(yè)的元素的class和id是唯一的,即不重名

1.jpg (28.84 KB, 下載次數(shù): 21)

1.jpg

作者: Hephaestus    時(shí)間: 2022-8-18 14:07
真缺$$$就學(xué)著用esp8266開發(fā)啊!

esp8266有兩種玩兒法,一種是把他當(dāng)成串口轉(zhuǎn)WiFi模塊,你顯然是用的這種,很簡(jiǎn)單容易上手。

還有一種玩兒法,把8266當(dāng)成是帶WiFi功能的單片機(jī),你會(huì)發(fā)現(xiàn)8266的性能和資源不知道比你現(xiàn)在用的死忒慘好到哪里去了,缺點(diǎn)是沒有仿真器,只能盲測(cè),看看好不好用,反正你現(xiàn)在的單片機(jī)也沒有仿真器。
作者: 已經(jīng)解散    時(shí)間: 2022-8-19 10:18
外擴(kuò)內(nèi)存模塊
作者: zilihangjian    時(shí)間: 2022-8-19 20:05
外加RAM和rom 有專門的RAM rom芯片
作者: aide51    時(shí)間: 2022-8-20 21:58
其實(shí)用stc的12系列也是很不錯(cuò)的。
作者: rayin    時(shí)間: 2024-10-9 08:11
現(xiàn)在STC有新的51單片機(jī)增加了內(nèi)存了, 再也不用擔(dān)心緩存不夠了. AI8051U, 2K data +32K xdata, 又多了ic選型哦.

作者: hezezeze    時(shí)間: 2024-10-9 16:19
你遇到的問題很常見,因?yàn)閱纹瑱C(jī)內(nèi)存有限,處理大量數(shù)據(jù)確實(shí)很困難。你的思路是對(duì)的,環(huán)形緩沖區(qū)是常用的方法,但是對(duì)于大文件下載,它就力不從心了。  以下幾點(diǎn)分析和建議:  內(nèi)存限制: STC89C516RD+的RAM只有1280B確實(shí)比較小,即使使用環(huán)形緩沖區(qū)也無(wú)法容納完整的 HTTP 響應(yīng)頭和文件數(shù)據(jù)。 HTTP協(xié)議的特性: HTTP 協(xié)議使用分塊傳輸,數(shù)據(jù)會(huì)分成多個(gè)塊,每個(gè)塊都帶有自己的頭信息,這會(huì)導(dǎo)致數(shù)據(jù)接收變得復(fù)雜。 文件大小問題: 10M 的文件對(duì)單片機(jī)來(lái)說確實(shí)比較大,需要精心設(shè)計(jì)才能完成下載。 解決方法:  升級(jí)單片機(jī): 你的想法是對(duì)的,使用內(nèi)存更大的單片機(jī),例如 STM32 就可以有效解決這個(gè)問題。STM32 有多種型號(hào),可以根據(jù)你的需求選擇合適的型號(hào),例如 STM32F103ZET6 有 64 KB 的 Flash 和 20 KB 的 RAM,足以處理你的下載任務(wù)。 使用 SD 卡直接存儲(chǔ): 你可以將數(shù)據(jù)直接寫入 SD 卡,避免使用大量 RAM。但是,你需要考慮 SD 卡的讀寫速度和性能,可能需要進(jìn)行一些優(yōu)化才能提高效率。 分段下載: 將文件分成多個(gè)小塊,每次只下載一小塊數(shù)據(jù),并將數(shù)據(jù)存儲(chǔ)到 SD 卡中。可以使用 HTTP 的 Range 頭來(lái)指定下載的范圍。 優(yōu)化代碼: 仔細(xì)優(yōu)化代碼,減少內(nèi)存占用,例如使用更小的數(shù)據(jù)類型,壓縮數(shù)據(jù)等等。 使用外部 RAM: 如果你想繼續(xù)使用 STC89C516RD+,可以考慮使用外部 RAM 來(lái)擴(kuò)展內(nèi)存,但是需要額外增加一些硬件電路。 建議方案:  使用 STM32 單片機(jī): 這可能是最簡(jiǎn)單、最有效的解決方案。 使用 SD 卡直接存儲(chǔ): 如果你想要繼續(xù)使用 STC89C516RD+,可以使用 SD 卡直接存儲(chǔ)數(shù)據(jù),但是需要考慮 SD 卡的性能和效率。 其他注意事項(xiàng):  數(shù)據(jù)校驗(yàn): 在下載過程中,需要進(jìn)行數(shù)據(jù)校驗(yàn),以確保數(shù)據(jù)的完整性。 錯(cuò)誤處理: 需要處理下載過程中可能出現(xiàn)的錯(cuò)誤,例如網(wǎng)絡(luò)連接斷開、數(shù)據(jù)傳輸錯(cuò)誤等等。 最后,建議你根據(jù)自己的需求選擇合適的方案,并根據(jù)方案進(jìn)行代碼設(shè)計(jì)和實(shí)現(xiàn)。
作者: hezezeze    時(shí)間: 2024-10-9 16:20
關(guān)于 STC89C516RD 和 ESP8266 結(jié)合使用 SD 卡下載文件時(shí)的 RAM 限制問題,以下是一些詳細(xì)的信息。

首先,STC89C516RD 是一款單片機(jī),其內(nèi)存配置有一定的限制。該單片機(jī)的內(nèi)部 RAM 可以達(dá)到 256 字節(jié),而外部 RAM 可通過 ALE 腳擴(kuò)展。這一限制可能會(huì)影響你在處理大型文件時(shí)的存儲(chǔ)能力,尤其是在進(jìn)行 SD 卡數(shù)據(jù)讀寫操作時(shí)。

ESP8266 是一種廣泛使用的 Wi-Fi 模塊,適用于各種物聯(lián)網(wǎng)項(xiàng)目。其內(nèi)置的 RAM 相對(duì)較小(通常為 80 KB),在處理文件操作時(shí),特別是當(dāng)需要緩存數(shù)據(jù)時(shí),會(huì)面臨挑戰(zhàn)。如果你試圖通過 ESP8266 讀取 SD 卡中的文件并將數(shù)據(jù)傳輸給計(jì)算機(jī),可能會(huì)因?yàn)?RAM 不夠而導(dǎo)致操作失敗或性能不佳。

在設(shè)計(jì)系統(tǒng)時(shí),可以考慮以下幾點(diǎn)來(lái)優(yōu)化內(nèi)存使用:

1. **分塊讀取文件**:避免將整個(gè)文件一次性加載入內(nèi)存,而是分塊讀取并處理,這樣可以大幅降低 RAM 的占用。
2. **使用外部存儲(chǔ)**:利用 STC89C516RD 與外部 RAM 的組合,緩存一些中間數(shù)據(jù),或者使用更大的外部 RAM 來(lái)處理數(shù)據(jù)。
3. **優(yōu)化代碼**:檢查并優(yōu)化代碼中可能的內(nèi)存泄漏和不必要的對(duì)象創(chuàng)建,確保 RAM 的使用盡可能高效。
4. **使用簡(jiǎn)化的數(shù)據(jù)格式**:如果可能,盡量使用較小的數(shù)據(jù)格式和簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)。

需要注意的是,在進(jìn)行 SD 卡操作時(shí),速度也是一個(gè)需要考慮的因素,因?yàn)?SD 卡的讀取速度往往比 RAM 的速度慢,因此必須確保數(shù)據(jù)讀取的邏輯優(yōu)化,以避免系統(tǒng)響應(yīng)遲緩。

如果你在實(shí)際的編程中遇到具體問題,可以參考以下鏈接獲取更詳細(xì)的討論和解決方案:[ESP8266 SD卡操作失敗](mydigit cn/thread-344350-1-1.html)。此外,ESP8266 的示例程序和文檔也可以為你提供幫助。
總結(jié)而言,合理的內(nèi)存管理和數(shù)據(jù)處理策略將是成功實(shí)現(xiàn) STC89C516RD 與 ESP8266 進(jìn)行 SD 卡文件下載的重要因素。
作者: 何鵬飛111    時(shí)間: 2024-10-9 17:12
超過的話會(huì)數(shù)據(jù)覆蓋吧
作者: 胡里希圖    時(shí)間: 2024-11-8 23:20
當(dāng)單片機(jī)串口接收到的數(shù)據(jù)大于緩沖區(qū)大小時(shí),可以采取以下幾種策略來(lái)處理:  1. **增加緩沖區(qū)大小**:    - 如果可能的話,增加緩沖區(qū)的大小以適應(yīng)更多的數(shù)據(jù)。  2. **使用環(huán)形緩沖區(qū)**:    - 環(huán)形緩沖區(qū)(Ring Buffer)是一種常見的數(shù)據(jù)結(jié)構(gòu),可以高效地處理數(shù)據(jù)流。當(dāng)緩沖區(qū)滿時(shí),新數(shù)據(jù)會(huì)覆蓋最老的數(shù)據(jù)。  3. **分批發(fā)送/接收數(shù)據(jù)**:    - 將數(shù)據(jù)分批次發(fā)送或接收,確保每次操作都不會(huì)超出緩沖區(qū)的大小。  4. **流控制**:    - 使用串口通信中的流控制機(jī)制(如XON/XOFF或RTS/CTS)來(lái)暫停數(shù)據(jù)的發(fā)送,直到緩沖區(qū)有足夠的空間。  5. **數(shù)據(jù)處理優(yōu)化**:    - 優(yōu)化數(shù)據(jù)處理流程,盡快處理并清空緩沖區(qū)中的數(shù)據(jù)。  6. **中斷處理**:    - 利用中斷服務(wù)例程(ISR)來(lái)處理接收到的數(shù)據(jù),確保緩沖區(qū)不會(huì)溢出。  以下是一些具體的實(shí)施步驟:  - **檢查緩沖區(qū)狀態(tài)**:   在接收數(shù)據(jù)前,先檢查緩沖區(qū)是否有足夠空間。如果沒有,可以暫停接收或通知發(fā)送方暫緩發(fā)送。  - **實(shí)現(xiàn)流控制**:   如果單片機(jī)支持硬件流控制,可以在軟件中實(shí)現(xiàn)相應(yīng)的邏輯。當(dāng)緩沖區(qū)接近滿時(shí),發(fā)送XOFF字符來(lái)停止數(shù)據(jù)流;當(dāng)緩沖區(qū)有空間時(shí),發(fā)送XON字符來(lái)恢復(fù)數(shù)據(jù)流。  - **增加緩沖區(qū)**:   如果內(nèi)存允許,增加緩沖區(qū)的大小。注意,增加緩沖區(qū)大小會(huì)占用更多的RAM資源。  - **優(yōu)化數(shù)據(jù)處理**:   確保數(shù)據(jù)處理速度足夠快,以跟上數(shù)據(jù)接收的速度。這可能需要優(yōu)化代碼或使用更高效的數(shù)據(jù)處理算法。  - **使用環(huán)形緩沖區(qū)**:   環(huán)形緩沖區(qū)可以連續(xù)地存儲(chǔ)數(shù)據(jù)流,當(dāng)緩沖區(qū)滿時(shí),新數(shù)據(jù)會(huì)覆蓋舊數(shù)據(jù)。以下是環(huán)形緩沖區(qū)的基本實(shí)現(xiàn)框架:   c #define BUFFER_SIZE 1024  typedef struct {     unsigned char buffer[BUFFER_SIZE];     volatile unsigned int head;     volatile unsigned int tail; } RingBuffer;  void RingBuffer_Init(RingBuffer *rb) {     rb->head = 0;     rb->tail = 0; }  int RingBuffer_Put(RingBuffer *rb, unsigned char data) {     int next = (rb->head + 1) % BUFFER_SIZE;     if (next == rb->tail) {         // Buffer is full         return -1;     }     rb->buffer[rb->head] = data;     rb->head = next;     return 0; }  int RingBuffer_Get(RingBuffer *rb, unsigned char *data) {     if (rb->head == rb->tail) {         // Buffer is empty         return -1;     }     *data = rb->buffer[rb->tail];     rb->tail = (rb->tail + 1) % BUFFER_SIZE;     return 0; }    - **錯(cuò)誤處理**:   在接收數(shù)據(jù)的過程中,如果檢測(cè)到緩沖區(qū)溢出,應(yīng)該有相應(yīng)的錯(cuò)誤處理機(jī)制,比如記錄錯(cuò)誤、重置緩沖區(qū)或通知用戶。  在實(shí)施上述策略時(shí),要確保代碼的穩(wěn)定性和可靠性,以保障系統(tǒng)的正常運(yùn)行。
作者: chxelc    時(shí)間: 2024-11-9 11:11
既然上ESP8266了,就直接用它開發(fā)吧。
它RAM有160K,不夠可以外接外部的spi flash(如:w25q32)擴(kuò)展。
作者: 188610329    時(shí)間: 2024-11-9 14:34
假定傳輸速率 115200, 那么傳輸1字節(jié) 也需要 87us 你知道 87us 時(shí)間,單片機(jī)能干多少事么? 正常來(lái)講,這程序只要寫的不是太拉垮,256字節(jié)的緩存是 絕對(duì)不會(huì)溢出的。
作者: 胖道人    時(shí)間: 2024-11-13 17:35
像這種應(yīng)用應(yīng)該是在8266里面把HTTP內(nèi)容處理完,把最簡(jiǎn)單的數(shù)據(jù)發(fā)給51
作者: 單片機(jī)初學(xué)者174    時(shí)間: 2024-11-13 20:29
這還不簡(jiǎn)單,你知道怎么讀取優(yōu)盤數(shù)據(jù)嗎?就是這道理。就是時(shí)間稍微長(zhǎng)點(diǎn)。我以前存數(shù)據(jù)都是放在外接U盤。寫程序時(shí),不管外部數(shù)據(jù)多大多長(zhǎng),一律按2個(gè)字節(jié)分別讀,然后打包儲(chǔ)存在U盤,然后就是讀取的時(shí)候,分別讀出來(lái),在合成。不要讓單片機(jī)占太多的內(nèi)存。用51也可以,像你說的那種網(wǎng)絡(luò)數(shù)據(jù),大概2秒的樣子能完成

作者: STC莊偉    時(shí)間: 2024-11-14 09:01
用AI8051U   32位8051,34K RAM, 64K Flash, TFPU/硬件浮點(diǎn)三角函數(shù)運(yùn)算器
最重要的是兼容89C52
作者: yangyang123321    時(shí)間: 2024-11-14 20:06
面對(duì)單片機(jī)串口接收數(shù)據(jù)大于緩沖區(qū)的問題,可以采取以下幾種策略:

1. **分塊處理數(shù)據(jù)**:由于你的單片機(jī)RAM有限,可以考慮將大文件分塊下載。每次只處理一小部分?jǐn)?shù)據(jù),處理完后再請(qǐng)求下一部分。這樣可以避免一次性將大量數(shù)據(jù)加載到RAM中。

2. **使用外部存儲(chǔ)**:考慮到你要下載的文件大小為10M,單片機(jī)的RAM顯然不足以一次性處理這么多數(shù)據(jù)。可以使用SD卡等外部存儲(chǔ)設(shè)備來(lái)暫存數(shù)據(jù)。在接收數(shù)據(jù)時(shí),可以邊接收邊寫入SD卡,而不是全部加載到RAM中。

3. **優(yōu)化緩沖區(qū)管理**:你已經(jīng)在使用環(huán)形緩沖區(qū),這是個(gè)很好的開始。確保你的環(huán)形緩沖區(qū)管理邏輯能夠有效地處理數(shù)據(jù)溢出的情況,例如,當(dāng)新數(shù)據(jù)到來(lái)而緩沖區(qū)已滿時(shí),可以考慮丟棄最早的數(shù)據(jù)。

4. **使用DMA(直接內(nèi)存訪問)**:如果可能的話,使用DMA來(lái)處理數(shù)據(jù)傳輸可以減輕CPU的負(fù)擔(dān),提高數(shù)據(jù)處理的效率。

5. **升級(jí)硬件**:如果上述方法仍然不能滿足需求,可能需要考慮升級(jí)到具有更大RAM的單片機(jī),比如STM32系列。STM32單片機(jī)通常具有更大的RAM和更強(qiáng)大的處理能力,更適合處理大數(shù)據(jù)量的任務(wù)。

6. **優(yōu)化通信協(xié)議**:如果可能,可以與服務(wù)器端協(xié)商,看是否可以減少HTTP響應(yīng)頭的大小,或者使用更高效的數(shù)據(jù)傳輸協(xié)議。

7. **流式處理**:在處理接收到的數(shù)據(jù)時(shí),盡量采用流式處理的方式,即邊接收邊處理,而不是等到全部數(shù)據(jù)接收完畢再處理。

8. **使用ESP8266的AT命令**:ESP8266支持AT命令來(lái)處理TCP/IP連接和數(shù)據(jù)傳輸,可以利用這一點(diǎn)來(lái)減輕單片機(jī)的負(fù)擔(dān)。例如,可以讓ESP8266直接將數(shù)據(jù)寫入SD卡,而不是通過單片機(jī)中轉(zhuǎn)。

通過這些策略,你應(yīng)該能夠有效地處理大文件的下載和存儲(chǔ)問題,即使在RAM有限的單片機(jī)上。

作者: StevenTian1    時(shí)間: 2024-11-15 10:18
你可以在串口設(shè)置一個(gè)結(jié)構(gòu)體呀,結(jié)構(gòu)體包含地址start 地址end,支持回滾。只要記錄每次傳進(jìn)來(lái)數(shù)據(jù)的個(gè)數(shù),在數(shù)據(jù)放入之前進(jìn)行處理,如果大于剩余個(gè)數(shù)就回滾,小于就按上次結(jié)束的位置開始放




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1