当前位置: 首页 > news >正文

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文件夹
OLED硬件驱动
u8g2代码

1.2 将源代码添加到工程

将代码分别添加到工程的User/OLED组和User/U8G2组(所有.c文件都添加)
将代码添加到工程

1.3 修改代码优化等级

这里添加的好多文件用不到,需要把代码优化等级调整到Level 1
修改代码优化等级

1.4 添加头文件路径

..\HARDWARE\oled
..\HARDWARE\U8g2csrc

1.5 修改STM32CubeMX工程

只需要添加3个控制引脚,SPI和W5500是共用的
添加OLED控制引脚

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&#xff08;u8g2&#xff09;显示状态 实验效果3-TCP服务器OLED1 拷贝显示驱动代码1.1 拷贝源代码1.2 将源代码添加到工程1.3 修改代码优化等级1.4 添加头文件路径1.5 修改STM32CubeMX工程 2 修改源代码2.1 添加头文件2.2 main函…...

【机器学习实战中阶】使用SARIMAX,ARIMA预测比特币价格,时间序列预测

数据集说明 比特币价格预测&#xff08;轻量级CSV&#xff09;关于数据集 致谢 这些数据来自CoinMarketCap&#xff0c;并且可以免费使用该数据。 https://coinmarketcap.com/ 数据集:链接: 价格预测器 源代码与数据集 算法说明 SARIMAX&#xff08;Seasonal AutoRegressive …...

各语言镜像配置汇总

镜像配置汇总 Nodejs [ npm ]Python [ pip ] Nodejs [ npm ] // # 记录日期&#xff1a;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项目配置 &#xff08;1&#xff09;时钟 &#xff08;2&#xff09;RTC &#xff08;3&#xff09;ADC1 &#xf…...

PHP语言的循环实现

PHP语言的循环实现详解 在当今的编程世界中&#xff0c;循环是一种不可或缺的基本构造&#xff0c;它使得我们能够重复执行某些操作&#xff0c;极大地提高了代码的复用性和可读性。在PHP语言中&#xff0c;循环的种类以及使用方式繁多&#xff0c;本文将全面探讨PHP中的循环实…...

求两个矩阵的乘积

求两个矩阵的乘积 分数 15 全屏浏览 切换布局 作者 C课程组-hwr-zy 单位 浙江大学 输入三个正整数m&#xff0c;l&#xff0c;n(0<m&#xff0c;n&#xff0c;l<10)&#xff0c;再输入两个的矩阵a&#xff08;mxl&#xff09;和b&#xff08;lxn&#xff09;。要求把a和…...

警惕IDEA 2024版重大Bug问题:LomBok失效、Gradle冲突、Spring Boot启动错误

一直以来我认为工具类的软件是越新越好&#xff0c;因为工具代表着一定的先进性&#xff1b;但是IDEA 2024好好的给我上了一课&#xff0c;比如lombok 不起作用、比如Spring Boot 3.4.x 启动报错、再比如MyBatis log plus冲突、再比如Gradle插件冲突. 一、Lombok 失效问题 请不…...

Go语言的正则表达式

Go语言的正则表达式&#xff1a;深度解析与应用实例 引言 正则表达式&#xff08;Regular Expression&#xff0c;简称 regex&#xff09;是一种用于匹配字符串的强大工具&#xff0c;广泛应用于文本处理、数据验证、解析和提取等场景。Go语言作为一种现代编程语言&#xff0…...

通过ssh连接debian

使用方法 ssh usernameipaddress [inputpasswd]root用户默认无法由ssh连接&#xff0c; 可以通过修改配置 sudo vim /etc/ssh/sshd_config去掉PermitRootLogin前的‘#’,并修改为 PermitRootLogin yes 重启sshd服务 sudo systemctl restart sshd参考 https://linuxconfig.or…...

计算机创造的奇迹——C语言

一.简介 C语言是一种较早的程序设计语言&#xff0c;诞生于1972年的贝尔实验室。1972 年&#xff0c;Dennis Ritchie 设计了C语言&#xff0c;它继承了B语言的许多思想&#xff0c;并加入了数据类型的概念及其他特性。 尽管C 语言是与 UNIX 操作系统一起被开发出来的&#xff…...

磁盘阵列服务器和普通服务器的区别

