找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2077|回复: 14
收起左侧

单片机串口收到的数据大于缓冲区怎么办?

  [复制链接]
回帖奖励 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 | 显示全部楼层
超过的话会数据覆盖吧
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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