当前位置:   article > 正文

使用LwIP实现TCP Client通信(基于STM32F407)_f407tcp客户端程序

f407tcp客户端程序

目录

概述

1 功能介绍

1.1 代码框架

2.2 搭建系统

2 TCP Client功能实现

2.1 代码实现

2.2 具体代码

3 功能测试

3.1 测试功能描述

3.2 运行代码


测试代码下载地址:

stm32-f407-dm9161-LwIP-tcp-client资源-CSDN文库

概述

本文主要介绍使用STM32F407和LwIP实现基于TCP/IP 协议的Client,笔者记录搭建系统的整个过程,并在板卡上运行,以测试Client连接至Server,并且可以正常接收或者发送数据。

1 功能介绍

1.1 代码框架

笔者基于ST官方移植的LwIP的示例代码,对其修改并使其支持STM32F407芯片,以太网络芯片为DM9161。下面介绍该和LwIP功能相关的测试程序的框架结构:

1)LwIP

LwIP的应用代码包,包括各类底层协议的实现代码,应用代码,还包括内存分配函数等

2)LwIP/Drv

DM9161的驱动程序,以及stm32f407 ETH接口的驱动程序

3)LwIP/App

使用LwIP的代码库实现user的功能代码

2.2 搭建系统

1)使用串口调试工具,监控log信息

2)使用网络调试助手,并将其配置为server,并配置相关的IP和端口号

2 TCP Client功能实现

2.1 代码实现

代码99行: 配置服务器的IP

代码102行:创建tcp控制块

代码109行:绑定客户端的IP和端口号

代码114行:连接服务器,并调用回调函数

2.2 具体代码

  1. #include "bsp.h"
  2. /* for LwIP */
  3. #include "netconf.h"
  4. #include "tcp.h"
  5. #include "lwip/memp.h"
  6. #include "lwip/tcp.h"
  7. void lwip_pro(void);
  8. /* 定义端口号 */
  9. #define TCP_REMOTE_PORT 19999 /* 远端端口 */
  10. #define TCP_LOCAL_PORT 2980 /* 本地端口 */
  11. /******************************************************************************
  12. * 描述 : 数据接收回调函数
  13. * 参数 : -
  14. * 返回 : -
  15. ******************************************************************************/
  16. static err_t tcp_client_recv(void *arg, struct tcp_pcb *tpcb,
  17. struct pbuf *p, err_t err)
  18. {
  19. uint32_t i;
  20. /* 数据回传 */
  21. //tcp_write(tpcb, p->payload, p->len, 1);
  22. if (p != NULL)
  23. {
  24. struct pbuf *ptmp = p;
  25. /* 打印接收到的数据 */
  26. printf("get msg from %d:%d:%d:%d port:%d:\r\n",
  27. *((uint8_t *)&tpcb->remote_ip.addr),
  28. *((uint8_t *)&tpcb->remote_ip.addr + 1),
  29. *((uint8_t *)&tpcb->remote_ip.addr + 2),
  30. *((uint8_t *)&tpcb->remote_ip.addr + 3),
  31. tpcb->remote_port);
  32. while(ptmp != NULL)
  33. {
  34. for (i = 0; i < p->len; i++)
  35. {
  36. printf("%c", *((char *)p->payload + i));
  37. }
  38. ptmp = p->next;
  39. }
  40. printf("\r\n");
  41. tcp_recved(tpcb, p->tot_len);
  42. /* 释放缓冲区数据 */
  43. pbuf_free(p);
  44. }
  45. else if (err == ERR_OK)
  46. {
  47. printf("tcp client closed\r\n");
  48. tcp_recved(tpcb, p->tot_len);
  49. return tcp_close(tpcb);
  50. }
  51. return ERR_OK;
  52. }
  53. /******************************************************************************
  54. * 描述 : 连接服务器回调函数
  55. * 参数 : -
  56. * 返回 : -
  57. ******************************************************************************/
  58. static err_t tcp_client_connected(void *arg, struct tcp_pcb *tpcb, err_t err)
  59. {
  60. printf("tcp client connected \r\n");
  61. tcp_write(tpcb, "tcp client connected", strlen("tcp client connected"), 0);
  62. /* 注册接收回调函数 */
  63. tcp_recv(tpcb, tcp_client_recv);
  64. return ERR_OK;
  65. }
  66. /******************************************************************************
  67. * 描述 : 创建tcp客户端
  68. * 参数 : 无
  69. * 返回 : 无
  70. ******************************************************************************/
  71. void tcp_client_init(void)
  72. {
  73. struct tcp_pcb *tpcb;
  74. ip_addr_t serverIp;
  75. /* 服务器IP */
  76. IP4_ADDR(&serverIp, 192, 168, 1, 4);
  77. /* 创建tcp控制块 */
  78. tpcb = tcp_new();
  79. if (tpcb != NULL)
  80. {
  81. err_t err;
  82. /* 绑定本地端号和IP地址 */
  83. err = tcp_bind(tpcb, IP_ADDR_ANY, TCP_LOCAL_PORT);
  84. if (err == ERR_OK)
  85. {
  86. /* 连接服务器 */
  87. tcp_connect(tpcb, &serverIp, TCP_REMOTE_PORT, tcp_client_connected);
  88. }
  89. else
  90. {
  91. memp_free(MEMP_TCP_PCB, tpcb);
  92. printf("can not bind pcb \r\n");
  93. }
  94. }
  95. }
  96. /*
  97. *********************************************************************************************************
  98. *函 数 名: main
  99. *功能说明: c程序入口
  100. *形 参:无
  101. *返 回 值: 错误代码(无需处理)
  102. *********************************************************************************************************
  103. */
  104. int main(void)
  105. {
  106. bsp_Init(); /* 硬件初始化 */
  107. /* Initilaize the LwIP stack */
  108. LwIP_Init();
  109. tcp_client_init();
  110. while(1)
  111. {
  112. lwip_pro();
  113. }
  114. }
  115. /*
  116. *********************************************************************************************************
  117. *函 数 名: lwip_pro
  118. *功能说明: lwip 轮询,插入到主循环中
  119. *形 参: 无
  120. *返 回 值: 无
  121. *********************************************************************************************************
  122. */
  123. void lwip_pro(void)
  124. {
  125. /* check if any packet received */
  126. if (ETH_CheckFrameReceived())
  127. {
  128. /* process received ethernet packet */
  129. LwIP_Pkt_Handle();
  130. }
  131. /* handle periodic timers for LwIP */
  132. LwIP_Periodic_Handle(bsp_GetRunTime() / 10);
  133. }

3 功能测试

3.1 测试功能描述

1)上位机使用网络调试助手作为服务器,并发送数据给客户端

2)客户端接收到server发送的数据后,并通过串口终端打印出来

3)比较server和Client两边的数据是否一致

3.2 运行代码

1) 下载代码至板卡,保证Client能正常的连接到Server

2) Client 通过串口终端查看连接情况

 3)Server端口发送数据至Client,查看其是否一致

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/565348
推荐阅读
相关标签
  

闽ICP备14008679号