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上从头…...
用STM32CubeMX和HAL库快速上手WS2812B:告别手动计算延时,一键生成驱动框架
基于STM32CubeMX的WS2812B智能灯光控制:从零构建现代化驱动方案在智能硬件和物联网设备快速发展的今天,WS2812B可编程LED灯带因其丰富的色彩表现和简单的单线控制方式,成为创客和工程师们最喜爱的显示组件之一。然而,传统的寄存器…...
GitLab External Wiki代理权限绕过漏洞深度解析
1. 这个漏洞不是“修个补丁”就能完事的——它暴露的是 GitLab 权限模型里一个被长期忽视的逻辑断层GitLab 安全漏洞 CVE-2025-2614,光看编号容易误以为是又一个常规的越权或 XSS 类型漏洞。但我在实际复现和审计过程中发现,它根本不是配置疏漏或代码拼写…...
美团外卖mtgsig与waimai_sign双层签名逆向解析
1. 这不是“爬虫教程”,而是一份反向工程现场笔记你搜到这篇内容,大概率正卡在某个调试窗口前:抓包看到mtgsig和waimai_sign两个参数像两堵墙,无论怎么改请求头、换UA、清缓存,返回永远是{"code":403,"…...
机器学习与SHAP在教育公平研究中的应用:精准定位学业困境根源
1. 项目概述:当机器学习遇见教育公平,我们如何精准定位学业困境的根源?在拉丁美洲的教育研究领域,一个长期困扰政策制定者和研究者的核心问题是:究竟是什么因素,在复杂的社会经济背景下,系统性地…...
3个步骤彻底解决WSA安装失败问题:从错误代码到完美运行
3个步骤彻底解决WSA安装失败问题:从错误代码到完美运行 【免费下载链接】WSABuilds Run Windows Subsystem For Android on your Windows 10 and Windows 11 PC using prebuilt binaries with Google Play Store (MindTheGapps) and/or Magisk or KernelSU (root so…...
网安学习第24天 PHP安全——PHP反序列化
一、序列化与反序列化 1、序列化serialize() 序列化是什么?序列化就是把程序中的对象、数组、结构体等复杂数据,转换成可以存储或传输的格式。 简单说: 把“内存里的对象”变成“字符串/字节流”。 例如 PHP 中有一个对象: $u…...
如何快速掌握ncmdumpGUI:Windows平台网易云音乐NCM文件转换完整教程
如何快速掌握ncmdumpGUI:Windows平台网易云音乐NCM文件转换完整教程 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾经下载了网易云音乐的…...
面试官问LinkedBlockingQueue和ArrayBlockingQueue区别?别只答有界无界了,这3个实战坑才是重点
面试官追问LinkedBlockingQueue与ArrayBlockingQueue?别只答基础区别,这3个实战陷阱才是关键 当面试官抛出"LinkedBlockingQueue和ArrayBlockingQueue有什么区别"这个问题时,80%的候选人会条件反射般回答"一个有界一个无界&qu…...
Armv9-A架构解析:SVE/SME与安全增强技术
1. Armv9-A架构演进与核心特性全景Armv9-A架构代表了Arm公司面向未来十年计算需求的设计哲学,其核心在于三个维度的突破:性能、安全与专用计算。作为长期从事Arm架构开发的工程师,我见证了从Armv7到Armv9的技术跃迁。与固定宽度向量指令的NEO…...
ATTiny85通用开发板PCB-4设计:集成电源、音频与诊断的一站式DIY平台
1. PCB-4:一个为四款经典ATTiny85项目而生的通用开发板如果你玩过一阵子电子DIY,特别是对小巧、低功耗的微控制器项目感兴趣,那你很可能听说过或者自己动手做过基于ATTiny85芯片的小玩意儿。这颗只有8个引脚的“小巨人”,以其极低…...
