基于STM32CUBE的LWIP+FREERTOS+Socket构成的TCP服务器

2023-05-16

本实验基于STM32F767制作

一、实验目的

本实验主要目的是通过Socket网络编程方法完成通过以太网控制两个LED的亮灭的,同理可用到继电器上控制其它高电压设备。

二、实验步骤

1.首先先生成一个带有LWIP和FreeRTOS的项目,并将网络ping通,如果不会的参照我第一篇文章STM32cubeMX将STM32F767+LAN8720+LwIP+FreeRTOS的以太网实现

2.先对项目进行编译,确认项目无误后新建一个名叫socketserver.c的文件,将以下代码附到文件中,代码内容讲解我已附在代码后

#include <lwip/sockets.h>
#include <lwip/err.h>
#include <lwip/sys.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>								//包含需要的所有头文件,(实现socket和标准输入输出)
#include "gpio.h"								//LED灯的使能
#define	SERVER_PORT			50000				//配置服务器端口号,最好设为2000以后,之前的端口部分在其它通信协议中被默认使用

uint8_t data_buffer[100];						//定义接收到的数据Buff大小为100
char tcp_server_recvbuf[300];					//定义数据处理Buff大小为300(为100也无所谓,只要大于等于100就好)

static void tcp_server_thread(void *p_arg)		//定义TCP服务器线程
{
	struct sockaddr_in server_addr;				//服务器地址
	struct sockaddr_in conn_addr;				//连接地址
	int sock_fd;								//服务器的 socked 
	int sock_conn;								// 请求的 socked 
	socklen_t addr_len;							// 地址长度 
	int err;
	int length;
	int num;
//	int count = 0;
	
	
	sock_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);		//建立一个新的socket连接	
	memset(&server_addr, 0, sizeof(server_addr));				//将服务器地址清空
	server_addr.sin_family = AF_INET;							//地址家族
	server_addr.sin_addr.s_addr =htonl(INADDR_ANY);				//注意转化为网络字节序
	server_addr.sin_port = htons(SERVER_PORT);					//使用SERVER_PORT指定为程序头设定的端口号
	
	err = bind(sock_fd, (struct sockaddr *)&server_addr, sizeof(server_addr));	//建立绑定
	if (err < 0)															    //如果绑定失败则关闭套接字
	{
			closesocket(sock_fd); 												//关闭套接字
	}
	
	err = listen(sock_fd, 1);									//监听连接请求
	if (err < 0) 												//如果监听失败则关闭套接字
	{
			closesocket(sock_fd); 								//关闭套接字
	}
		addr_len = sizeof(struct sockaddr_in);					//将链接地址赋值给addr_len
	
		sock_conn = accept(sock_fd, (struct sockaddr *)&conn_addr, &addr_len);	//对监听到的请求进行连接,状态赋值给sock_conn
	
		if(sock_conn<0)											//状态小于0代表连接故障,此时关闭套接字
		{
			closesocket(sock_fd);
		}
		else send(sock_conn, "connect success!\n\r", 20, 0);	//连接成功则发送“connect success!”给客户端
	
	while (1) 
	{
		memset(data_buffer, 0, sizeof(data_buffer));			//清空接收Buff
		
		length = recv(sock_conn, (unsigned int *)data_buffer, 100, 0);	//将收到的数据放到接收Buff
		
		for(num=0;num<100;num++)								//接收Buff的数据转移到数据处理Buff,防止之后数据混乱		
		{
			tcp_server_recvbuf[num]=data_buffer[num];
		}
		
		if(tcp_server_recvbuf[2]=='L'&tcp_server_recvbuf[3]=='E'&tcp_server_recvbuf[4]=='D'&
									tcp_server_recvbuf[5]=='1'&tcp_server_recvbuf[6]=='O'&tcp_server_recvbuf[7]=='N')
									//判断收到的数据是否为LED1ON
								{
								HAL_GPIO_WritePin(GPIOB,  GPIO_PIN_0, GPIO_PIN_RESET);		//打开LED1
								send(sock_conn, "LED1已打开\n",strlen("LED1已打开\n"), 1);	//回复客户端LED1已打开

								}
								
								if(tcp_server_recvbuf[2]=='L'&tcp_server_recvbuf[3]=='E'&tcp_server_recvbuf[4]=='D'&
									tcp_server_recvbuf[5]=='1'&tcp_server_recvbuf[6]=='O'&tcp_server_recvbuf[7]=='F'&tcp_server_recvbuf[8]=='F')
									//判断收到的数据是否为LED1OFF
								{
								HAL_GPIO_WritePin(GPIOB,  GPIO_PIN_0, GPIO_PIN_SET);		//关闭LED1
								send(sock_conn, "LED1已关闭\n",strlen("LED1已关闭\n"), 1);	//回复客户端LED1已关闭
								}
								/*LED0使用指令*/
								if(tcp_server_recvbuf[0]=='L'&tcp_server_recvbuf[1]=='E'&tcp_server_recvbuf[2]=='D'&
									tcp_server_recvbuf[3]=='0'&tcp_server_recvbuf[4]=='O'&tcp_server_recvbuf[5]=='N')	
									//判断收到的数据是否为LED0ON
								{
								HAL_GPIO_WritePin(GPIOB,  GPIO_PIN_1, GPIO_PIN_RESET);		//打开LED0
								send(sock_conn, "LED0已打开\n",strlen("LED0已打开\n"), 1);	//回复客户端LED0已打开
								}
								
								if(tcp_server_recvbuf[2]=='L'&tcp_server_recvbuf[3]=='E'&tcp_server_recvbuf[4]=='D'&
									tcp_server_recvbuf[5]=='0'&tcp_server_recvbuf[6]=='O'&tcp_server_recvbuf[7]=='F'&tcp_server_recvbuf[8]=='F')
									//判断收到的数据是否为LED0OFF
								{
								HAL_GPIO_WritePin(GPIOB,  GPIO_PIN_1, GPIO_PIN_SET);		//关闭LED0
								send(sock_conn, "LED0已关闭\n",strlen("LED0已关闭\n"), 1);	//回复客户端LED0已关闭
								}
	}
}

