乐鑫技术交流
直播中

回头太晚

10年用户 921经验值
擅长:可编程逻辑 电源/新能源
私信 关注
[问答]

如何让write行为具有阻塞特性?

spp_vfs_write 与 PC 端 socket 沟通:esp32 write, PC read.  若 PC 端不执行 read 行为,esp32 持续 spp_vfs_write ,数据会发送到 PC 端吗?还是在 esp32 设备端 ?谢谢。另如何让 write 行为具有阻塞特性?谢谢。
                        

回帖(2)

马昱

2024-6-11 09:45:30
  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
                                                                                                            
举报

贾伟刚

2024-6-11 16:59:51
要让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端的响应。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分