久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4082|回復: 22
收起左側

單片機串口收到的數據大于緩沖區怎么辦?

  [復制鏈接]
回帖獎勵 30 黑幣 回復本帖可獲得 2 黑幣獎勵! 每人限 1 次
ID:1028013 發表于 2022-8-17 20:10 | 顯示全部樓層 |閱讀模式
stc89c516RD+單片機開發板
好像ram就只有1280B, 就是1k多一點

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

使用道具 舉報

ID:94031 發表于 2022-8-18 06:13 | 顯示全部樓層
先用簡單單片機學習簡單應用,基礎好了再學復雜應用。
回復

使用道具 舉報

ID:546770 發表于 2022-8-18 08:37 | 顯示全部樓層
51單片機確實資源不太夠,不過可以替換成最新的STC8或者STC32這種資源應該就夠用了,程序向下兼容,不需要怎么改,價格也不是很貴。
回復

使用道具 舉報

ID:401564 發表于 2022-8-18 08:52 | 顯示全部樓層
STC8A8K64D4
8K的SRAM,還有MDA
STC32
12K的SRAM,32位單片機
回復

使用道具 舉報

ID:544776 發表于 2022-8-18 08:59 | 顯示全部樓層
啊,我當初是直接使用esp32玩的,從聯網到控制全部能實現;當然我控制所需的IO不多
回復

使用道具 舉報

ID:1034262 發表于 2022-8-18 10:01 | 顯示全部樓層
換STC8H8K64U或STC32G12K128吧,速度快10倍以上,內存分別為8K和12K。
回復

使用道具 舉報

ID:258566 發表于 2022-8-18 11:32 | 顯示全部樓層
邊讀邊分析,不是合適的信息就舍棄,遇到包頭后,把后面的信息記錄。
如果采集公共信息(如電腦上可以訪問的天氣信息網頁),也可以這樣做。
如chrome瀏覽器,右鍵檢查。一般網頁的元素的class和id是唯一的,即不重名
1.jpg
回復

使用道具 舉報

ID:883242 發表于 2022-8-18 14:07 | 顯示全部樓層
真缺$$$就學著用esp8266開發啊!

esp8266有兩種玩兒法,一種是把他當成串口轉WiFi模塊,你顯然是用的這種,很簡單容易上手。

還有一種玩兒法,把8266當成是帶WiFi功能的單片機,你會發現8266的性能和資源不知道比你現在用的死忒慘好到哪里去了,缺點是沒有仿真器,只能盲測,看看好不好用,反正你現在的單片機也沒有仿真器。
回復

使用道具 舉報

ID:255908 發表于 2022-8-19 10:18 | 顯示全部樓層
外擴內存模塊
回復

使用道具 舉報

ID:799053 發表于 2022-8-19 20:05 | 顯示全部樓層
外加RAM和rom 有專門的RAM rom芯片
回復

使用道具 舉報

ID:372579 發表于 2022-8-20 21:58 | 顯示全部樓層
其實用stc的12系列也是很不錯的。
回復

使用道具 舉報

ID:517951 發表于 2024-10-9 08:11 | 顯示全部樓層
現在STC有新的51單片機增加了內存了, 再也不用擔心緩存不夠了. AI8051U, 2K data +32K xdata, 又多了ic選型哦.
回復

使用道具 舉報

ID:982617 發表于 2024-10-9 16:19 | 顯示全部樓層
你遇到的問題很常見,因為單片機內存有限,處理大量數據確實很困難。你的思路是對的,環形緩沖區是常用的方法,但是對于大文件下載,它就力不從心了。  以下幾點分析和建議:  內存限制: STC89C516RD+的RAM只有1280B確實比較小,即使使用環形緩沖區也無法容納完整的 HTTP 響應頭和文件數據。 HTTP協議的特性: HTTP 協議使用分塊傳輸,數據會分成多個塊,每個塊都帶有自己的頭信息,這會導致數據接收變得復雜。 文件大小問題: 10M 的文件對單片機來說確實比較大,需要精心設計才能完成下載。 解決方法:  升級單片機: 你的想法是對的,使用內存更大的單片機,例如 STM32 就可以有效解決這個問題。STM32 有多種型號,可以根據你的需求選擇合適的型號,例如 STM32F103ZET6 有 64 KB 的 Flash 和 20 KB 的 RAM,足以處理你的下載任務。 使用 SD 卡直接存儲: 你可以將數據直接寫入 SD 卡,避免使用大量 RAM。但是,你需要考慮 SD 卡的讀寫速度和性能,可能需要進行一些優化才能提高效率。 分段下載: 將文件分成多個小塊,每次只下載一小塊數據,并將數據存儲到 SD 卡中。可以使用 HTTP 的 Range 頭來指定下載的范圍。 優化代碼: 仔細優化代碼,減少內存占用,例如使用更小的數據類型,壓縮數據等等。 使用外部 RAM: 如果你想繼續使用 STC89C516RD+,可以考慮使用外部 RAM 來擴展內存,但是需要額外增加一些硬件電路。 建議方案:  使用 STM32 單片機: 這可能是最簡單、最有效的解決方案。 使用 SD 卡直接存儲: 如果你想要繼續使用 STC89C516RD+,可以使用 SD 卡直接存儲數據,但是需要考慮 SD 卡的性能和效率。 其他注意事項:  數據校驗: 在下載過程中,需要進行數據校驗,以確保數據的完整性。 錯誤處理: 需要處理下載過程中可能出現的錯誤,例如網絡連接斷開、數據傳輸錯誤等等。 最后,建議你根據自己的需求選擇合適的方案,并根據方案進行代碼設計和實現。
回復

