完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
我正在有一个项目,我使用ESP8266作为串行到 wifi 桥接器。我从在 windows7 上运行的 python 代码串行发送数据到 esp8266(esp-01),它再次发送到在 windows7 上运行的 wifi 客户端。在以类似的方式发送 pdf 文件 (79 KB) 时,我(由于 RAM 限制)选择了一种方法,即我连续接收文件块并在接收后立即将其发送到 wifi。这在循环内部不断发生,直到所有字节的文件都成功地从串行传输到 wifi。这样做,最初 esp8266(esp-01) 有时会丢失一些字节。我认为 wifi 传输速度和串行波特率之间存在某种不匹配,这会导致串行缓冲区溢出,从而丢失几个字节,从而导致最终输出文件损坏。因此,我将波特率从 500000 降低到 250000,一切正常,证实了我的理论。问题是当我在 esp8266(esp-12e) 中运行相同的代码时,波特率 250000 不够,它仍然会丢失字节。此外,将波特率降低到 115200 可以使事情运行几乎正常(9 次成功和 1 次丢失字节),而使用 9600 波特率文件传输是 100% 成功。但是根据我的要求,低于 250000 的波特率已经很慢了。
我的问题是: 1-我的理论正确吗?串行数据来得太快的理论,而接收数据并立即发送到 wifi 需要一些时间,再加上 wifi 速度稍慢,有时会导致串行缓冲区溢出,从而丢失字节。(降低波特率确实在两种硬件中都起作用,这在某种程度上证明了这一点,但我不确定) 2- 为什么相同的代码在 esp-12e 中不能正常工作?wifi 控制器或处理或其他东西有什么区别吗?我在两种硬件中都创建了一个热点,并检查了它们的速度,它是相同的(54 Mbps),所以它可能不是 wifi 速度,但那又怎样? 3-如何克服这个问题? 我用于测试的简单代码版本如下: Windows7 (Python 3.6) 上的 Python 代码: 导入序列号 导入时间 ser = 串行。串行('COM4', 250000, 超时 = 300) 时间.睡眠(1) with open("C:/Users/aatibui/Desktop/current/output.pdf", "rb") as f: read_done = f.read() ser.write(read_done) 时间.睡眠(5) ESP8266代码: #include const char* ssid = "atomic"; const char* password = "int1234"; WiFi服务器服务器(23); WiFiClient客户端; void setup() { Serial.begin(115200); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); Serial.print("nConnecting to "); Serial.println(ssid); while (WiFi.status() != WL_CONNECTED) delay(500); server.begin(); Serial.print("Ready! Use 'telnet "); Serial.print(WiFi.localIP()); Serial.println(" 23' to connect"); } void loop() { if (server.hasClient()) { if (!client || !client.connected()) { if (client) client.stop(); client = server.available(); while (client.connected()) { while (Serial.available()) { size_t len = Serial.available(); uint8_t sbuf[len]; Serial.readBytes(sbuf, len); client.write(sbuf,len); delay(1); } } } } } Wifi客户端代码(jdk7): 导入 java.io.BufferedInputStream; 导入 java.io.BufferedOutputStream; 导入 java.io.FileInputStream; 导入 java.io.FileOutputStream; 导入 java.net.ServerSocket; 导入 java.net.Socket; 导入 java.util.Arrays; 导入 java.io.DataInputStream; 公共类 ClientArduinoFile_1 { public static final int BUFFER_SIZE = 20*1024; private byte[] buffer; public ClientArduinoFile_1() { buffer = new byte[BUFFER_SIZE]; } public void startClient() throws Exception { Socket socket = new Socket("192.168.0.8", 23); BufferedInputStream in = new BufferedInputStream(socket.getInputStream()); BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("C:/Users/aatibui/Desktop/test123.pdf")); int len = 0; int counter = 0; int bytes = 0; System.out.println("here"); while ((len = in.read(buffer)) > 0) { System.out.print("bytes: "+len); bytes += len; System.out.print(" ; total: "+bytes); out.write(buffer, 0, len); System.out.print(" # "); System.out.println(counter++); if(bytes>=79965){ System.out.println("reached end of file"); break; } } in.close(); out.flush(); out.close(); socket.close(); System.out.println("nDone!"); } public static void main(String[] args) throws Exception { ClientArduinoFile_1 test = new ClientArduinoFile_1(); test.startClient(); } } |
|
相关推荐
1个回答
|
|
|
ESP-01和ESP-12E都是基于ESP8266芯片的模块,但它们之间存在一些差异。在实现串口转WiFi桥接时,这些差异可能会影响性能和稳定性。以下是它们之间的主要区别:
1. 尺寸和形状:ESP-01是一个更小巧的模块,尺寸为20mm x 14mm,而ESP-12E尺寸较大,为18mm x 30mm。这可能会影响您的项目布局和空间要求。 2. 天线类型:ESP-01通常使用内置天线,而ESP-12E可以使用外置天线。外置天线可能会提供更好的信号质量和覆盖范围。 3. 电源输入:ESP-01通常使用3.3V电源,而ESP-12E可以使用3.3V或5V电源。这可能会影响您的电源设计和选择。 4. 引脚数量:ESP-01具有较少的引脚,只有6个,而ESP-12E具有更多的引脚,共有16个。这可能会影响您的项目扩展性和功能。 5. 闪存大小:ESP-01通常具有较小的闪存(1MB),而ESP-12E可能具有较大的闪存(4MB)。较大的闪存可以存储更多的程序和数据。 关于您提到的数据丢失问题,这可能是由于以下原因: 1. 串口缓冲区溢出:由于ESP-01的RAM限制,当数据传输速度过快时,串口缓冲区可能会溢出,导致数据丢失。您可以尝试降低串行波特率,以减少缓冲区溢出的风险。 2. WiFi传输速度和串行波特率不匹配:如果WiFi传输速度较慢,而串行波特率较高,可能会导致数据在ESP8266模块内部排队等待发送,从而增加缓冲区溢出的风险。您可以尝试调整WiFi传输速度或串行波特率,以实现更好的匹配。 3. 软件实现问题:确保您的Python代码和ESP8266固件之间的通信协议正确实现,以避免数据丢失或错误。 4. 硬件问题:检查您的硬件连接和电源供应,确保它们稳定可靠。 为了解决这些问题,您可以尝试以下方法: 1. 降低串行波特率,以减少缓冲区溢出的风险。 2. 使用具有较大RAM和闪存的ESP-12E模块,以提高数据处理能力。 3. 优化您的Python代码和ESP8266固件,确保通信协议正确实现。 4. 检查硬件连接和电源供应,确保它们稳定可靠。 5. 如果可能,使用外置天线以提高WiFi信号质量。 通过这些方法,您应该能够提高串口转WiFi桥接的性能和稳定性,减少数据丢失的风险。 |
|
|
|
|
只有小组成员才能发言,加入小组>>
944 浏览 0 评论
1671 浏览 0 评论
请问一下我想用ESP8685直接替换ESP8266而不用写程序,可以让ESP8685直接通过之前ESP8266的外挂的flash运行程序吗
1330 浏览 1 评论
1233 浏览 1 评论
5015 浏览 2 评论
为blufi_device设置自定义名称,但是无法修改,为什么?
1250浏览 4评论
请问ESP32-S2-WROOM怎么获得ESP32-S2外接FLASH的唯一序列号?
927浏览 3评论
2330浏览 3评论
ESP-IDF的VScode插件的build按钮点击会报错的原因?
2526浏览 3评论
ESP-Jumpstart例程中第5个工程:5_cloud连接报错是哪里的问题?
1051浏览 2评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 22:12 , Processed in 1.959803 second(s), Total 75, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
446
