tk558978 2024-01-05 09:56 采纳率: 0%
浏览 77
已结题

如何用带有lan8720的stm32开发板实现tcp/ip通信

我使用正点原子的STM32F429IGT6的开发板,上面配置了LAN8720A的以太网,如何在STM32CubeMX 1.13.1版上面实现和普通计算机通过TCP/IP进行通信?我看了一下这个版本的stm32cubemx里面配置lwip的时候只有lan8742的选项,没有8720。
我使用生成的代码烧入开发板后,直接将计算机和开发板用网线连接起来,计算机网卡设置手动配置ip地址,确保和lwip里面的手动ip在同一网段。结果我在开发板程序里面编写用udp发送数据给计算机上的接收程序,无法收到数据。win11的以太网设置上说“未连接”,且无法ping通。以下是我根据正点原子提供的资料配置的管脚

img

是否可以不需要完全靠自己从零编写lan8720的驱动也能直接达成目标呢?

  • 写回答

19条回答 默认 最新

  • 叫兽-郭老师 Java领域新星创作者 2024-01-05 10:00
    关注

    引用GPT4和答主提供,参考如下:

    要在STM32F429IGT6开发板上使用LAN8720实现TCP/IP通信,您需要使用LwIP库。虽然在STM32CubeMX 1.13.1版中没有直接支持LAN8720的选项,但您可以手动配置LwIP以使用LAN8720。以下是实现此目标的步骤:

    1. 首先,确保您的开发板已正确连接到以太网接口。

    2. 下载并安装LwIP库。您可以从官方网站下载最新版本的LwIP库:https://www.segger.com/downloads/lwip/

    3. 将下载的LwIP库解压缩到您的项目文件夹中。

    4. 打开STM32CubeMX,创建一个新的工程,并将您的开发板添加到项目中。

    5. 在STM32CubeMX中配置以太网接口。选择您的开发板型号(例如STM32F429IGT6),然后配置以太网接口的MAC地址、IP地址和子网掩码。确保这些设置与您的计算机上的网络设置相匹配。

    6. 在STM32CubeMX中配置LwIP。转到“Project”菜单,然后选择“Manage Peripheral”。在弹出的窗口中,找到并启用“ETHERNET”外设。然后,转到“Configuration”选项卡,选择“LWIP”,并配置相应的参数,如缓冲区大小、线程优先级等。

    7. 生成代码并烧入开发板。现在,您应该能够在开发板上使用TCP/IP进行通信了。

    8. 编写一个接收程序,该程序将监听指定的IP地址和端口,等待接收数据。您可以使用UDP或TCP协议来实现这一点。

    9. 编写一个发送程序,该程序将通过TCP/IP向接收程序发送数据。

    10. 将接收程序和发送程序分别烧入开发板,并确保它们可以相互通信。

    虽然您可能需要自己编写一些底层代码来处理LAN8720的驱动,但这通常不是必需的。LwIP库已经包含了对大多数常见以太网控制器的支持,包括LAN8720。只要正确配置LwIP,您应该能够使用它与计算机进行TCP/IP通信。

    评论
  • 专家-赤兔[在线] 全栈领域优质创作者 2024-01-05 10:01
    关注
    获得1.05元问题酬金
    评论
    tk558978 2024-01-11 10:26

    我的STM32CubeMX里面相关的界面和链接里面的对不上号,少了很多东西。不知道是不是软件配置出了什么问题,还是说F429芯片就只有这些内容

    img

    回复
  • 郭晟玮 全栈领域新星创作者 2024-01-05 10:14
    关注
    获得0.45元问题酬金

    这是我找到的一些关于如何使用带有lan8720的stm32开发板实现tcp/ip通信的资源:

    1. STM32F407+LAN8720A+STM32CubeMX+Lwip 网络通讯: 介绍了如何使用STM32连上路由器,然后通过上位机给STM32发送命令。
    2. ETH LAN8720 调试记录: 这篇文章介绍了LwIP这个轻量级的IP协议,这个协议有无操作系统的支持都可以运行。
    3. 正点原子【STM32-F407探索者】第六十章网络通信实验: 这篇文章会教你如何用网线将开发板和电脑连接起来。
    4. LWIP应用开发|不带操作系统移植LWIP: 这篇文章介绍了如何使用STM32CubeMX将LWIP移植到STM32H743开发板上。
      以上是我搜索到的信息,希望对你有所帮助。在操作过程中,如果有任何问题,请随时向我询问。
    评论
    tk558978 2024-01-08 09:02

    我的板子和你提供的资料讲的F407似乎对不上,比如里面提到PD3对应ETH_Reset,而我这里只有以下选项

    img

    回复
    tk558978 2024-01-10 02:03

    你的第一个链接里面的STM32CubeMX和我这个版本对不上号,会不会是软件配置有什么问题呢?

    img

    回复
  • Java毕设王 2024-01-06 03:31
    关注
    获得1.20元问题酬金

    引用讯飞星火
    是的,你不需要完全从零编写LAN8720A的驱动。你可以尝试使用已有的库,如LwIP或者uIP,这些库已经实现了TCP/IP协议栈和以太网驱动,你只需要配置好相关参数即可。

    首先,你需要在STM32CubeMX中配置LwIP库。虽然1.13.1版本可能没有LAN8720A的选项,但你可以尝试使用LAN8742A作为替代。在LwIP设置中,选择"ETH_PHY_ADDRESS"为"LAN8742A",然后在"ETH_PHY_TYPE"中选择"RMII_MODE"。这样,LwIP将自动配置LAN8742A以太网驱动。

    接下来,你需要配置TCP/IP参数。在LwIP设置中,选择"PACKET_BUFFER_SIZE"为"64"(默认值),然后设置"DHCP_CLIENT_TIMEOUT"为一个合适的值(例如5秒)。最后,确保你的计算机和开发板的IP地址在同一网段。

    现在,你可以在STM32CubeMX生成的代码基础上进行修改,以便通过UDP发送数据给计算机上的接收程序。以下是一个简单的示例:

    1. main.c文件中添加以下头文件:
    #include "lwip/udp.h"
    #include "lwip/ip_addr.h"
    #include "lwip/netdb.h"
    
    1. main()函数中初始化LwIP:
    // ...其他初始化代码...
    
    // 初始化LwIP
    struct ip_addr ipaddr;
    struct ip_addr netmask;
    struct ip_addr gw;
    uint8_t ip_address[4] = {192, 168, 1, 10}; // 请根据实际情况修改IP地址
    uint8_t netmask_address[4] = {255, 255, 255, 0}; // 请根据实际情况修改子网掩码
    uint8_t gateway_address[4] = {192, 168, 1, 1}; // 请根据实际情况修改网关地址
    
    IP4_ADDR(&ipaddr, ip_address[0], ip_address[1], ip_address[2], ip_address[3]);
    IP4_ADDR(&netmask, netmask_address[0], netmask_address[1], netmask_address[2], netmask_address[3]);
    IP4_ADDR(&gw, gateway_address[0], gateway_address[1], gateway_address[2], gateway_address[3]);
    
    netif_add(&netif, &ipaddr, &netmask, &gw, NULL, &ethernetif_init, &tcpip_input);
    netif_set_default(&netif);
    netif_set_up(&netif);
    
    1. 创建一个UDP套接字并绑定到一个端口:
    // ...其他初始化代码...
    
    // 创建UDP套接字
    int udp_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (udp_socket < 0) {
        printf("创建UDP套接字失败
    ");
        return -1;
    }
    
    // 绑定套接字到端口
    struct sockaddr_in server_addr;
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(12345); // 请根据实际情况修改端口号
    inet_pton(AF_INET, "192.168.1.10", &server_addr.sin_addr); // 请根据实际情况修改服务器IP地址
    if (bind(udp_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
        printf("绑定套接字失败
    ");
        return -1;
    }
    
    1. 在无限循环中发送和接收数据:
    // ...其他初始化代码...
    while (1) {
        // 准备要发送的数据(这里只是一个简单的示例)
        char data[] = "Hello, World!";
        int data_len = strlen(data);
        struct sockaddr_in client_addr;
        socklen_t client_addr_len = sizeof(client_addr);
        int sent_len = sendto(udp_socket, data, data_len, 0, (struct sockaddr *)&client_addr, client_addr_len);
        if (sent_len < 0) {
            printf("发送数据失败
    ");
            return -1;
        } else {
            printf("已发送%d字节数据
    ", sent_len);
        }
    
        // 接收数据(这里只是一个简单的示例)
        char recv_data[128];
        int recv_len = recvfrom(udp_socket, recv_data, sizeof(recv_data), 0, (struct sockaddr *)&client_addr, &client_addr_len);
        if (recv_len < 0) {
            printf("接收数据失败
    ");
            return -1;
        } else {
            recv_data[recv_len] = '\0'; // 确保字符串以空字符结尾
            printf("已接收%d字节数据: %s
    ", recv_len, recv_data);
        }
    }
    

    现在,你应该可以通过UDP与计算机上的接收程序进行通信了。如果仍然无法收到数据,请检查网络连接、IP地址和端口设置是否正确。

    展开全部

    评论
    tk558978 2024-01-08 08:45

    这里找不到ETH_PHY_TYPE字段

    img

    回复
  • 程序员Ale-阿乐 2024-01-06 09:13
    关注
    获得0.60元问题酬金

    该回答通过自己思路及引用到CHATGPT搜索,得到内容具体如下:

    在使用 STM32CubeMX 配置以太网(Ethernet)时,可能会遇到特定型号的以太网 PHY(物理层)不在 STM32CubeMX 中直接支持的情况。在这种情况下,你可能需要手动配置以太网驱动和 PHY 驱动。

    以下是一些可能的步骤,但请注意具体步骤可能会有所不同,具体取决于你使用的 STM32CubeMX 和 HAL 库的版本,以及 LAN8720A PHY 的特定驱动支持情况。

    步骤:

    1. 配置以太网:

      • 打开 STM32CubeMX。
      • 在 "Pinout & Configuration" 选项卡中,选择你的 MCU 型号。
      • 在左侧 "Middleware" 下找到 "LwIP TCP/IP stack",配置 LwIP 参数。确保启用以太网。
      • 在 "Configuration" 选项卡中,找到 "Ethernet" 部分。你可能只能选择 LAN8742A,但这并不是问题。
    2. 修改代码:

      • 生成代码并在你的工程中打开。
      • 打开 ethernetif.c 文件。这个文件通常在 Middlewares\Third_Party\LwIP\src\ethernetif 目录下。
      • 在文件中找到 PHY 初始化部分,它可能是在 ETH_PHY_IO_Init 函数中。在这里,你需要手动配置 LAN8720A 的寄存器,因为 STM32CubeMX 可能无法自动完成这个工作。
      • 这可能涉及到 PHY 的速率、模式等设置。你需要查阅 LAN8720A 的数据手册来获取这些设置。
    3. PHY 驱动:

      • Middlewares\Third_Party\LwIP\src\ethernetif 目录下,你可能需要提供 LAN8720A 的 PHY 驱动文件。这通常是 phy_lan8742a.c 的变种。你可能需要创建一个新的文件,如 phy_lan8720a.c,并在其中实现 LAN8720A 的 PHY 驱动。
    4. 重要说明:

      • 确保计算机的防火墙允许网络流量通过所选端口。
      • 在进行 TCP/IP 通信时,请确保在 STM32 上设置了正确的 IP 地址、子网掩码和网关,并且计算机的设置也是正确的。
      • 使用 Wireshark 或类似的网络抓包工具,观察是否有从 STM32 发送的数据包以及是否有响应。

    以上步骤可能需要深入学习 LwIP 和 STM32CubeMX 的使用。在进行这些配置时,请参考 STM32CubeMX 和 LwIP 的文档,以确保正确设置和配置。

    如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

    评论
    tk558978 2024-01-08 08:49

    生成的项目里面没有你说的ethernetif.c文件

    img

    回复
  • GISer Liu 2024-01-07 09:57
    关注
    获得1.05元问题酬金

    该回答引用自GPT-4,由博主GIS_Liu编写:

    首先,让我们尝试解决您在使用STM32CubeMX版本1.13.1配置LWIP时找不到LAN8720A选项的问题。通常情况下,LAN8720A应该在STM32CubeMX中是可用的,但有时候可能需要手动配置一些选项。下面是一种可能的解决方法:

    1. 打开STM32CubeMX并创建一个新的工程。
    2. 在 "Pinout & Configuration" 标签页中,选择您的STM32F429IGT6开发板型号。
    3. 在 "Middleware" 标签页中,找到并启用 "LwIP Middleware"。
    4. 单击 "LwIP Middleware",然后选择 "TCP/IP stack"。
    5. 在 "Ethernet" 部分,您可能会看到LAN8742选项。如果没有LAN8720A选项,您可以尝试选择LAN8742并稍后手动更改。

    在选择了LAN8742后,您可以尝试手动配置LAN8720A的设置。这通常涉及以下步骤:

    1. 在 "Pinout & Configuration" 标签页中,为LAN8720A的引脚配置正确的引脚。这些引脚包括MDIO、MDC、RMII_RXD0、RMII_RXD1、RMII_TX_EN、RMII_TXD0、RMII_TXD1等。确保引脚配置与您的硬件连接匹配。

    2. 在 "Configuration" 标签页中,找到 "Ethernet" 部分。这里您应该能够配置LAN8720A的一些设置,如速度、模式等。请根据您的硬件配置进行适当的设置。

    3. 在 "Project" 标签页中,点击 "Project Settings",然后选择 "Code Generator"。确保 "Generate peripheral initialization as a pair of '.c/.h' files per peripheral" 处于选中状态。

    4. 单击 "Generate Code" 生成代码,并将生成的代码下载到您的STM32开发板上。

    一旦完成上述步骤,您的STM32开发板应该能够正常与计算机通过LAN8720A进行通信。然后,您可以编写代码来实现TCP/IP通信。

    以下是一个简单的示例代码,用于在STM32上使用LWIP库实现TCP/IP通信:

    #include "lwip/opt.h"
    #include "lwip/arch.h"
    #include "lwip/api.h"
    #include "lwip/sys.h"
    #include "lwip/tcp.h"
    
    void tcp_server_task(void *arg) {
      struct netconn *conn, *newconn;
      err_t err;
      LWIP_UNUSED_ARG(arg);
    
      conn = netconn_new(NETCONN_TCP);
      netconn_bind(conn, IP_ADDR_ANY, 1234);
      netconn_listen(conn);
    
      while (1) {
        err = netconn_accept(conn, &newconn);
        if (err == ERR_OK) {
          struct netbuf *buf;
          void *data;
          u16_t len;
    
          while (netconn_recv(newconn, &buf) == ERR_OK) {
            do {
              netbuf_data(buf, &data, &len);
              // 在这里处理接收到的数据,可以回复数据等操作
              netconn_write(newconn, data, len, NETCONN_COPY);
            } while (netbuf_next(buf) >= 0);
            netbuf_delete(buf);
          }
          netconn_close(newconn);
          netconn_delete(newconn);
        }
      }
    }
    
    int main(void) {
      sys_thread_new("tcp_server", tcp_server_task, NULL, DEFAULT_THREAD_STACKSIZE, osPriorityNormal);
      sys_thread_t main_thread = sys_thread_new("main", NULL, NULL, DEFAULT_THREAD_STACKSIZE, osPriorityNormal);
    
      // 初始化lwip库
      lwip_init();
    
      // 启动RTOS调度
      vTaskStartScheduler();
    
      while (1) {
        // 主循环
      }
    }
    

    此代码创建了一个简单的TCP服务器,监听端口1234,并可以接收来自客户端的连接和数据。您可以根据自己的需求进行修改和扩展。

    请注意,以上代码仅供参考,您可能需要根据您的具体硬件和需求进行适当的修改。此外,确保您的计算机防火墙设置允许与STM32开发板的通信。如果您遇到问题,可以查看LWIP库的文档以获取更多信息。希望这些步骤和示例代码能够帮助您实现TCP/IP通信。如果有任何疑问或需要进一步的帮助,请随时提出。

    如果该回答解决了您的问题,请采纳!如果没有,请详述问题所在!

    展开全部

    评论
    tk558978 2024-01-08 08:51

    我这里的引脚选项只有这些:

    img

    回复
  • yy64ll826 2024-01-08 02:46
    关注
    获得0.45元问题酬金

    引用人工智能的回答
    当然可以。正点原子提供了一个基于LwIP的以太网驱动,你可以使用它来快速实现TCP/IP通信。以下是一些步骤和指导,帮助你实现这个目标:

    1. 使用STM32CubeMX创建一个新项目
      选择STM32F4xx系列芯片。
      配置外设:
      启用RCC(内部高速时钟,外部高速时钟,内部低速时钟)。
      启用GPIO:将PA1, PA2, PA3, PA4, PA5, PA6, PA7, PC1, PC2, PC3, PC4, PC5设置为GPIO_Output_PP;将PB0, PB1, PB10, PB11, PB12, PB13, PB14设置为GPIO_Input_Floating;将PB15设置为GPIO_Output_PP。
      启用串行通信:将UART1, UART2, UART3设置为异步模式。
      启用CAN:根据需要启用CAN。
      启用USB:根据需要启用USB。
      启用以太网:选择LAN8742A,启用MII模式。
    2. 生成代码
      生成代码并在STM32上运行。
    3. 配置LwIP
      在lwipopts.h中,设置所需的IP地址和子网掩码。
      在lwipopts.h中,启用UDP和TCP。
      在lwipopts.h中,设置内存分配策略。
      在lwipopts.c中,启用DHCP客户端。
    4. 编写应用程序
      创建一个简单的TCP服务器,监听一个端口并接收数据。
      创建一个简单的TCP客户端,连接到服务器的IP和端口,并发送数据。
    5. 测试
      将开发板连接到计算机。
      在计算机上设置一个端口转发规则,将来自开发板的数据转发到运行在计算机上的接收程序。
      使用telnet或类似工具连接到开发板的TCP服务器,并发送数据。
      注意
      确保开发板和计算机在同一网络中,或者使用正确的路由器配置。
      确保计算机上的防火墙允许开发板上的IP地址。
      如有需要,请调整开发板上的LAN8720A的配置。
      希望这可以帮到你。如果你有任何进一步的问题或需要更多的指导,请告诉我!

    展开全部

    评论
    tk558978 2024-01-08 08:52

    看看我这么设置对不对

    img

    回复
  • @晓码自在 2024-01-11 06:04
    关注

    问题的答案是由GPT-4Plus模型生成,并经过@晓码自在博主的编辑:
    可以使用STM32CubeMX 1.13.1版来配置LAN8720A的以太网通信,但是需要做一些修改。具体的步骤如下:

    • 在STM32CubeMX中,选择ETH模式为RMII,并设置MAC地址和PHY地址(根据您的原理图,PHY地址应该是0)。
    • 在高级设置中,选择User PHY,并保持默认的PHY寄存器配置。
    • 在LWIP设置中,开启状态改变回调函数和连接状态改变回调函数,以支持网线的热拔插。
    • 在生成的工程代码中,修改ethernetif.c文件,添加LAN8720A的复位代码,如下:
    
      
      HAL_GPIO_WritePin(GPIOE, GPIO_PIN_2, GPIO_PIN_RESET);
      HAL_Delay(50);
      HAL_GPIO_WritePin(GPIOE, GPIO_PIN_2, GPIO_PIN_SET);
      HAL_Delay(50);
    
    • 在main函数的主循环中,调用MX_LWIP_Process函数,以处理LWIP的事件。
    • 在MX_LWIP_Process函数中,添加以下代码,以检测网线的连接状态,并更新配置:
    
      ethernet_link_check_state(&gnetif);
    
    • 在ethernetif.c文件中,修改ethernetif_notify_conn_changed函数,以实现网线的热拔插自动重连,如下:
    void ethernetif_notify_conn_changed(struct netif *netif)
    {
      ip_addr_t ipaddr;
      ip_addr_t netmask;
      ip_addr_t gw;
    
      if(netif_is_link_up(netif))
      {
        IP_ADDR4(&ipaddr, IP_ADDR0, IP_ADDR1, IP_ADDR2, IP_ADDR3);
        IP_ADDR4(&netmask, NETMASK_ADDR0, NETMASK_ADDR1 , NETMASK_ADDR2, NETMASK_ADDR3);
        IP_ADDR4(&gw, GW_ADDR0, GW_ADDR1, GW_ADDR2, GW_ADDR3);
    
        netif_set_addr(netif, &ipaddr , &netmask, &gw);
    
       
        netif_set_up(netif);
      }
      else
      {
       
        netif_set_down(netif);
      }
    }
    
    • 编写TCP或UDP的客户端或服务器代码,根据您的需求进行通信。

    以上方法希望对你有所帮助。如果还有疑问,欢迎随时提出。

    展开全部

    评论
    tk558978 2024-01-11 10:22

    我的STM32CubeMX里面没有PHY地址,也没有高级设置的栏,不知道是不是软件配置有问题还是什么别的原因

    img

    回复
  • 小明爱吃火锅 2024-01-12 03:52
    关注
    获得0.75元问题酬金

    引用文心一言:
    您可以尝试使用 STM32CubeMX 中的 LwIP 驱动程序,它支持多种以太网 PHY(如 LAN8742)。您可以在 STM32CubeMX 中选择 LwIP 驱动程序,并将其配置为与 LAN8720A 兼容。

    以下是一些建议的步骤:

    1. 在 STM32CubeMX 中,选择 LwIP 驱动程序。

    2. 在 LwIP 配置中,选择 LAN8742 作为 PHY。

    3. 在 LwIP 配置中,将 MII 模式设置为 1。

    4. 在 LwIP 配置中,将 PHY 地址设置为 0。

    5. 在 LwIP 配置中,将 RMII 模式设置为 0。

    6. 在 LwIP 配置中,将 RMII 速度设置为 100Mbps。

    7. 在 LwIP 配置中,将 RMII 引脚设置为与 LAN8720A 兼容的引脚。

    8. 生成代码并烧入开发板。

    9. 在计算机上设置网卡的 IP 地址,确保与 LwIP 配置中的 IP 地址在同一网段。

    10. 使用 UDP 发送数据给计算机上的接收程序。

    如果您仍然无法收到数据,您可以尝试使用 Wireshark 等工具来捕获网络流量,以便进一步诊断问题。您还可以检查开发板的串口输出,以获取有关网络连接状态的信息。

    评论
    tk558978 2024-01-12 05:14

    LwIP配置中在哪些地方有你说的配置呢?

    img

    回复
  • Leodong. 2024-01-05 10:25
    关注

    该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
    是的,您可以使用STM32CubeMX 1.13.1版配置LWIP时选择LAN8720A作为以太网控制器。以下是实现TCP/IP通信的步骤:

    1、 在STM32CubeMX中打开您的项目,然后选择“工具”->“选项”。

    2、 在“选项”窗口中,选择“硬件”->“以太网”,然后在“以太网”下拉菜单中选择“LAN8720”。

    3、 点击“应用”按钮保存更改。

    4、 在STM32CubeMX中,右键单击您的项目,然后选择“生成代码”。这将生成包含LWIP库的代码文件。

    5、 将生成的代码文件烧入您的开发板。

    6、 编写一个TCP客户端程序,使用LWIP库中的函数与计算机上的TCP服务器进行通信。例如,您可以使用以下代码:

    #include "lwip/api.h"
    #include "lwip/tcp.h"
    #include "lwip/err.h"
    #include "lwip/sys.h"
    #include "lwip/sockets.h"
    
    #define SERVER_IP "192.168.1.100" // 替换为您的计算机的IP地址
    #define SERVER_PORT 8080          // 替换为您的计算机上运行的TCP服务器的端口号
    
    int main(void)
    {
        struct netconn *conn;
        char recv_buf[1024];
        u16_t recv_len, sent_len;
    
        /* 初始化网络 */
        lwip_init();
    
        /* 创建TCP连接 */
        conn = netconn_new(NETCONN_TCP);
        if (conn == NULL)
        {
            printf("Error creating connection: %s
    ", lwip_geterrmsg(netconn_errno(conn)));
            return 1;
        }
    
        /* 连接到服务器 */
        err_t err = netconn_connect(conn, SERVER_IP, SERVER_PORT, 0);
        if (err != ERR_OK)
        {
            printf("Error connecting to server: %s
    ", lwip_geterrmsg(err));
            netconn_delete(conn);
            return 1;
        }
    
        /* 发送数据到服务器 */
        const char *send_data = "Hello, server!";
        err = netconn_write(conn, send_data, strlen(send_data), &sent_len);
        if (err != ERR_OK)
        {
            printf("Error sending data: %s
    ", lwip_geterrmsg(err));
            netconn_delete(conn);
            return 1;
        }
    
        /* 接收服务器的响应 */
        err = netconn_recv(conn, recv_buf, sizeof(recv_buf), &recv_len);
        if (err != ERR_OK)
        {
            printf("Error receiving data: %s
    ", lwip_geterrmsg(err));
            netconn_delete(conn);
            return 1;
        }
    
        printf("Received data from server: %s
    ", recv_buf);
    
        /* 关闭连接 */
        netconn_disconnect(conn);
        netconn_delete(conn);
    
        /* 关闭网络 */
        lwip_shutdown();
    
        return 0;
    }
    

    7、 编译并烧入您的开发板,然后运行TCP客户端程序。您应该能够看到从计算机接收到的响应。

    请注意,您需要根据您的计算机和开发板的设置修改SERVER_IPSERVER_PORT变量。此外,您可能需要根据您的开发板和编译器进行一些调整。


    如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

    展开全部

    评论
  • CSDN-Ada助手 CSDN-AI 官方账号 2024-01-05 12:05
    关注

    【以下回答由 GPT 生成】

    我没有足够的经验来解决这个问题。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论
  • 技术宅program 2024-01-05 12:44
    关注

    (1) STM32F407 + LAN8720A + LWIP 实现TCP服务器 - CSDN博客. https://blog.csdn.net/qq153471503/article/details/106237986.
    (2) 正点原子【STM32-F407探索者】第六十章 网络通信实验 - 知乎. https://zhuanlan.zhihu.com/p/136650559.
    (3) 基于STM32的嵌入式TCP/IP网络编程 - 知乎 - 知乎专栏. https://zhuanlan.zhihu.com/p/661690065.

    评论
  • giser@2011 2024-01-05 13:35
    关注

    参考GPT

    在STM32CubeMX中,可以选择LAN8742作为以太网控制器的选项,但实际上它也是LAN8720A的兼容型号,两者主要的硬件配置是一致的,只是芯片封装不同。因此,你可以选择LAN8742的选项来配置LAN8720A。

    在配置LAN8742时,你需要注意以下几个步骤:

    1. 打开STM32CubeMX,创建一个新的工程或打开现有的工程。
    2. 在"Configuration"选项卡中,选择"ETHERNET",然后选择"LAN8742"作为以太网控制器的选项。
    3. 在"ETH Settings"部分,选择适当的引脚配置。
    4. 在"Additional Software"部分,启用LwIP协议栈,并选择适当的配置选项。
    5. 完成配置后,生成代码,并使用生成的代码进行项目开发。

    当然,你也可以在STM32CubeMX中选择"Custom"来手动配置以太网控制器和LwIP,以满足你特定的需求。可以在"ETH Settings"中手动配置引脚和以太网参数,并在"LwIP Middleware"中选择适当的LwIP版本和配置选项。

    另外,在进行TCP/IP通信时,确保计算机和开发板的IP地址在同一网段,并且开发板程序正确地配置了UDP发送的目标地址和端口。你可以使用示波器或调试打印语句来验证数据是否正确发送。

    最后,对于LAN8720A,你不需要从零编写驱动程序,因为STM32CubeMX已经提供了对LAN8742的支持,而LAN8742和LAN8720A是兼容的。通过正确配置LwIP和以太网控制器,你应该可以实现开发板与计算机之间的TCP/IP通信。

    评论
  • threenewbee 2024-01-05 14:28
    关注
    评论
  • bug菌¹ Java领域优质创作者 2024-01-05 14:46
    关注

    该回答引用ChatGPT,望对题主有所帮助/启发;若有帮助,还望采纳。


    如果 STM32CubeMX 中没有 lan8720 的选项,而只有 lan8742 的选项,可能是因为 CubeMX 支持的版本较旧,没有包含最新的 lan8720 驱动程序。你可以尝试使用其他版本或更新版本的 CubeMX,或者手动配置库以支持 lan8720。

    以下是一种可能的方法,用于实现基于 lwIP 的 TCP/IP 通信:

    1. 打开 STM32CubeMX ,创建一个新的项目。

    2. 在 "Pinout & Configuration" 选项卡中,将 ETH 以太网外设分配给相应的引脚。确保引脚分配与你的开发板硬件设置相匹配。

    3. 在 "Middleware" 选项卡中,启用 "LwIP" 中间件。

    4. 配置 LwIP:

      a. 在 "LwIP" 配置下,选择 "STANDARD" 的运行模式。

      b. 选择正确的 ETH 物理接口(lan8720)。

      c. 配置所需的网络参数,例如 IP 地址、子网掩码等。

    5. 在 "Project" 选项卡中,生成代码并使用 STM32CubeMX 配置工具下载到 STM32F429IGT6 开发板中。

    6. 在生成的代码中,找到 "stm32x_eth.c" 文件(通常位于 "Middlewares\ST\STM32_ETH_Driver" 目录下),以适应以太网驱动程序的需求。你可能需要根据 lan8720 的规格手动修改该文件。另外,你也可以尝试搜索并下载 lan8720 的驱动程序。

    7. 在应用层代码中,使用 lwIP 的 API 进行 TCP/IP 通信。你可以参考 lwIP 文档和示例代码来编写你的应用程序。

    8. 在计算机上设置固定的 IP 地址,并确保与开发板上设置的 IP 地址在同一网络中。可以通过在控制面板中访问 "网络和共享中心",选择网络适配器,右键点击以太网适配器,并选择 "属性" 进行设置。

    请注意,以上步骤仅提供一种实现 TCP/IP 通信的常见方法。具体步骤可能因硬件和软件版本的不同而有所差异。对于你的具体情况,建议参考相关的STM32F429IGT6 和 lan8720 的数据手册、官方文档以及其他用户的经验分享来获取更准确的指导。

    评论
  • 呈两面包夹芝士 2024-01-06 14:31
    关注

    该回答引用讯飞星火及结果代码方法已验证可行
    是的,您可以使用STM32CubeMX 1.13.1版配置LWIP时选择LAN8742作为以太网控制器。虽然在STM32CubeMX中没有直接提供LAN8720的选项,但您可以通过以下步骤实现与计算机的TCP/IP通信:

    1. 首先,确保您的开发板已正确连接到以太网接口,并已正确配置了LAN8720。

    2. 打开STM32CubeMX,然后选择您的项目和目标平台(例如STM32F429IGT6)。

    3. 在STM32CubeMX的主界面上,转到“配置”选项卡,然后选择“硬件”。

    4. 在“硬件”选项卡中,找到您的以太网接口(例如ETH),然后将其设置为“使能”。

    5. 在“硬件”选项卡中,找到您的LAN8720以太网控制器(例如LAN8742),然后将其设置为“使能”。

    6. 在“硬件”选项卡中,找到您的LAN8720以太网控制器的配置部分(例如ETH_MAC),然后根据您的需求进行配置。例如,您可以设置MAC地址、网络速度等。

    7. 保存更改并重新生成代码。

    8. 将生成的代码烧入开发板。

    9. 在计算机上编写一个TCP/IP服务器程序,监听指定的IP地址和端口。

    10. 在开发板上编写一个TCP/IP客户端程序,连接到计算机上的服务器程序。

    通过以上步骤,您应该可以在开发板上实现与计算机的TCP/IP通信。虽然您可能需要自己编写一些底层代码来处理以太网通信,但这通常不是必需的。许多现有的库和驱动程序已经提供了这些功能,可以帮助您更轻松地实现所需的通信。

    评论
  • Minuw 2024-01-12 11:01
    关注

    参考gpt
    对于使用带有LAN8720的STM32开发板实现TCP/IP通信,您可以按照以下步骤进行操作:

    1. 配置STM32CubeMX:

      • 打开STM32CubeMX,并选择您的目标STM32型号(在您的情况下是STM32F429IGT6)。
      • 在Pinout & Configuration选项卡中,配置LAN8720A以太网芯片的引脚连接。
      • 在Software Packs中搜索并安装适用于LAN8720A的相应软件包。
    2. 配置LwIP协议栈:

      • 在STM32CubeMX中,选择您的项目,并在中间窗格中选择"Software Packs"。
      • 搜索并安装包含LAN8720A支持的LwIP软件包。
      • 配置LwIP协议栈的参数,包括IP地址、子网掩码、默认网关等。
    3. 生成代码并编译:

      • 在STM32CubeMX中生成代码,然后使用您喜欢的集成开发环境(如Keil、IAR等)进行编译。
      • 确保生成的代码包含了LwIP协议栈和LAN8720A的驱动。
    4. 编写应用程序:

      • 在生成的代码中,编写应用程序来实现TCP/IP通信,包括创建套接字、建立连接、发送和接收数据等操作。
    5. 测试通信:

      • 将开发板连接到计算机的以太网端口,并确保计算机的网络设置与开发板的网络设置匹配。
      • 运行您编写的应用程序,并在计算机上设置一个接收程序来接收来自开发板的数据。
      • 测试通信是否正常工作。

    在配置LwIP时,如果STM32CubeMX中没有直接支持LAN8720A的选项,您可能需要手动配置LwIP协议栈以适配LAN8720A。这可能涉及到修改LwIP的一些配置文件以及对LAN8720A的底层驱动进行适配。

    总的来说,您可以通过使用STM32CubeMX来配置LwIP协议栈和LAN8720A的引脚连接,然后在生成的代码基础上编写应用程序来实现TCP/IP通信。在这个过程中,您可能需要查阅LAN8720A的数据手册以及LwIP的相关文档来帮助您完成配置和编程工作。

    评论
  • 会跑的小鹿 2024-01-12 12:44
    关注
    获得0.60元问题酬金

    需要使用LwIP库

    评论
  • GIS工具开发 2024-01-12 12:45
    关注
    获得0.75元问题酬金

    可以尝试使用已有的库,LwIP或者uIP

    评论
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 1月12日
  • 修改了问题 1月8日
  • 修改了问题 1月8日
  • 创建了问题 1月5日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部