void tcp_server_init(void)	//TCP服务器初始化
{
	sys_thread_new("tcp_server_thread",  tcp_server_thread, NULL, DEFAULT_THREAD_STACKSIZE, DEFAULT_THREAD_PRIO - 1);
		//进入TCP服务器线程
}

将上述文件包含在生成的项目中,打开项目,文件列表中找到Application/User/freertos.c,在该文件下生成的TCP任务中写上tcp_server_init();
如图所示
在这里插入图片描述
编译工程之后下载到开发板,设置好PC机的IP地址等连接测试

三、实验结果

打开网络调试助手,对STM32进行连接,连接成功会提示connect success!
输入LED0ON发送后会返回LED0已打开,
在这里插入图片描述
开发板如图,DS0已亮
DS0已亮
接下来就不给大家赘述了,以上就是该实验的全部过程,感谢采纳。
本文作者为CSDN的ASWaterbenben写博不易,转载的时候请附上来源,谢谢大佬。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于STM32CUBE的LWIP+FREERTOS+Socket构成的TCP服务器 的相关文章

  • TCP recvfrom() 不存储“from”

    我正在使用 TCP 制作一个服务器程序 我想获取我刚刚收到的消息发送者的 IP 地址 这是我的代码 case FD READ Incoming data get ready to receive char buffer DEFAULT BU
  • 如何监控 TCP 连接的 cwnd 和 ssthresh 值? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我希望在通过套接字连接发送或接收数据包时确定这些值 有没有现有的工具可以做到这一点 The ss http linux die net m
  • 连接被对等方重置:套接字写入错误。我的 Java 代码出了什么问题

    我正在尝试从独立的 java 应用程序创建并维护到主机的 TCP 连接 本地端口和服务器端口相同 8999 连接后 我必须向服务器发送一条消息 lt STX gt username fred password abcd lt ETX gt
  • Linux Socket write() 的错误文件描述符 错误的文件描述符 C

    我对 write 2 函数有一个有趣的问题 PrepareResponseForSetCoordinates 函数会导致写入时出现错误的文件描述符错误 这是错误行 perror 写入套接字时出错 总产量 写入套接字时出错 文件描述符错误 我
  • Nodejs TCP连接客户端端口分配

    我使用nodejs在客户端和服务器之间创建了tcp连接 网络模块 https nodejs org api net html 服务器正在侦听已经预定义的端口 并且客户端正在连接到该端口 据我了解客户端的端口是由节点动态分配的 那是对的吗 节
  • TCP 代理:在后端不可用时保持连接

    在 Docker 设置的上下文中 我想使用类似大使的模式来允许某些容器 例如数据库服务器 正常重新启动 而不必重新启动所有依赖的容器 例如 Web 服务器 并且没有错误消息 因为 数据库服务器不可用 因此 我想知道 是否有一个 TCP 代理
  • 为什么在数据包输入时 skb_buffer 需要跳过 20 个字节才能读取传输缓冲区?

    我正在 Linux 中编写一个网络模块 我发现只有在从 skb 缓冲区跳过 20 个字节后才能提取 tcp 标头 即使 API 是 skb transport header 其背后的原因是什么 有人可以详细解释一下吗 传出数据包不需要同样的
  • 使用 iPhone 作为热点时 TCP 连接无法正常工作

    我正在开发一个 iOS 应用程序 它通过 TCP 套接字连接到在 Android 上运行的服务器应用程序 为了找到第二个设备的 IP 我使用 UDP 请求并接收服务器的 IP 当我将它们连接到 Wi Fi 网络或使用 Android 设备作
  • 如何在NodeJS中测试socket.setKeepAlive

    我尝试在NodeJS中测试setKeepAlive 的功能 我在同一本地网络中的不同计算机上运行 Server js 和 client js 然后 我关闭了客户端计算机上的 WiFi 连接 断开互联网连接 15分钟后 仍然没有消息抛出 这是
  • 在 Perl 中如何接受多个 TCP 连接?

    我对 Linux 的 Perl 脚本有疑问 它的主要目的是成为 3 个应用程序之间的中间人 它应该做什么 它应该能够等待 UDP 文本 不带空格 udp port 当它收到 UDP 文本时 它应该将其转发到连接的 TCP 客户端 问题是我的
  • 数据包丢失和数据包重复

    我试图找出数据包丢失和数据包重复问题之间的区别 有谁知道 数据包重复 是什么意思 和TCP检测到丢失时重传数据包一样吗 No In TCP 数据包 的传递是可靠的 我认为在这种情况下术语数据应该更好 因为它是面向流的协议 数据包丢失和重复是
  • Python套接字模块:Recv()数据响应被切断

    解释 我目前正在尝试使用 python 脚本控制智能电源板 为了实现这一点 我使用了带有套接字模块的 TCP 连接 大约 75 的情况下 我会得到我正在寻找的响应 数据 并且一切都运行良好 然而 大约 25 的情况下 响应会以完全相同的长度
  • 在 Golang Server 中接受持久的 tcp 连接

    我正在尝试使用 Go 并且想创建一个 TCP 服务器 我可以通过 telnet 访问该服务器 发送命令并接收响应 const CONN HOST localhost CONN PORT 3333 CONN TYPE tcp func mai
  • 两个http请求可以合并在一起吗?如果可以的话,nodeJS服务器如何处理呢?

    昨天我做了一些关于 NodeJS 的演讲 有人问我以下问题 我们知道nodeJS是一个单线程服务器 多个请求是 到达服务器并将所有请求推送到事件循环 如果什么 两个请求同时到达服务器 服务器将如何处理 处理这种情况 我猜到了一个想法并回复如
  • 如何在Linux中打开端口[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我已经安装了 Web 应用程序 该应用程序在 RHEL centOS 上的端口 8080 上运行 我只能通过命令行访问该机器 我尝试从我的
  • 发起TCP连接关闭后如何接收数据?

    TCP 允许一侧发出 FIN 并让另一侧在结束其一侧的连接之前响应一些数据 我如何使用 NET 来实现这一点TcpClient 看来我必须使用Close发出FIN 但之后我不能再打电话Client Receive since Client被
  • 访问 AWS 上的 Tensorboard

    我正在尝试访问 AWS 上的 Tensorboard 这是我的设置 张量板 tensorboard host 0 0 0 0 logdir train 在端口 6006 上启动 TensorBoard b 39 您可以导航到http 172
  • 如果其中一台机器死机,TCP 连接如何终止?

    如果两个主机 A 和 B 之间建立了 TCP 连接 假设主机 A 已向主机 B 发送了 5 个八位字节 然后主机 B 崩溃了 由于未知原因 主机 A 将等待确认 但如果没有收到确认 将重新发送八位字节并减小发送者窗口大小 这将重复几次 直到
  • Erlang gen_tcp 连接问题

    简单的问题 这段代码 client gt SomeHostInNet localhost to make it runnable on one machine ok Sock gen tcp connect SomeHostInNet 56
  • 中断 Select 以添加另一个要在 Python 中监视的套接字

    我正在 Windows XP 应用程序中使用 TCP 实现点对点 IPC 我正在使用select and socketPython 2 6 6 中的模块 我有三个 TCP 线程 一个读取线程通常会阻塞select 一个通常等待事件的写入线程

随机推荐

  • cmake之CMakelist.txt的使用

    文章目录 常用命令1 指定 cmake 的最小版本2 打印信息2 1 打印普通信息2 2 打印告警2 3 打印错误 3 项目名称4 设置变量5 查找指定的库文件6 设置包含的目录7 设置链接库搜索目录8 指定编译包含的源文件8 1 明确指定
  • python爬虫 记录一次爬取淘宝的过程

    淘宝可以说是一个检验爬虫技术是否过关的最强关卡了 xff0c 下面来打破它吧 淘宝的所有操作差不多都是在登录的状态下进行的 xff0c 这时候想要对淘宝进行请求获取信息就必须在登录的状态下进行了 方式一 xff1a xff08 seleni
  • 问题tensorflow.python.framework.errors_impl.ResourceExhaustedError:OOM

    tensorflow python framework errors impl ResourceExhaustedError 2 root error s found 0 Resource exhausted OOM when alloca
  • ROS安装超详细保姆级教程

    1 版本选择 ROS与Ubuntu版本是有着对应关系的 xff0c 其中Ubuntu1604 43 ROS Kinetic xff1b Ubuntu1804 43 ROS Melodic xff1b Ubuntu2004 43 ROS No
  • 2021年9月22号,实战烧写树莓派sd卡的系统

    1 下载格式化u盘的软件 xff0c 软件地址 xff0c 阿里云盘地址 xff1a https www aliyundrive com s ux2re9FFxd2 2 将有sd卡的读写盘插入电脑接口 3 打开软件 xff0c 点击格式化即
  • 工作流与BPM的区别

    一 工作流是什么 xff1f 根据国际工作流管理联盟 Workflow Management Coalition xff0c WFMC 的定义 xff0c 工作流就是 一类能够完全或者部分自动执行的经营过程 xff0c 它根据一系列过程规则
  • 被遗忘的软件产品形态

    从2010年以后 xff0c 很多公司开发的软件产品 xff0c 很少有客户端了 xff0c web2 0之后 xff0c 主流的业务系统基本上都是基于Web去构建业务系统 这几年见到的业务应用系统都是基于Web的构建的 而在To C市场
  • C端产品工作流程

    文章目录 发现需求需求分析用户需求定义产品需求定义构建产品方案收集需求确定产品功能 产品需求分类产品目标分解产品版本规划需求评审产品功能设计需求评审确定执行计划测试验收发布上线 发现需求 通过自身的体验发现需求 通过间接的体验发现需求 1
  • STM32cubeMX将STM32F767+LAN8720+LwIP+FreeRTOS的以太网实现

    通过STM32cubeMX将STM32F767 43 LAN8720 43 LwIP 43 FreeRTOS的以太网实现 本文使用了正点原子的阿波罗开发板 xff0c 接下来我将粗略的对STM32F767通过STM32cubeMX进行以太网
  • 数据产品经理有哪些

    文章目录 数据分析产品经理数据挖掘产品经理策略产品经理数据工程类产品 首先希望大家能重新认识经理这份工作 xff1a 大数据产品经理并不一定要数学能力强或者编程能力强 xff0c 只要你有用数据思考的方式 xff0c 有相信数据的信念 xf
  • 产品经理必备的20个常用工具

    原型设计工具 xff1a Axure 墨刀 思维导图工具 xff1a Xmind MindManager 流程图绘制工具 xff1a Viso ProcessOn 数据处理与分析工具 xff1a Excel Tableau 问卷调研工具 x
  • Hibernate根据实体类自动生成表的方法

    文章目录 第一种方法第二种方法参考 第一种方法 这种方法需要配置 hibernate cfg xml 的属性 hibernate hbm2ddl auto xff0c 该属性值的具体说明如下 xff1a 值说明update实体对应的表如果不
  • 微信账户如何解除对第三方应用的授权

    参考文章 xff1a https baijiahao baidu com s id 61 1754354599985802723 amp wfr 61 spider amp for 61 pc amp searchword 61 E5 B0
  • 进程间通信

    现在的嵌入式系统往往有并发的特征 xff0c 就像多任务操作系统的多进程一样 xff0c 其内核会提供几种机制处理任务间通信 xff0c 本文对四种常见通信模式进行了分析 xff0c 并对其各自的优劣作较细致的比较 目前 xff0c 越来越
  • HTTP请求返回状态码的不同含义

    用户通过 HTTP 访问一台正在运行Internet信息服务的服务器上的内容时 xff0c 会返回一个表示该请求的状态的数字代码 状态代码可以指明具体请求是否已成功 xff0c 还可以揭示请求失败的确切原因 1 信息提示 这些状态代码表示临
  • 异常检测及其分布集成

    异常检测算法种类繁多 xff0c 包括聚类 xff0c 树 xff0c 统计分布 xff0c 机器学习 xff0c 深度学习等多种形式 xff0c 下面对一些常见问题进行了自己的总结 xff1a 1 如何选型 xff1f 主要看算法原理和数
  • 关于FreeRTOS 任务运行中卡死在临界区vPortExitCritical()

    FreeRTOS创建任务正常运行 xff0c 偶尔出现任务卡死状态 xff0c 通过在线调试 xff0c 程序卡在vPortExitCritical 函数中 xff0c 在IAR Call Stack中观察到各任务都可能回调该接口 span
  • Ardupilot添加自定义日志(AP_LOG)

    1 在libraries AP Logger LogStructure h中添加自定义的结构体 span class token keyword struct span span class token class name PACKED
  • Ardupilot 编译Bootloader

    1 清理之前的编译中间文件 xff0c 一定要清理一下 xff0c 能避免很多奇怪的问题 span class token punctuation span span class token operator span waf distcl
  • 基于STM32CUBE的LWIP+FREERTOS+Socket构成的TCP服务器

    本实验基于STM32F767制作 一 实验目的 本实验主要目的是通过Socket网络编程方法完成通过以太网控制两个LED的亮灭的 xff0c 同理可用到继电器上控制其它高电压设备 二 实验步骤 1 首先先生成一个带有LWIP和FreeRTO