STM32+W5500+以太网应用开发+003_TCP服务器添加OLED(u8g2)显示状态
STM32+W5500+以太网应用开发+003_TCP服务器添加OLED(u8g2)显示状态
- 实验效果3-TCP服务器+OLED
- 1 拷贝显示驱动代码
- 1.1 拷贝源代码
- 1.2 将源代码添加到工程
- 1.3 修改代码优化等级
- 1.4 添加头文件路径
- 1.5 修改STM32CubeMX工程
- 2 修改源代码
- 2.1 添加头文件
- 2.2 main函数修改
- 3 实验测试效果
实验效果3-TCP服务器+OLED
1 拷贝显示驱动代码
1.1 拷贝源代码
拷贝HARDWARE文件夹,里面包括OLED.c/.h和移植好的U8g2csrc文件夹
1.2 将源代码添加到工程
将代码分别添加到工程的User/OLED组和User/U8G2组(所有.c文件都添加)
1.3 修改代码优化等级
这里添加的好多文件用不到,需要把代码优化等级调整到Level 1
1.4 添加头文件路径
..\HARDWARE\oled
..\HARDWARE\U8g2csrc
1.5 修改STM32CubeMX工程
只需要添加3个控制引脚,SPI和W5500是共用的
2 修改源代码
源代码全部在main.c里面修改
2.1 添加头文件
/* USER CODE BEGIN Includes */
#include <string.h>
#include <stdio.h>
#include "w5500_spi.h"
#include "wizchip_conf.h"
#include "socket.h"
#include "OLED.h"
#include "u8g2_app.h"
/* USER CODE END Includes */
2.2 main函数修改
局部变量
/* USER CODE BEGIN 1 */u8g2_t u8g2;char draw_buf[20];
/* USER CODE END 1 */
显示初始化
/* USER CODE BEGIN 2 */OLED_RST_Set();//OLED初始化HAL_Delay(100);OLED_RST_Clr();HAL_Delay(200);OLED_RST_Set();OLED_Init();u8g2Init(&u8g2);//U8G2初始化u8g2_FirstPage(&u8g2);printf("A simple TCP Server Application using W5500!\r\n");W5500Init(); //W5500初始化ctlnetwork(CN_SET_NETINFO, (void*)&gWIZNETINFO); //配置网络参数wiz_PhyConf phyconf;phyconf.by = PHY_CONFBY_SW;phyconf.duplex = PHY_DUPLEX_FULL;phyconf.speed = PHY_SPEED_10;phyconf.mode = PHY_MODE_AUTONEGO;ctlwizchip(CW_SET_PHYCONF, (void*)&phyconf); //配置PHY参数draw_waitcable(&u8g2);//OLED提示:等待网线连接PHYStatusCheck(); //检查网络连接状态PrintPHYConf(); //打印PHY配置信息printf("Simple TCP Server Application\r\n");draw_waitclient(&u8g2);//OLED提示:等待客户端连接/* USER CODE END 2 */
主循环
添加的代码部分有“OLED提示:”注释
/* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */printf("\r\nInitializing server socket\r\n");//Parameters in order socket_id, protocol TCP or UDP, Port number, Flags=0//Return value is socket ID on successif(socket(1,Sn_MR_TCP,LISTEN_PORT,0)!=1)//创建一个socket:Socket号,TCP/UDP类型,端口号{//errorprintf("Cannot create Socket!\r\n");while(1);//halt here}//successprintf("Socket Created Successfully ! \r\n");uint8_t socket_io_mode=SOCK_IO_BLOCK;ctlsocket(1, CS_SET_IOMODE , &socket_io_mode);//set blocking IO modeprintf("IP Address is %d.%d.%d.%d\r\n",gWIZNETINFO.ip[0],gWIZNETINFO.ip[1],gWIZNETINFO.ip[2],gWIZNETINFO.ip[3]);printf("Start listening on port %d ! \r\n",LISTEN_PORT);printf("Waiting for a client connection. \r\n");memset(draw_buf,0,20);snprintf(draw_buf,20,"%d.%d.%d.%d:%d",gWIZNETINFO.ip[0],gWIZNETINFO.ip[1],gWIZNETINFO.ip[2],gWIZNETINFO.ip[3],LISTEN_PORT);draw_server(&u8g2,draw_buf);//OLED提示:等待客户端连接//Make it a passive socket (i.e. listen for connection)if(listen(1)!=SOCK_OK)//监听端口{//our socket id is 1 (w5500 have 8 sockets from 0-7)//errorprintf("Cannot listen on port %d",LISTEN_PORT);while(1);}uint8_t sr=0x00;//socket status registerdo{sr=getSn_SR(1);//获取Sn_SR寄存器,参数0~7 }while (sr!=SOCK_ESTABLISHED && sr!=SOCK_CLOSED);if(sr==SOCK_CLOSED){printf("Some error occurred on server socket. Please restart.\r\n");while(1);}if(sr==SOCK_ESTABLISHED)//成功连接{//we come here only when a client has connected.//Now we can read data from the socketprintf("A client connected!\r\n");printf("Waiting for Client Data ...!\r\n");draw_conn_client(&u8g2);//OLED提示:客户端连接while(1){int len=recv(1, receive_buff, RECEIVE_BUFF_SIZE);//从连接设备读取数据到receive_buffif(len==SOCKERR_SOCKSTATUS){//client has disconnectedprintf("Client has disconnected\r\n");printf("*** SESSION OVER ***\r\n\r\n");break;}receive_buff[len]='\0';printf("Received %d bytes from client\r\n",len);printf("Data Received: %s", receive_buff);// memset(draw_buf,0,20);
// snprintf(draw_buf,20,"%d.%d.%d.%d:%d",gWIZNETINFO.ip[0],gWIZNETINFO.ip[1],gWIZNETINFO.ip[2],gWIZNETINFO.ip[3],LISTEN_PORT);draw_waitdata(&u8g2,(char *)receive_buff);//OLED提示:显示接收数据if(strcmp((char*)receive_buff,"Who are u")==0){//判断接收到"Who are u"memcpy(receive_buff,"I am role_2099!",15);//修改应答内容len = 15;}//Echo the data back encloused in a [] pairsend(1,(uint8_t*)"[",1);//starting sq bracket 向客户端发送[send(1,receive_buff,len);// the data 向客户端发送接收到的内容或者特定的回答send(1,(uint8_t*)"]",1);//closing sq bracket 向客户端发送]printf("\r\nECHO sent back to client\r\n");//Look for quit message and quit if receivedif(strcmp((char*)receive_buff,"QUIT")==0){//收到"QUIT",端口客户端连接printf("Received QUIT command from client\r\n");printf("Disconnecting ... \r\n");printf("*** SESSION OVER ***\r\n\r\n");memset(draw_buf,0,20);snprintf(draw_buf,20,"%d.%d.%d.%d:%d",gWIZNETINFO.ip[0],gWIZNETINFO.ip[1],gWIZNETINFO.ip[2],gWIZNETINFO.ip[3],LISTEN_PORT);draw_server(&u8g2,draw_buf);//OLED提示:等待客户端连接disconnect(1);//disconnect from the clinet 断开客户端连接break;//come out of while loop 退出,回到131行,重新等待客户端连接}}//While loop (as long as client is connected)}//if block, client connect success}/* USER CODE END 3 */
3 实验测试效果
相关文章:

STM32+W5500+以太网应用开发+003_TCP服务器添加OLED(u8g2)显示状态
STM32W5500以太网应用开发003_TCP服务器添加OLED(u8g2)显示状态 实验效果3-TCP服务器OLED1 拷贝显示驱动代码1.1 拷贝源代码1.2 将源代码添加到工程1.3 修改代码优化等级1.4 添加头文件路径1.5 修改STM32CubeMX工程 2 修改源代码2.1 添加头文件2.2 main函…...

【机器学习实战中阶】使用SARIMAX,ARIMA预测比特币价格,时间序列预测
数据集说明 比特币价格预测(轻量级CSV)关于数据集 致谢 这些数据来自CoinMarketCap,并且可以免费使用该数据。 https://coinmarketcap.com/ 数据集:链接: 价格预测器 源代码与数据集 算法说明 SARIMAX(Seasonal AutoRegressive …...
各语言镜像配置汇总
镜像配置汇总 Nodejs [ npm ]Python [ pip ] Nodejs [ npm ] // # 记录日期:2025-01-20// 查询当前使用的镜像 npm get registry// 设置淘宝镜像 npm config set registry https://registry.npmmirror.com/// 恢复为官方镜像 npm config set registry https://regi…...

细说STM32F407单片机电源低功耗StopMode模式及应用示例
目录 一、停止模式基础知识 1、进入停止模式 2、停止模式的状态 3、退出停止模式 4、SysTick定时器的影响 二、停止模式应用示例 1、示例功能和CubeMX项目配置 (1)时钟 (2)RTC (3)ADC1 …...
PHP语言的循环实现
PHP语言的循环实现详解 在当今的编程世界中,循环是一种不可或缺的基本构造,它使得我们能够重复执行某些操作,极大地提高了代码的复用性和可读性。在PHP语言中,循环的种类以及使用方式繁多,本文将全面探讨PHP中的循环实…...
求两个矩阵的乘积
求两个矩阵的乘积 分数 15 全屏浏览 切换布局 作者 C课程组-hwr-zy 单位 浙江大学 输入三个正整数m,l,n(0<m,n,l<10),再输入两个的矩阵a(mxl)和b(lxn)。要求把a和…...