使用道具 舉報

ID:982617 發表于 2024-10-9 16:20 | 顯示全部樓層
關于 STC89C516RD 和 ESP8266 結合使用 SD 卡下載文件時的 RAM 限制問題,以下是一些詳細的信息。

首先,STC89C516RD 是一款單片機,其內存配置有一定的限制。該單片機的內部 RAM 可以達到 256 字節,而外部 RAM 可通過 ALE 腳擴展。這一限制可能會影響你在處理大型文件時的存儲能力,尤其是在進行 SD 卡數據讀寫操作時。

ESP8266 是一種廣泛使用的 Wi-Fi 模塊,適用于各種物聯網項目。其內置的 RAM 相對較小(通常為 80 KB),在處理文件操作時,特別是當需要緩存數據時,會面臨挑戰。如果你試圖通過 ESP8266 讀取 SD 卡中的文件并將數據傳輸給計算機,可能會因為 RAM 不夠而導致操作失敗或性能不佳。

在設計系統時,可以考慮以下幾點來優化內存使用:

1. **分塊讀取文件**:避免將整個文件一次性加載入內存,而是分塊讀取并處理,這樣可以大幅降低 RAM 的占用。
2. **使用外部存儲**:利用 STC89C516RD 與外部 RAM 的組合,緩存一些中間數據,或者使用更大的外部 RAM 來處理數據。
3. **優化代碼**:檢查并優化代碼中可能的內存泄漏和不必要的對象創建,確保 RAM 的使用盡可能高效。
4. **使用簡化的數據格式**:如果可能,盡量使用較小的數據格式和簡單的數據結構。

需要注意的是,在進行 SD 卡操作時,速度也是一個需要考慮的因素,因為 SD 卡的讀取速度往往比 RAM 的速度慢,因此必須確保數據讀取的邏輯優化,以避免系統響應遲緩。

如果你在實際的編程中遇到具體問題,可以參考以下鏈接獲取更詳細的討論和解決方案:[ESP8266 SD卡操作失敗](mydigit cn/thread-344350-1-1.html)。此外,ESP8266 的示例程序和文檔也可以為你提供幫助。
總結而言,合理的內存管理和數據處理策略將是成功實現 STC89C516RD 與 ESP8266 進行 SD 卡文件下載的重要因素。
回復

使用道具 舉報

ID:1133246 發表于 2024-10-9 17:12 | 顯示全部樓層
超過的話會數據覆蓋吧
回復

使用道具 舉報

ID:1135936 發表于 2024-11-8 23:20 | 顯示全部樓層
當單片機串口接收到的數據大于緩沖區大小時,可以采取以下幾種策略來處理:  1. **增加緩沖區大小**:    - 如果可能的話,增加緩沖區的大小以適應更多的數據。  2. **使用環形緩沖區**:    - 環形緩沖區(Ring Buffer)是一種常見的數據結構,可以高效地處理數據流。當緩沖區滿時,新數據會覆蓋最老的數據。  3. **分批發送/接收數據**:    - 將數據分批次發送或接收,確保每次操作都不會超出緩沖區的大小。  4. **流控制**:    - 使用串口通信中的流控制機制(如XON/XOFF或RTS/CTS)來暫停數據的發送,直到緩沖區有足夠的空間。  5. **數據處理優化**:    - 優化數據處理流程,盡快處理并清空緩沖區中的數據。  6. **中斷處理**:    - 利用中斷服務例程(ISR)來處理接收到的數據,確保緩沖區不會溢出。  以下是一些具體的實施步驟:  - **檢查緩沖區狀態**:   在接收數據前,先檢查緩沖區是否有足夠空間。如果沒有,可以暫停接收或通知發送方暫緩發送。  - **實現流控制**:   如果單片機支持硬件流控制,可以在軟件中實現相應的邏輯。當緩沖區接近滿時,發送XOFF字符來停止數據流;當緩沖區有空間時,發送XON字符來恢復數據流。  - **增加緩沖區**:   如果內存允許,增加緩沖區的大小。注意,增加緩沖區大小會占用更多的RAM資源。  - **優化數據處理**:   確保數據處理速度足夠快,以跟上數據接收的速度。這可能需要優化代碼或使用更高效的數據處理算法。  - **使用環形緩沖區**:   環形緩沖區可以連續地存儲數據流,當緩沖區滿時,新數據會覆蓋舊數據。以下是環形緩沖區的基本實現框架:   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; }    - **錯誤處理**:   在接收數據的過程中,如果檢測到緩沖區溢出,應該有相應的錯誤處理機制,比如記錄錯誤、重置緩沖區或通知用戶。  在實施上述策略時,要確保代碼的穩定性和可靠性,以保障系統的正常運行。
回復

