欢迎查看本文所在的系列,STM32的LWIP应用,点击跳转

main函数

区域1是lwip的初始化
void LwIP_Init(void)
{struct ip_addr ipaddr;struct ip_addr netmask;struct ip_addr gw;mem_init();//内存堆初始化memp_init();//内存池初始化IP4_ADDR(&ipaddr, 192, 168, 16, 211);IP4_ADDR(&netmask, 255, 255 , 255, 0);IP4_ADDR(&gw, 192, 168, 16, 1);netif_add(&netif, &ipaddr, &netmask, &gw, NULL, ðernetif_init, ðernet_input);//添加新网卡到网卡列表netif_set_default(&netif);//将网卡设置为默认网卡netif_set_up(&netif);//打开网卡
}
区域2
void tcp_server_init(void)
{/* create new tcp pcb */tcp_server_pcb = tcp_new();//建立一个新的连接标志(pcb),在定义一个tcp_pcb控制块后应该首先被调用,以建立该控制块的连接标志if (tcp_server_pcb != NULL){err_t err;/* bind echo_pcb to port 7 (ECHO protocol) */err = tcp_bind(tcp_server_pcb, IP_ADDR_ANY, 7);//绑定本地的IP地址和端口号,可以将其绑定在一个任意的本地IP地址上,它也只能在函数tcp_new()调用之后才能调用if (err == ERR_OK){/* start tcp listening for echo_pcb */tcp_server_pcb = tcp_listen(tcp_server_pcb);//在绑定成功后,监听端口,在这里监听端口,说明是建立的服务器,与之对应的是tcp_connect,代表的是客户机/* initialize LwIP tcp_accept callback function */tcp_accept(tcp_server_pcb, tcp_server_accept);//接收后调用此函数 ,回调函数,通知LwIP一个新来的连接已经被接收,这其中tcp_server_accept是函数名字,这或许也应该叫回调函数的注册printf("Create TCP server success");printf("\r\nTCP server IP  : 192.168.16.211");printf("\r\nTCP server port: 7");printf("\r\n\r\n");}else {printf("Can not bind pcb\n");}}else{printf("Can not create new pcb\n");}
}
下面讲解tcp_server_accept函数
static err_t tcp_server_accept(void *arg, struct tcp_pcb *newpcb, err_t err)
{err_t ret_err;/* set priority for the newly accepted tcp connection newpcb */tcp_setprio(newpcb, TCP_PRIO_MIN);//设置这个网络控制块的优先级/* pass newly allocated es structure as argument to newpcb */tcp_arg(newpcb, NULL);//传递一个参数 arg 给后面的调用使用,可以传一个结构体,指定应该传递给所有回调函数的应用程序的具体状态,详见下面的备注/* initialize lwip tcp_recv callback function for newpcb  */ tcp_recv(newpcb, tcp_server_recv);//当服务器接收到数据时调用tcp_server_recv函数/* initialize lwip tcp_err callback function for newpcb  */tcp_err(newpcb, tcp_server_error);//当服务器出现错误时调用tcp_server_error函数/* initialize lwip tcp_poll callback function for newpcb */tcp_poll(newpcb, tcp_server_poll, 10);//定时调用tcp_server_poll函数,参数10,代表每间隔5s调用,其它看上面区域3的解释/* initialize lwip tcp_sever_sent_ok callback function for newpcb */tcp_sent(newpcb, tcp_sever_sent_ok);//当服务器发送完数据之后调用tcp_sever_sent_ok函数ret_err = ERR_OK;return ret_err;
}
备注:
关于 tcp_arg(newpcb, NULL);
我们传入的参数是NULL,为空
但是这个可以不传入空参数,详见官方demo
其中,我们看tcpsever接收函数
/*** @brief  This function is the implementation for tcp_recv LwIP callback* @param  arg: pointer on a argument for the tcp_pcb connection* @param  tpcb: pointer on the tcp_pcb connection* @param  pbuf: pointer on the received pbuf* @param  err: error information regarding the reveived pbuf* @retval err_t: error code*/
static err_t tcp_server_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
{uint8 *p_data;uint32 data_len;if ((err == ERR_OK) && (p != NULL)){tcp_server_send_back(tpcb, p);printf("TCP server returns the received data\r\n\r\n");pbuf_free(p);}else{if(tpcb->state == CLOSE_WAIT){printf("TCP client downline\r\n");printf("TCP client IP  : %d.%d.%d.%d\r\n",(uint8)(tpcb->remote_ip.addr),(uint8)((tpcb->remote_ip.addr)>>8),(uint8)((tpcb->remote_ip.addr)>>16),(uint8)((tpcb->remote_ip.addr)>>24));printf("TCP client port: %d",tpcb->remote_port);printf("\r\n\r\n");tcp_arg(tpcb, NULL);tcp_sent(tpcb, NULL);tcp_recv(tpcb, NULL);tcp_err(tpcb, NULL);tcp_poll(tpcb, NULL, 0);/* close tcp connection */tcp_close(tpcb);}}return ERR_OK;
}