警惕IDEA 2024版重大Bug问题:LomBok失效、Gradle冲突、Spring Boot启动错误
一直以来我认为工具类的软件是越新越好,因为工具代表着一定的先进性;但是IDEA 2024好好的给我上了一课,比如lombok 不起作用、比如Spring Boot 3.4.x 启动报错、再比如MyBatis log plus冲突、再比如Gradle插件冲突. 一、Lombok 失效问题 请不…...
Go语言的正则表达式
Go语言的正则表达式:深度解析与应用实例 引言 正则表达式(Regular Expression,简称 regex)是一种用于匹配字符串的强大工具,广泛应用于文本处理、数据验证、解析和提取等场景。Go语言作为一种现代编程语言࿰…...
通过ssh连接debian
使用方法 ssh usernameipaddress [inputpasswd]root用户默认无法由ssh连接, 可以通过修改配置 sudo vim /etc/ssh/sshd_config去掉PermitRootLogin前的‘#’,并修改为 PermitRootLogin yes 重启sshd服务 sudo systemctl restart sshd参考 https://linuxconfig.or…...
计算机创造的奇迹——C语言
一.简介 C语言是一种较早的程序设计语言,诞生于1972年的贝尔实验室。1972 年,Dennis Ritchie 设计了C语言,它继承了B语言的许多思想,并加入了数据类型的概念及其他特性。 尽管C 语言是与 UNIX 操作系统一起被开发出来的ÿ…...

磁盘阵列服务器和普通服务器的区别
磁盘阵列服务器(RAID Server)和普通服务器在多个方面存在显著区别。以下是它们的主要区别: 1. 存储架构 磁盘阵列服务器 RAID 技术:使用 RAID(冗余独立磁盘阵列)技术,将多个硬盘组合成一个逻…...
搭建一个人脸识别pipeline
文章目录 概要入门所需设置你的开发环境人脸识别的工作原理数据加载和预处理建立你的人脸识别模型评估你的模型总结概要 人脸识别已发展成为一项关键技术,现已嵌入从安全系统到社交媒体平台等各个领域。在本文中,我们将逐步指导您在短短 30 分钟内使用 Python 和机器学习创建…...

Docker 之mysql从头开始——Docker下mysql安装、启动、配置、进入容器执行(查询)sql
一、Docker 之mysql安装配置 步骤一:拉取镜像 1. 查看是否包含已安装的mysql。 docker images | grep mysql 2. 如上图所示,我们有mysql镜像,所以不必对mysql镜像进行拉取,如若没有上图中的惊喜,使用如下命令进行拉取…...
LeetCodeHOT100:60. n个骰子的点数、4. 寻找两个正序数组的中位数
LeetCodeHOT100: 剑指 Offer 60. n个骰子的点数4. 寻找两个正序数组的中位数96. 不同的二叉搜索树 剑指 Offer 60. n个骰子的点数 题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率…...

apisix的authz-casbin
目录 1、apisix的auth-casbin官方介绍 2、casbin介绍和使用 2.1基本知识: 2.2使用例子 3、配置插件 4、postman调用 5、auth-casbin的坑 1、apisix的auth-casbin官方介绍 authz-casbin | Apache APISIX -- Cloud-Native API Gateway 2、casbin介绍和使用 c…...
数学基础 --线性代数之理解矩阵乘法
理解矩阵乘法的解析 矩阵乘法(Matrix Multiplication)是线性代数中的核心操作之一。在数学、几何和工程实际中,它不仅是一种代数运算规则,还承载着丰富的几何和映射意义。本文将从多个角度深入解析矩阵乘法,帮助读者理…...

TCP Window Full是怎么来的
wireshark查看包时,会看到TCP Window Full,总结下它的特点: 1. Sender会显示 TCP Window Full 2. “Sender已发出,但,Receiver尚未ack的字节”,即Sender的 bytes in flights 3. Sender的 bytes in fligh…...

【22】Word:小李-高新技术企业政策❗
目录 题目 NO1.2 NO3 NO4 NO5.6 NO7.8 NO9.10 若文章中存在删除空白行等要求,可以到最后来完成。注意最后一定要检查此部分!注意:大多是和事例一样即可,不用一摸一样,但也不要差太多。 题目 NO1.2 F12Fn&a…...