使用道具 舉報

ID:712097 發表于 2024-11-9 11:11 | 顯示全部樓層
既然上ESP8266了,就直接用它開發吧。
它RAM有160K,不夠可以外接外部的spi flash(如:w25q32)擴展。
回復

使用道具 舉報

ID:624769 發表于 2024-11-9 14:34 | 顯示全部樓層
假定傳輸速率 115200, 那么傳輸1字節 也需要 87us 你知道 87us 時間,單片機能干多少事么? 正常來講,這程序只要寫的不是太拉垮,256字節的緩存是 絕對不會溢出的。
回復

使用道具 舉報

ID:724465 發表于 2024-11-13 17:35 | 顯示全部樓層
像這種應用應該是在8266里面把HTTP內容處理完,把最簡單的數據發給51
回復

使用道具 舉報

ID:597405 發表于 2024-11-13 20:29 | 顯示全部樓層
這還不簡單,你知道怎么讀取優盤數據嗎?就是這道理。就是時間稍微長點。我以前存數據都是放在外接U盤。寫程序時,不管外部數據多大多長,一律按2個字節分別讀,然后打包儲存在U盤,然后就是讀取的時候,分別讀出來,在合成。不要讓單片機占太多的內存。用51也可以,像你說的那種網絡數據,大概2秒的樣子能完成
回復

使用道具 舉報

ID:961114 發表于 2024-11-14 09:01 | 顯示全部樓層
用AI8051U   32位8051,34K RAM, 64K Flash, TFPU/硬件浮點三角函數運算器
最重要的是兼容89C52
回復

使用道具 舉報

ID:1136460 發表于 2024-11-14 20:06 | 顯示全部樓層
面對單片機串口接收數據大于緩沖區的問題,可以采取以下幾種策略:

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

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

3. **優化緩沖區管理**:你已經在使用環形緩沖區,這是個很好的開始。確保你的環形緩沖區管理邏輯能夠有效地處理數據溢出的情況,例如,當新數據到來而緩沖區已滿時,可以考慮丟棄最早的數據。

4. **使用DMA(直接內存訪問)**:如果可能的話,使用DMA來處理數據傳輸可以減輕CPU的負擔,提高數據處理的效率。

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

6. **優化通信協議**:如果可能,可以與服務器端協商,看是否可以減少HTTP響應頭的大小,或者使用更高效的數據傳輸協議。

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

8. **使用ESP8266的AT命令**:ESP8266支持AT命令來處理TCP/IP連接和數據傳輸,可以利用這一點來減輕單片機的負擔。例如,可以讓ESP8266直接將數據寫入SD卡,而不是通過單片機中轉。

通過這些策略,你應該能夠有效地處理大文件的下載和存儲問題,即使在RAM有限的單片機上。
回復

使用道具 舉報

ID:1136497 發表于 2024-11-15 10:18 | 顯示全部樓層
你可以在串口設置一個結構體呀,結構體包含地址start 地址end,支持回滾。只要記錄每次傳進來數據的個數,在數據放入之前進行處理,如果大于剩余個數就回滾,小于就按上次結束的位置開始放
回復

使用道具 舉報

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

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人精品视频在线观看 | 羞羞视频免费观 | 亚洲国产成人在线视频 | 午夜激情免费 | 亚洲黄色网址视频 | 五月花丁香婷婷 | 国产偷录叫床高潮录音 | 精品国产一二三区 | 午夜视频在线观看一区二区 | 免费v片在线观看 | 亚洲午夜三级 | 精品国产精品 | 四虎海外| 黑人精品欧美一区二区蜜桃 | 理论片午午伦夜理片影院 | 日韩精品一区二区在线观看 | 亚洲视频中文字幕 | 成人小视频在线 | 99这里只有精品视频 | h在线 | 超碰520 | 99精品电影| 男人的天堂中文字幕 | 久草视频网站 | 国产精品久久久久一区二区三区 | 国产精品伦一区二区三级视频 | 亚洲高清一区二区三区 | 视频一二三区 | 亚洲一区二区精品视频在线观看 | 中文字幕乱码视频32 | 国产精品色婷婷久久58 | 一区二区三区久久 | 99热在这里只有精品 | 精品福利在线 | 日本高清视频在线播放 | 国产精品视频一二三 | 国产精品久久久久久久久久久免费看 | www.亚洲视频.com | 九九看片 | 成人欧美一区二区三区在线播放 | 欧美精品91爱爱 |