磁盘阵列服务器&#xff08;RAID Server&#xff09;和普通服务器在多个方面存在显著区别。以下是它们的主要区别&#xff1a; 1. 存储架构 磁盘阵列服务器 RAID 技术&#xff1a;使用 RAID&#xff08;冗余独立磁盘阵列&#xff09;技术&#xff0c;将多个硬盘组合成一个逻…...

搭建一个人脸识别pipeline

文章目录 概要入门所需设置你的开发环境人脸识别的工作原理数据加载和预处理建立你的人脸识别模型评估你的模型总结概要 人脸识别已发展成为一项关键技术,现已嵌入从安全系统到社交媒体平台等各个领域。在本文中,我们将逐步指导您在短短 30 分钟内使用 Python 和机器学习创建…...

Docker 之mysql从头开始——Docker下mysql安装、启动、配置、进入容器执行(查询)sql

一、Docker 之mysql安装配置 步骤一&#xff1a;拉取镜像 1. 查看是否包含已安装的mysql。 docker images | grep mysql 2. 如上图所示&#xff0c;我们有mysql镜像&#xff0c;所以不必对mysql镜像进行拉取&#xff0c;如若没有上图中的惊喜&#xff0c;使用如下命令进行拉取…...

LeetCodeHOT100:60. n个骰子的点数、4. 寻找两个正序数组的中位数

LeetCodeHOT100&#xff1a; 剑指 Offer 60. n个骰子的点数4. 寻找两个正序数组的中位数96. 不同的二叉搜索树 剑指 Offer 60. n个骰子的点数 题目&#xff1a;把n个骰子扔在地上&#xff0c;所有骰子朝上一面的点数之和为s。输入n&#xff0c;打印出s的所有可能的值出现的概率…...

apisix的authz-casbin

目录 1、apisix的auth-casbin官方介绍 2、casbin介绍和使用 2.1基本知识&#xff1a; 2.2使用例子 3、配置插件 4、postman调用 5、auth-casbin的坑 1、apisix的auth-casbin官方介绍 authz-casbin | Apache APISIX -- Cloud-Native API Gateway 2、casbin介绍和使用 c…...

数学基础 --线性代数之理解矩阵乘法

理解矩阵乘法的解析 矩阵乘法&#xff08;Matrix Multiplication&#xff09;是线性代数中的核心操作之一。在数学、几何和工程实际中&#xff0c;它不仅是一种代数运算规则&#xff0c;还承载着丰富的几何和映射意义。本文将从多个角度深入解析矩阵乘法&#xff0c;帮助读者理…...

TCP Window Full是怎么来的

wireshark查看包时&#xff0c;会看到TCP Window Full&#xff0c;总结下它的特点&#xff1a; 1. Sender会显示 TCP Window Full 2. “Sender已发出&#xff0c;但&#xff0c;Receiver尚未ack的字节”&#xff0c;即Sender的 bytes in flights 3. Sender的 bytes in fligh…...

【22】Word:小李-高新技术企业政策❗

目录 题目​ NO1.2 NO3 NO4 NO5.6 NO7.8 NO9.10 若文章中存在删除空白行等要求&#xff0c;可以到最后来完成。注意最后一定要检查此部分&#xff01;注意&#xff1a;大多是和事例一样即可&#xff0c;不用一摸一样&#xff0c;但也不要差太多。 题目 NO1.2 F12Fn&a…...

大数据,Hadoop,HDFS的简单介绍

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

Python预训练视觉和大语言模型——精彩试读

基础模型永久改变了机器学习。从BERT到ChatGPT&#xff0c;从CLIP到Stable Diffusion&#xff0c;当数十亿个参数、大数据集与成百上千个GPU相结合时&#xff0c;结果刷新了纪录。《Python预训练视觉和大语言模型》呈现的真知灼见和示例代码将帮你在AWS和Amazon SageMaker上从头…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域&#xff1a;无处不在的数字助手 2、 计算机的进化史&#xff1a;从算盘到量子计算 3、计算机的分类&#xff1a;不止 “台式机和笔记本” 4、计算机的组件&#xff1a;硬件与软件的协同 4.1 硬件&#xff1a;五大核心部件 4.2 软件&#…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务&#xff0c;但是又不想花钱&#xff0c;所以就想着自己搭建一个&#xff0c;刚好我们用的一个开源框架已经集成了MinIO&#xff0c;所以就选了这个 我这边对文件服务性能要求不是太高&#xff0c;单机版就可以 安装非常简单&#xff0c;几个命令就…...