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

news2025/1/22 21:56:34

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 success
	  if(socket(1,Sn_MR_TCP,LISTEN_PORT,0)!=1)//创建一个socket:Socket号,TCP/UDP类型,端口号
	  {
		  //error
		  printf("Cannot create Socket!\r\n");
		  while(1);//halt here
	  }

	  //success
	  printf("Socket Created Successfully ! \r\n");

	  uint8_t socket_io_mode=SOCK_IO_BLOCK;

	  ctlsocket(1, CS_SET_IOMODE , &socket_io_mode);//set blocking IO mode

    printf("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)
		  //error
		  printf("Cannot listen on port %d",LISTEN_PORT);
		  while(1);
	  }

	  uint8_t sr=0x00;//socket status register

	  do
	  {
		  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 socket
		  printf("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_buff

			  if(len==SOCKERR_SOCKSTATUS)
			  {
				  //client has disconnected
				  printf("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 [] pair
			  send(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 received
			  if(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.coloradmin.cn/o/2280572.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Oracle审计

审计是监控选定的用户数据库操作的过程 审计的目的&#xff1a; 调查可疑的数据库活动&#xff1a; 审计可以帮助检测和跟踪潜在的 security breaches、未授权的访问尝试或其他异常行为。通过分析审计日志&#xff0c;可以确定可疑活动的来源、时间、频率和影响。 收集特定数…

智能新浪潮:亚马逊云科技发布Amazon Nova模型

在2024亚马逊云科技re:Invent全球大会上&#xff0c;亚马逊云科技宣布推出新一代基础模型Amazon Nova&#xff0c;其隶属于Amazon Bedrock&#xff0c;这些模型精准切入不同领域&#xff0c;解锁多元业务可能&#xff0c;为人工智能领域带来革新。 带你认识一起了解Amazon Nova…

2025 OWASP十大智能合约漏洞

随着去中心化金融&#xff08;DeFi&#xff09;和区块链技术的不断发展&#xff0c;智能合约安全的重要性愈发凸显。在此背景下&#xff0c;开放网络应用安全项目&#xff08;OWASP&#xff09;发布了备受期待的《2025年智能合约十大漏洞》报告。 这份最新报告反映了不断演变的…

力扣面试经典题

目录 前言 一、合并两个有序数组 二、移除元素 三、删除有序数组的重复项 四、删除有序数组的重复项Ⅱ 五、取数组中出现次数大于数组长度/2的元素 六、移动数组元素 七、计算数组中相差最大的值 八、字母异位词分组 九、最长连续序列 十、移动0 十一、盛水最多的容…

【RabbitMq】RabbitMq高级特性-延迟消息

延迟消息 什么是延迟消息死信交换机延迟消息插件-DelayExchange其他文章 什么是延迟消息 延迟消息&#xff1a;发送者发送消息时指定一个时间&#xff0c;消费者不会立刻收到消息&#xff0c;而是在指定时间之后才收到消息。 延迟任务&#xff1a;设置在一定时间之后才执行的任…

抖音小程序一键获取手机号

前端代码组件 <button v-if"!isFromOrderList"class"get-phone-btn" open-type"getPhoneNumber"getphonenumber"onGetPhoneNumber">一键获取</button>// 获取手机号回调onGetPhoneNumber(e) {var that this tt.login({f…

CSS:语法、样式表、选择器

目录 一、语法 二、创建 外部样式表 内部样式表 内联样式 三、选择器 ID选择器 类选择器 伪类选择器 :hover a:link a:active a:visited 属性选择器 伪元素选择器 ::first-letter ::first-line ::selection ::placeholder ::before 和::after 通配选择器 标…

配电自动化中的进线监控技术

进线监控技术是配电网自动化中的一项关键技术&#xff0c;它主要用于对配电网进线变电站的开关状态以及母线电压、电流、有功功率、无功功率及电度量等参数进行实时监测。以下是对进线监控技术的详细介绍&#xff1a; 一、技术原理 进线监控技术基于传感器技术、数据采集技术、…

【三维分割】Gaga:通过3D感知的 Memory Bank 分组任意高斯

文章目录 摘要一、引言二、主要方法2.1 3D-aware Memory Bank2.2 三维分割的渲染与下游应用 三、实验消融实验应用: Scene Manipulation 地址&#xff1a;https://www.gaga.gallery 标题&#xff1a;Gaga: Group Any Gaussians via 3D-aware Memory Bank 来源&#xff1a;加利福…

《王者荣耀》皮肤爬虫源码

1.爬取网页 https://pvp.qq.com/web201605/herolist.shtml 2.python代码 import requests from bs4 import BeautifulSoup import os import threading from queue import Queuedef mul(x):if not os.path.exists(x):os.mkdir(x)print("目录创建成功")else:pass h…

iconfont等图标托管网站上传svg显示未轮廓化解决办法

打开即时设计 即时设计 - 可实时协作的专业 UI 设计工具 导入图标后拖入画板里面&#xff0c;右键选择轮廓化 将图标导出

【Linux系列】查看服务器是否使用了 SSD 的多种方法

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【AIGC】ChatGPT 的 Prompt Hacker 技巧:让简历轻松通过 AI 筛选

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;背景简化简历格式 &#x1f4af;简化 Prompt Hacker 的逻辑使用 Prompt Hacker 技巧**示例 Prompt&#xff1a;引导 AI 筛选简历**如何利用 Prompt 优化简历筛…

AI News(1/21/2025):OpenAI 安全疏忽:ChatGPT漏洞引发DDoS风险/OpenAI 代理工具即将发布

1、OpenAI 的安全疏忽&#xff1a;ChatGPT API 漏洞引发DDoS风险 德国安全研究员 Benjamin Flesch 发现了一个严重的安全漏洞&#xff1a;攻击者可以通过向 ChatGPT API 发送一个 HTTP 请求&#xff0c;利用 ChatGPT 的爬虫对目标网站发起 DDoS 攻击。该漏洞源于 OpenAI 在处理…

windows下使用docker执行器并配置 hosts 解析

本篇目录 1. 问题背景2. 环境准备2.1 云上开通windows 2022 英文版机器2.1.1 安装 git2.1.2 安装 runner2.1.3 装docker2.1.4 注册runner并使用docker执行器 3. 项目信息3.1 编写window bat脚本3.2 项目.gitlab-ci.yml文件 4. 测试结论4.1 运行流水线 5. troubleshooting问题1&…

centos9编译安装opensips 二【进阶篇-定制目录+模块】推荐

环境&#xff1a;centos9 last opensips -V version: opensips 3.6.0-dev (x86_64/linux) flags: STATS: On, DISABLE_NAGLE, USE_MCAST, SHM_MMAP, PKG_MALLOC, Q_MALLOC, F_MALLOC, HP_MALLOC, DBG_MALLOC, CC_O0, FAST_LOCK-ADAPTIVE_WAIT ADAPTIVE_WAIT_LOOPS1024, MAX_RE…

靶机复现-pikachu靶机文件包含漏洞

本篇文章旨在为网络安全渗透测试靶机复现学习。通过阅读本文&#xff0c;读者将能够对渗透pikachu靶场文件包含漏洞复现有一定的了解 原文学习链接 CSDN博主&#xff1a;One_Blanks主页地址 靶机资源下载 PHPStudy pikachu 一、前言 文件包含漏洞是编程中的一种安全隐患&a…

【机器学习实战高阶】基于深度学习的图像分割

机器学习项目图像分割 你可能已经注意到&#xff0c;大脑如何快速高效地识别并分类眼睛感知到的事物。大脑以某种方式进行训练&#xff0c;以便能够从微观层面分析所有内容。这种能力有助于我们从一篮子橙子中分辨出一个苹果。 计算机视觉是计算机科学的一个领域&#xff0c;…

【Elasticsearch 】 聚合分析:桶聚合

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

Skyeye 云 VUE 版本 v3.15.5 发布

Skyeye 云智能制造&#xff0c;采用 Springboot winUI 的低代码平台、移动端采用 UNI-APP。包含 30 多个应用模块、50 多种电子流程&#xff0c;CRM、PM、ERP、MES、ADM、EHR、笔记、知识库、项目、门店、商城、财务、多班次考勤、薪资、招聘、云售后、论坛、公告、问卷、报表…