CH32V307 以太网发送数据报错

            if(len_1 != 0)
            {
                ret = WCHNET_SocketSend(SocketId[i], &uart_data_t[i].RX_buffer[uart_data_t[i].rx_read&(UART_RX_DMA_SIZE-1)], &len_1);
                if (ret == 0)
                {
                    uart_data_t[i].rx_read += len_1;
                }
                else
                {
                    sprintf(debug,"eth send error\n");
                    tcp_send_strings(debug);
                }
            }

            /* send the rest of the data(if any) at beginning of RX_buffer  */
            if( (len-len_1) != 0)
            {
                len_1 = len-len_1;

                ret = WCHNET_SocketSend(SocketId[i], &uart_data_t[i].RX_buffer[0], &len_1);
                if (ret == 0)
                {
                    uart_data_t[i].rx_read += len_1;
                }
                else
                {
                    sprintf(debug,"eth send error\n");
                    tcp_send_strings(debug);
                }
            }

/**********************************************/

使用WCHNET_SocketSend发送数据会出错,这个是为啥?

ret = 0x11

#define WCHNET_ERR_MEM                  0x11              //Out of memory error

是这个错误,这个是为什么?

您好,从您描述上看应该是协议栈发送缓冲区不足导致的异常,此时伴随的是发送失败,您可以监控一下“len_1”的值,调用WCHNET_SocketSend函数后该值表示已经发送的数据长度,也就是说“len_1”为0则表示没发送成功。

产生的原因:应该是应用层发送数据过快,此时还未收到对端设备的ack,无法释放发送缓冲区的数据,导致缓冲区拥堵以至于后续数据发送失败。

解决办法:1、如果是带系统的,要将接收部分的代码优先级调高,发送部分的代码优先级稍低。

2、降低应用层发送速度。

3、如果发送速度很低依然有问题,那就查一下网络情况是否很复杂,导致无法收到ACK。


只有登录才能回复,可以选择微信账号登录