STM32+W5500+以太网应用开发+003_TCP服务器添加OLED(u8g2)显示状态

ops/2025/1/17 5:51:42/

STM32+W5500+以太网应用开发+003_TCP服务器添加OLEDu8g2)显示状态

  • 实验效果3-TCP服务器+OLED
  • 1 拷贝显示驱动代码
    • 1.1 拷贝源代码
    • 1.2 将源代码添加到工程
    • 1.3 修改代码优化等级
    • 1.4 添加头文件路径
    • 1.5 修改STM32CubeMX工程
  • 2 修改源代码
    • 2.1 添加头文件
    • 2.2 main函数修改
  • 3 实验测试效果

OLED_2">实验效果3-TCP服务器+OLED

客户端已连接等待数据

1 拷贝显示驱动代码

1.1 拷贝源代码

拷贝HARDWARE文件夹,里面包括OLED.c/.h和移植好的U8g2csrc文件夹
<a class=OLED硬件驱动" />
<a class=u8g2代码" />

1.2 将源代码添加到工程

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

1.3 修改代码优化等级

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

1.4 添加头文件路径

…\HARDWARE\oled
…\HARDWARE\U8g2csrc

1.5 修改STM32CubeMX工程

只需要添加3个控制引脚,SPI和W5500是共用的
添加<a class=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 实验测试效果

等待插入网线
等待客户端连接
客户端已连接
收到来自客户端的数据


http://www.ppmy.cn/ops/150725.html

相关文章

【C#深度学习之路】如何使用C#实现Yolo8/11 Segment 全尺寸模型的训练和推理

【C#深度学习之路】如何使用C#实现Yolo8/11 Segment 全尺寸模型的训练和推理 项目背景项目实现推理过程训练过程 项目展望写在最后项目下载链接 本文为原创文章&#xff0c;若需要转载&#xff0c;请注明出处。 原文地址&#xff1a;https://blog.csdn.net/qq_30270773/article…

【漏洞复现】孚盟云 MailAjax.ashx SQL注入漏洞复现

免责声明 请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。工具来自网络,安全性自测,如有侵权请联系删除。本次测试仅供学习使用,如若非法他用,与平台和本文作…

后端代码方式导出excle模板

目录 1.接口层2.业务层3.前端请求4.或者直接用tomcat方式导出 1.接口层 PostMapping("/exprotExcelTemplate")public void exprotExcelTemplate(HttpServletResponse response) throws Exception {exportExcelService.exprotExcelTemplate(response);}2.业务层 Overr…

STM32 FreeRTOS 信号量

信号量的简介 reeRTOS中的信号量是一种用于任务间同步和资源管理的机制。信号量可以是二进制的&#xff08;只能取0或1&#xff09;也可以是计数型的&#xff08;可以是任意正整数&#xff09;。信号量的基本操作包括“获取”和“释放”。 比如动车上的卫生间&#xff0c;一个…

LSTM火灾温度预测(Pytorch版本)

本文为为&#x1f517;365天深度学习训练营内部文章 原作者&#xff1a;K同学啊 一 导入数据 import torch.nn.functional as F import numpy as np import pandas as pd import torch from torch import nn import matplotlib.pyplot as plt from sklearn.preprocessing impor…

【PHP】双方接口通信校验服务

请求方 使用 ApiAuthService::buildUrl($domain, [terminal > 1, ts > time()]); //http://域名/adminapi/login/platformLogin?signF7FE8A150DEC18BE8A71C5059742C81A&terminal1&ts1736904841接收方 $getParams $this->request->get();$validate ApiA…

项目练习:若依管理系统字典功能-Vue前端部分

文章目录 一、情景说明二、若依Vue相关代码及配置1、utils代码2、components组件3、api接口代码4、Vuex配置5、main.js配置 三、使用方法1、html部分2、js部分 一、情景说明 我们在做web系统的时候&#xff0c;肯定会遇到一些常量选择场景。 比如&#xff0c;性别&#xff1a;…

Unity3D手机游戏发热发烫优化指南与技巧详解

前言 在移动游戏开发领域&#xff0c;游戏发热和发烫问题一直是影响用户体验的重要因素。对于Unity3D开发者来说&#xff0c;优化游戏以减少设备发热和提升性能至关重要。本文将详细介绍Unity3D手机游戏发热发烫的优化指南与技巧&#xff0c;并提供相应的技术详解和代码实现。…