ST意法半导体
直播中

1123127317

9年用户 1131经验值
擅长:制造/封装 接口/总线/驱动
私信 关注
[问答]

STM32H7使用LWIP通信,数据量过大会卡死怎么解决?

使用STM32CubeIDE 1.17.0生成和编辑的STM32H743XIH6代码,使用了FreeRTOS+lwip,sockets实现的TCP客户端,对服务器端发送超过128个字节会卡死,进入硬件错误中断,参考的例子如下链接STM32H750+CubeIDE+FreeRTOS+ETH(LAN8720A)+LWIP_stm32h750 lan8720a-
请问这个例子是否正确?或者说有什么教程可以正确的参考吗
#include "tcpclient.h"#include "lwip/sockets.h"#include "ctype.h"#include "FreeRTOS.h"#include "task.h"#include "lwip/netdb.h"#include #include #include #include #include #include "lwip/opt.h"#include "lwip/sys.h"#include "lwip/api.h"#include "usb_device.h"//struct sockaddr_in serverAddr;int client_socket = -1;// 定义一个标志变量来控制重连次数int reconnect_attempts = 0;void myDelay(int ms) {    vTaskDelay(pdMS_TO_tiCKS(ms));}bool is_connected = false;bool isConnected() {    return is_connected;}void tcp_client_init(void) {    struct sockaddr_in serverAddr;    int enable = 1;    client_socket = socket(AF_INET, SOCK_STREAM, 0);//AF_INET:IPV4,SOCK_STREAM:协议类型为TCP     if (client_socket < 0)     {         usb_printf("创建socket失败n");        return;     }    // 设置 socket 选项    setsockopt(client_socket, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(enable));//允许本地地址重用    // 设置读取超时    struct timeval timeout;    timeout.tv_sec = 5; // 5秒超时    timeout.tv_usec = 0;    setsockopt(client_socket, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));    //连接的服务器    serverAddr.sin_family = AF_INET;    serverAddr.sin_port = htons(TCP_CLIENT_PORT);    serverAddr.sin_addr.s_addr = inet_addr(SERVER_IP);    int ret = connect(client_socket, (struct sockaddr*)&serverAddr, sizeof(serverAddr));     // 连接到服务器    if (ret < 0) {        usb_printf("连接服务器失败n");        lwip_close(client_socket);        client_socket = -1;        is_connected = false;    } else {        usb_printf("TCP 连接成功n");        is_connected = true;        reconnect_attempts = 0; // 重置重连次数    }}// 读取数据void tcp_read_data(void) {    char buffer[1024];    ssize_t bytes_read;    // 读取数据    bytes_read = lwip_recv(client_socket, buffer, sizeof(buffer) - 1, 0);    if (bytes_read > 0)    {        buffer[bytes_read] = '�';        usb_printf("读取的数据: %sn", buffer);    }    else if (bytes_read == 0)    {        usb_printf("服务器关闭连接n");        lwip_close(client_socket);        client_socket = -1;        is_connected = false;    }    else    {        if (errno == EAGAIN || errno == EWOULDBLOCK)        {            usb_printf("读取超时n");        }        else        {            usb_printf("数据读取失败: %dn", errno);            lwip_close(client_socket);            client_socket = -1;            is_connected = false;        }    }}// 发送数据void tcp_send_data(const char *data) {    if (is_connected)    {        ssize_t bytes_sent =lwip_send(client_socket, data, strlen(data), 0);        if (bytes_sent < 0)        {            usb_printf("数据发送失败: %dn", errno);            lwip_close(client_socket);//断开连接            client_socket = -1;            is_connected = false;        }        else        {        //  usb_printf("发送数据: %sn", data);        }    }    else    {        usb_printf("未连接,无法发送数据n");    }}

回帖(1)

王丽娟

2025-3-11 11:43:48
没有打开LWIP用户内存池
举报

更多回帖

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