完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
spp_vfs_write 与 PC 端 socket 沟通:esp32 write, PC read. 若 PC 端不执行 read 行为,esp32 持续 spp_vfs_write ,数据会发送到 PC 端吗?还是在 esp32 设备端 ?谢谢。另如何让 write 行为具有阻塞特性?谢谢。
|
|
相关推荐
2个回答
|
|
|
1. spp_vfs_write 与 PC 端 socket 沟通:esp32 write, PC read. 若 PC 端不执行 read 行为,esp32 持续 spp_vfs_write ,数据会发送到 PC 端吗?还是在 esp32 设备端 ?
SPP 是一种基于信令的流控方式。如果对方一直不接受数据,那么信令消耗完,便不可向对方发送数据。目前,在 release/v5.1 上, spp_vfs_write 是先往 ringbuffer 里面写数据,然后再发送给对方。在上述场景中,如果 PC 一直不读数据的话,那么 spp_vfs_write 将一直往本地的 ringbuffer 写满,然后阻塞 40 秒等待对方接收数据。 2. 另如何让 write 行为具有阻塞特性? 一种方法是设计一种简单的协议,一直阻塞直到收到对方的 ack |
|
|
|
|
|
要让write行为具有阻塞特性,您可以采取以下步骤:
1. 首先,确保您的ESP32设备和PC端都使用相同的通信协议。在这种情况下,您提到了使用socket进行通信。确保ESP32和PC端都使用TCP协议,因为TCP是面向连接的、可靠的、基于字节流的通信协议,具有内置的流量控制和拥塞控制机制。 2. 在ESP32端,使用spp_vfs_write函数发送数据。这个函数允许您将数据写入到一个文件描述符(例如,socket连接)。当您调用spp_vfs_write时,它会尝试将数据发送到PC端。 3. 在PC端,使用socket的read函数接收数据。当PC端没有执行read操作时,ESP32端的spp_vfs_write函数将等待,直到PC端准备好接收数据。这意味着数据不会丢失,但ESP32端的write操作会被阻塞,直到PC端执行read操作。 4. 为了让write操作具有阻塞特性,您可以在ESP32端设置一个超时时间。这可以通过设置socket选项来实现。例如,您可以使用setsockopt函数设置SO_SNDTIMEO选项,以指定发送数据的超时时间。如果超时时间到达,write操作将返回一个错误,表示发送失败。 以下是一个示例代码片段,展示了如何在ESP32端设置超时时间: ```c #include #include #include // 创建socket int sock = socket(AF_INET, SOCK_STREAM, 0); // 设置超时时间 struct timeval timeout; timeout.tv_sec = 10; // 10秒超时 timeout.tv_usec = 0; setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout)); // 连接到PC端 struct sockaddr_in server_addr; server_addr.sin_family = AF_INET; server_addr.sin_port = htons(12345); // PC端监听的端口 server_addr.sin_addr.s_addr = inet_addr("192.168.1.100"); // PC端的IP地址 connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr)); // 使用spp_vfs_write发送数据 size_t bytes_written = spp_vfs_write(sock, data, data_length); if (bytes_written < 0) { // 发送失败,处理错误 } ``` 通过这种方式,您可以确保write操作具有阻塞特性,并且当PC端没有执行read操作时,ESP32端的write操作会被阻塞。同时,通过设置超时时间,您可以避免无限期地等待PC端的响应。 |
|
|
|
|
只有小组成员才能发言,加入小组>>
944 浏览 0 评论
1671 浏览 0 评论
请问一下我想用ESP8685直接替换ESP8266而不用写程序,可以让ESP8685直接通过之前ESP8266的外挂的flash运行程序吗
1330 浏览 1 评论
1233 浏览 1 评论
5015 浏览 2 评论
为blufi_device设置自定义名称,但是无法修改,为什么?
1252浏览 4评论
请问ESP32-S2-WROOM怎么获得ESP32-S2外接FLASH的唯一序列号?
927浏览 3评论
2336浏览 3评论
ESP-IDF的VScode插件的build按钮点击会报错的原因?
2526浏览 3评论
ESP-Jumpstart例程中第5个工程:5_cloud连接报错是哪里的问题?
1051浏览 2评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 02:34 , Processed in 1.322911 second(s), Total 44, Slave 37 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
634
