fix: WCHNET 接收缓冲区与帧缓冲区重叠导致数据损坏

根因: WCHNET_ModifyRecvBuf 将 socket 内部缓冲区设为 g_json_recv_buf,
但 WCHNET_SocketRecv 又从同一缓冲区(偏移)拷贝到自身 — 源和目的重叠。

修复:
1. 新增独立的 g_json_wchnet_buf 作为 WCHNET 内部接收缓冲区
2. RECV 时从 g_json_wchnet_buf 读入临时 buffer, 再追加到 g_json_recv_buf
3. 两缓冲区完全隔离, 消除重叠拷贝
This commit is contained in:
wangfq
2026-06-30 19:04:11 +08:00
parent 3e00a352d3
commit 735af8c0eb

View File

@@ -36,6 +36,7 @@ uint32_t g_json_lockout_timer = 0;
*===========================================================================*/ *===========================================================================*/
static uint8_t g_json_recv_buf[TCP_JSON_RECV_BUF_LEN]; static uint8_t g_json_recv_buf[TCP_JSON_RECV_BUF_LEN];
static uint16_t g_json_recv_len = 0; static uint16_t g_json_recv_len = 0;
static uint8_t g_json_wchnet_buf[RECE_BUF_LEN]; // WCHNET internal recv buffer
/*=========================================================================== /*===========================================================================
* Internal helpers * Internal helpers
@@ -647,8 +648,9 @@ void tcp_json_handle_sock_int(uint8_t socketid, uint8_t intstat) {
memset(g_json_recv_buf, 0, sizeof(g_json_recv_buf)); memset(g_json_recv_buf, 0, sizeof(g_json_recv_buf));
// CRITICAL: Set up receive buffer for the accepted TCP socket // CRITICAL: Set up receive buffer for the accepted TCP socket
// Without this, WCHNET won't buffer incoming data on this socket // Use a SEPARATE buffer for WCHNET — not g_json_recv_buf
WCHNET_ModifyRecvBuf(socketid, (uint32_t)g_json_recv_buf, TCP_JSON_RECV_BUF_LEN); // WCHNET_SocketRecv copies FROM this buffer, so it must not overlap
WCHNET_ModifyRecvBuf(socketid, (uint32_t)g_json_wchnet_buf, RECE_BUF_LEN);
PRINT("JSON: Client accepted on socket %d, recv buf configured\n", socketid); PRINT("JSON: Client accepted on socket %d, recv buf configured\n", socketid);
return; return;
@@ -657,13 +659,16 @@ void tcp_json_handle_sock_int(uint8_t socketid, uint8_t intstat) {
// === Client socket events === // === Client socket events ===
if (socketid == g_json_socket_client) { if (socketid == g_json_socket_client) {
if (intstat & SINT_STAT_RECV) { if (intstat & SINT_STAT_RECV) {
// Read data into frame buffer // Read data from WCHNET's buffer into our frame accumulator
uint32_t recv_len = WCHNET_SocketRecvLen(socketid, NULL); uint32_t recv_len = WCHNET_SocketRecvLen(socketid, NULL);
if (recv_len > 0) { if (recv_len > 0) {
uint16_t space = TCP_JSON_RECV_BUF_LEN - g_json_recv_len; uint16_t space = TCP_JSON_RECV_BUF_LEN - g_json_recv_len;
if (recv_len > space) recv_len = space; if (recv_len > space) recv_len = space;
uint32_t rd_len = recv_len; uint32_t rd_len = recv_len;
WCHNET_SocketRecv(socketid, g_json_recv_buf + g_json_recv_len, &rd_len); // Read into a temp buffer first, then append to frame buffer
uint8_t tmp_buf[RECE_BUF_LEN];
WCHNET_SocketRecv(socketid, tmp_buf, &rd_len);
memcpy(g_json_recv_buf + g_json_recv_len, tmp_buf, (uint16_t)rd_len);
g_json_recv_len += (uint16_t)rd_len; g_json_recv_len += (uint16_t)rd_len;
// Process complete frames // Process complete frames