区域3:

整个lwip协议栈的定时调用功能,这个在本工程中使用的是在主循环中,在大工程中可以放在定时器中,

如果看文字版太枯燥,可以点击看视频版:点击跳转

STM32使用LWIP库新建tcp_sever相关推荐

  1. 正点原子STM32(基于HAL库)0

    目录 开发环境搭建与使用 常用开发工具简介 MDK 安装 仿真器驱动安装 CH340 USB 虚拟串口驱动安装 使用MDK5 编译例程 使用串口下载程序 使用DAP 下载与调试程序 使用DAP 下载程 ...

  2. 【STM32】HAL库 STM32CubeMX教程十五---FMC-SDRAM(一)

    前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 本文 1首先讲解什么是FMC及SDRAM,W9825G6KH芯片原理,2基于CubeMx创建工程 ...

  3. 【STM32】HAL库 STM32CubeMX教程十四---SPI

    前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 在我们的HAL库中,对硬件SPI函数做了很好的集成,使得之前SPI几百行代码,在HAL库中,只需 ...

  4. 【STM32】HAL库 STM32CubeMX教程十一---DMA (串口DMA发送接收)

    前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1.芯片: STM32F407ZET6/ STM32F103ZET6 ...

  5. 【STM32】HAL库 STM32CubeMX教程十---DAC

    前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1.芯片: STM32F407ZET6/ STM32F103ZET6 ...

  6. 【STM32】HAL库 STM32CubeMX教程九---ADC

    前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1.芯片: STM32F407ZET6/ STM32F103ZET6 ...

  7. 配置CLion进行嵌入式STM32的HAL库开发

    前言 时不可以苟遇,道不可以虚行. 一.准备 1.软件 CLion-2020:百度网盘提取链接放在文章最后. STM32CubeMX:使用 6.5.0 版本的,不要使用最新版本的 CubeMX,不然没 ...

  8. 【STM32】标准库与HAL库对照学习教程六--位带操作

    [STM32]标准库与HAL库对照学习教程六--位带操作 一.前言 二.准备工作 三.位带介绍 1.位带操作 2.STM32位带及位带别名区域 四.位带区与位带别名区地址转换 五.GPIO的位带操作 ...

  9. 【STM32】标准库与HAL库对照学习教程八--串口通信详解

    [STM32]标准库与HAL库对照学习教程八--串口通信详解 一.前言 二.准备工作 三.通信的基本概念 1.通信方式 2.串行通信与并行通信 (1)串行通信 (2)并行通信 3.异步通信与同步通信 ...

最新文章

  1. 机器学习笔记八:常见“距离”归纳
  2. java maven centos7 yum安装
  3. java内存模型 原子性_Java内存模型JMM 高并发原子性可见性有序性简介 多线程中篇(十)...
  4. Faster-RCNN训练时遇到的问题
  5. [网络安全自学篇] 十八.XSS跨站脚本攻击原理及代码攻防演示(一)
  6. Android下强制打开软键盘
  7. phantomJs原理
  8. 美团服务体验平台对接业务数据的最佳实践-海盗中间件
  9. nuxt的asyncdata页面刷新params数据丢失_React navigation goBack方法返回刷新
  10. 未来 12 个月,哪种编程语言将会流行?
  11. Java 对象不使用时,为什么要赋值为 null?
  12. 通向Golang的捷径【3.编辑器,IDE 和其他工具】
  13. otl连接mysql数据库_C++类库:OTL连接MySQL ODBC数据库(insert, update, select)
  14. 影片下载观看秘籍大全
  15. Java实现手机登录功能
  16. 我们的时空之旅(一)——丽江古城
  17. 互联网大公司与创业公司
  18. php打印马赛克,PHP-如何用PHP给一张图生成马赛克效果?
  19. 专为mac用户设计的苹果手机助手。爱思助手 Mac版结构更清晰,功能更好用,界面更清晰,让你能够轻松查看设备信息,下载最新最火的应用游戏。
  20. 【ffmpeg】创建AAC编码器

热门文章

  1. ubuntu双系统时间同步_解决Ubuntu 16.04.6 + Win10 双系统时间错误且不一致问题
  2. java 线程退出cmd_java 线程的终止与线程中断
  3. python装饰器记录每一个函数的执行时间
  4. 创造自己的专属免费网盘:Nextcloud
  5. 再生龙u盘复制linux,再生龙制作U盘启动盘教程 | 楚盟博客
  6. 多线程、方便扩展的Windows服务程序
  7. iview表格嵌套Tooltip
  8. Docker监控方案之cAdvisor
  9. 琢越网用户使用手册和反馈
  10. Spring MVC如何测试Controller(使用springmvc mock测试)