大数据,Hadoop,HDFS的简单介绍
大数据 海量数据,具有高增长率、数据类型多样化、一定时间内无法使用常规软件工具进行捕捉、管理和处理的数据集 合 大数据的特征: 4V Volume : 巨大的数据量 Variety : 数据类型多样化 结构化的数据 : 即具有固定格式和有限长度的数据 半结构化的数据 : 是…...

Python预训练视觉和大语言模型——精彩试读
基础模型永久改变了机器学习。从BERT到ChatGPT,从CLIP到Stable Diffusion,当数十亿个参数、大数据集与成百上千个GPU相结合时,结果刷新了纪录。《Python预训练视觉和大语言模型》呈现的真知灼见和示例代码将帮你在AWS和Amazon SageMaker上从头…...
Vue作用域插槽
下面,我们来系统的梳理关于 **Vue 作用域插槽 ** 的基本知识点: 一、作用域插槽核心概念 1.1 什么是作用域插槽? 作用域插槽是 Vue 中一种反向数据流机制,允许子组件将数据传递给父组件中的插槽内容。这种模式解决了传统插槽中父组件无法访问子组件内部状态的限制。 1.2…...

设备驱动与文件系统:06 目录与文件
磁盘使用的最后一层抽象:文件系统 今天我们讲第31讲,这一讲将完成磁盘对磁盘使用的最后一层抽象。对此板使用最后一层抽象,抽象出来的是什么呢? 实际上我们使用过磁盘,大家应该有这样的认识,最后不管这个磁…...

【C++系列】模板类型特例化
1. C模板类型特例化介绍 定义:模板类型特例化(Template Specialization)是C中为模板的特定类型提供定制实现的机制,允许开发者对通用模板无法处理的特殊类型进行优化或特殊处理。 产生标准: C98/03…...
【PhysUnits】17.2 配套变量结构体 Var(variable.rs)
一、源码 这段代码定义了一个泛型结构体 Var,用于封装数值类型并提供各种运算操作。 /** 变量结构体 Var* 该结构体泛型参数 T 需满足 Numeric 约束*/use core::ops::{Neg, Add, Sub, Mul, Div, AddAssign, SubAssign, MulAssign}; use crate::constant::Integer;…...

Grafana-ECharts应用讲解(玫瑰图示例)
工具: MySQL 数据库 MySQL Workbench 数据库管理工具(方便编辑数据) Grafana v11.5.2 Business Charts 6.6(原 Echarts插件) 安装 安装 MySQL社区版安装 MySQL Workbench安装 Grafana在 Grafana 插件中搜索 Business Charts 进行安装以上安装步骤网上教程很多,自行搜…...

零基础在实践中学习网络安全-皮卡丘靶场(第八期-Unsafe Filedownload模块)
这期内容更是简单和方便,毕竟谁还没在浏览器上下载过东西,不过对于url的构造方面,可能有一点问题,大家要多练手 介绍 不安全的文件下载概述 文件下载功能在很多web系统上都会出现,一般我们当点击下载链接,…...

使用有限计算实现视频生成模型的高效训练
大家读完觉得有帮助记得关注和点赞!!! 抽象 视频生成的最新进展需要越来越高效的训练配方,以减轻不断上升的计算成本。在本报告中,我们介绍了 ContentV,这是一种 8B 参数文本到视频模型,在 256 …...

Server2003 B-1 Windows操作系统渗透
任务环境说明: 服务器场景:Server2003(开放链接) 服务器场景操作系统:Windows7 1.通过本地PC中渗透测试平台Kali对服务器场景Windows进行系统服务及版本扫描渗透测试,并将该操作显示结果中Telnet服务对应的…...
ant-design4.xx实现数字输入框; 某些输入法数字需要连续输入两次才显示
目录 一、问题 二、解决方法 三、总结 一、问题 1.代码里有一个基于ant封装的公共组件数字输入框,测试突然说 无效了,输入其他字符也会显示;改了只有又发现某些 输入法 需要连续输入两次 才能显示出来。 二、解决方法 1.就离谱࿰…...
九、【ESP32开发全栈指南: UDP通信服务端】
一、TCP与UDP核心差异 特性TCPUDP连接方式面向连接 (需三次握手)无连接可靠性可靠传输 (重传/排序/校验)尽力交付 (不保证可靠性)实时性延迟较高低延迟,实时性强传输效率协议开销大头部开销小 (仅8字节)连接类型点对点支持广播/多播资源占用高 (需维护连接状态)极低…...