stm32实现esp8266连接到TCP服务器(二)

news2024/11/28 19:04:54

1.2 连接到TCP Server

                1.2.1 使用网络助手,设立TCP服务器

ffeb445201fa4e8e90e47bb5983b9e21.png

25e56e8e7a3441ddaa4389aaa537ae58.png编辑

                1.2.2 连接服务器

AT+CIPSTART="TCP","192.168.1.18",8080 //指令,注意双引号逗号都要半角(英文)输入 CONNECT //结果:成功 OK //结果:成功
OK

                1.2.3 发送数据

AT+CIPSEND=4 //设置即将发送数据的长度

>abcd        //看到大于号后,输入消息,abcd,不要带回车

Response :SEND OK //结果:成功

//注意,这种情况下,每次发送前都要线发送AT+CIPSEND=长度,的指令,在发数据!

1.3 透传

用AT + CIPSEND = 4,每次发送数据都要进行字符长度设定

今天透传模式

AT+CIPMODE=1 //开启透传模式

Response :OK

AT+CIPSEND //带回车

Response: > //这个时候随意发送接收数据咯

退出透传模式

 在透传发送数据过程中,若识别到单独的⼀包数据 “+++”,则退出透传发送

 

 

头文件

#include "sys.h"
#include "esp8266.h"
#include "string.h"
#include "delay.h"
#include "stdarg.h"
uint8_t esp8266_tx_buf[ESP8266_TX_BUF_SIZE];
uint8_t esp8266_rx_buf[ESP8266_RX_BUF_SIZE]; 

uint16_t esp8266_cnt = 0 ,esp8266_cntPre = 0; /* esp8266接收缓冲区 */

UART_HandleTypeDef esp8266_handle;             /* esp8266句柄 */

esp8266模块串口配置初始化

//正常会有启动的流程只是作为一个串口的初始化
void esp8266_uart_init(uint16_t baudrate)
{
    esp8266_handle.Instance = USART2;                  /* USART1 */
    esp8266_handle.Init.Baudrate = baudrate;           /*波特率*/
    esp8266_handle.Init.WordLength= UART_WORDLENGTH_8B;/*字长为8位的数据格式传输*/
    esp8266_handle.Init.StopBits = UART_STOPBITS_1;    /*一个停止位*/ 
    esp8266_handle.Init.Parity   = UART_PARITY_NONE;                   /*无奇偶校验位*/
    esp8266_handle.Init.HwFlowCtl = UART_HWCONTRL_NONE;/*无硬件流控制*/
    esp8266_handle.Init.Mode      = UART_MODE_TX_RX;   /*收发模式*/
    HAL_UART_Init(esp8266_handle);
}

清除接收缓存

void esp8266_rx_clear(void)
{
    memset(esp8266_rx_buf,0,sizeof(esp8266_rx_buf));
    esp8266_cnt = 0;
}

中断服务函数

void USART2_IRQHandler(void)
{
    uint8_t receive_data = 0;
    /* 获取接收RXNE标志位是否被置位 */
    if(__HAL_UART_GET_FLAG(&esp8266_handle,UART_FLAG_RXNE) !=RESET)
    {
        /* 则将接收计数器清零 */
        if(esp8266_cnt >=sizeof(esp8266_rx_buf))
        esp8266_cnt = 0;
        /* 接收一个字符 */
        HAL_UART_Receive(&esp8266_handle,&receive_data, 1,1000);
        /* 将接收到的字符保存在接收缓冲区 */
        esp8266_rx_buf[esp8266_cnt++] = receive_data;
}
        /* 获取接收空闲中断标志位是否被置位 */
        if(__HAL_UART_GET_FLAG(&esp8266_handle,UART_FLAG_IDLE) != RESET)
        {
                                 /* 将接收到的数据打印出来 */
        printf("recv: %s\r\n", esp8266_rx_buf);
        esp8266_rx_clear();      /* 清除UART总线空闲中断 */
        __HAL_UART_CLEAR_IDLEFLAG(&esp8266_handle)
}
}

接收等待

uint8_t esp8266_wait_receive(void)
{
    if(esp8266_cnt == 0)
    return ESP8266_ERROR;
    if(esp8266_cnt == esp8266_cntPre)
    {
    esp8266_cnt = 0;
    return ESP8266_EOK;
    }
    esp8266_cntPre = esp8266_cnt;
    return ESP8266_ERROR;
}

发送命令与期待回复函数

uint8_t esp8266_send_command(char *cmd,cahr *res)
{
    uint8_t timeout_out = 250;
    
    esp8266_rx_clear();//防止缓冲区内的数据影响
    HAL__UART_Tramsmit(&esp8266_handle,(uint8_t *)cmd,strlen(cmd),100);
    
    while(timeout_out--)//不停的等待
    {
    if(esp8266_wait_receive() == ESP8266_EOK)
    {
    if(strstr(const char *)esp8266_rx_buf, res) != NULL)//判断是否又有期待的字符串
    return ESP8266_EOK
}
    return ESP8266_ERROR;
}
}

接收数据

void esp8266_receiv_data(void)
{
    if(esp8266_wait_receive() = ESP8266_EOK)
    {
    printf("esp8266 recv: %s\r\n",esp8266_rx_buf);
    esp8266_rx_clear();
    }
}

发送不定长数据

void esp8266_send_data(char *fmt, ...)
{
    va_list ap;
    uint16_len;
    
    va_start(ap,fmt);
    vsprintf((char *)esp8266_tx_buf,fmt,ap);
    va_end(ap);
    
    len = strlen((const char*)esp8266_tx_buf);
    HAL__UART_Transmit(&esp8266_handle,esp8266_tx_buf,len,100);// 发送
}

at测试指令

uint8_t esp8266_at_test(void)
{
    return esp8266_send_command("AT\r\n", "OK");//记得加回车
}

模式设置函数封装

uint8_t esp8266_set_mode(uint8_t mode)
{
    switch(mode)
{
    case ESP8266_STA_MODE:
        return esp8266_send_command("AT+CWMODE=1\r\n");
    case ESP8266_AP_MODE:
        return esp8266_send_command("AT+CWMODE=2\r\n");
    case ESP8266_STA_AP_MODE:
        return esp8266_send_command("AT+CWMODE=3\r\n");
    default:
        return esp8266_EINVL; 
}
}

加入服务器输入账号密码

uint8_t esp8266_join_ap(char *ssid,char *pwd)
{
    char cmd[64];
    sprintf(cmd, "AT+CWJAP=\"%s\",\"%s\"\r\n",ssid,pwd);//作为模式传输进入
    return esp8266_send_command(cmd."OK");
}

设置单路连接的esp8266连接模式

/*设置单路连接的模式(透传只能用此模式)*/
uint8_t esp8266_connect_mode(uint8_t mode)
{
    char cmd[64];
    sprintf(cmd,"AT+CIPMUX=%d\r\n",mode);
    return esp8266_send_command(cmd,"OK");//发送cmd指令期待回复OK
}

连接tcp服务器

uint8_t esp8266_connect_tcp_sever(char *server_ip,char *server port)
{
    char cmd[64];
    sprintf(cmd,"AT+CIPSTART=\"TCP\",\"%s\",%s\r\n",server_ip,server_port);
    return esp8266_send_command,"CONNECT");
}

进入透传模式

uint8_t esp8266_enter_unvarnished(void)//进入透传模式
{
    uint8_t ret;
    
    ret  =  esp8266_send_command("AT+CIPMODE=1\r\n","OK");
    ret +=  esp8266_send_command("AT+CIPSEND\r\n",">");//调用指令函数
    if(ret == ESP8266_EOK)
        return ESP8266_EOK;
    else
        return ESP8266_ERROR;
}

esp8266初始化

uint8_t esp8266_init(uint32_t baudrate)
{
    printf("esp8266初始化开始...\r\n");    
    esp8266_init_uart(baudrate);
  
    printf("1. 测试esp8266是否存在\r\n")
    while(esp8266_at_test())
        delay_ms(500);
    
    printf("2. 设置工作模式为STA...\r\n");
    while(esp8266_set_mode(ESP8266_STA_MODE)
        delay_ms(500);

    printf("3. 设置单路链接模式\r\n");
    while(esp8266_connect_mode(ESP8266_SINGLE_CONNECTION))
    delay_ms(500);
    
    printf("4. 连接wifi,SSID: %s ,PWD:%s\r\n",WIFI_SSID,WIFI_PWD);
    while(esp8266_join_ap(WIFI_SSID,WIFI,PWD))
    delay_ms(1500);//时间长一些

    printf("6. 进入透传模式...\r\n");
    while(esp8266_enter_unvarnished())
    delay_ms(500);

    print("esp8266已经连接上tcp服务器并进入透传模式")
}

测试函数

void esp8266_test(void)
{
	esp8266_send_data("this is from esp8266\r\n");
	esp8266_receiv_data();
}

main函数

#include "delay.h"
#include "led.h"
#include "uart1.h"
#include "esp8266.h"
int main(void)
{
    HAL_Init();                         /* 初始化HAL库 */
    stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
    led_init();	/* LED初始化 */

		uart1_init(115200);
		esp8266_init(115200);
		printf("helloworld!\r\n");		
    while(1)
    {       			
			esp8266_test();
			delay_ms(500);
    }
}

2. ESP8266作为服务器

USB转TTL插入电脑,TX--RX RX-TX VCC-3.3V GND-GND

查询IP地址:AT+CIFSR

//1 配置成AP模式

AT+CWMODE=2

Response :OK

//2 使能多链接

AT+CIPMUX=1 Response :OK

//3 建立TCPServer

AT+CIPSERVER=1 // default port = 333 Response :OK

//4 发送数据

AT+CIPSEND=0,4      // 发送4个字节在连接0通道上 >abcd//输入数据,

Response :SEND OK //不带回车

//5 接收数据

+IPD, 0, n: xxxxxxxxxx //+IPD是固定字符串 0是通道,n是数据长度,xxx是数据

//断开连接

AT+CIPCLOSE=0

Response :0, CLOSED OK

 头文件

#include "sys.h"
#include "esp8266.h"
#include "string.h"
#include "delay.h"
#include "stdarg.h"

uint8_t esp8266_tx_buf[ESP8266_TX_BUF_SIZE];
uint8_t esp8266_rx_buf[ESP8266_RX_BUF_SIZE]; 

uint16_t esp8266_cnt = 0 ,esp8266_cntPre = 0; /* esp8266接收缓冲区 */

UART_HandleTypeDef esp8266_handle;             /* esp8266句柄 */

esp8266串口初始化配置

void esp8266_uart_init(uint32_t baudrate)//正常会有启动的流程只是作为一个串口的初始化
{
    /*esp8266 初始化设置*/
    esp8266_handle.Instance = USART2;                               /* USART1 */
    esp8266_handle.Init.BaudRate = baudrate;                        /* 波特率 */
    esp8266_handle.Init.WordLength = UART_WORDLENGTH_8B;            /* 字长为8位数据格式*/
    esp8266_handle.Init.StopBits = UART_STOPBITS_1;                 /* 一个停止位 */
    esp8266_handle.Init.Parity = UART_PARITY_NONE;                  /* 无奇偶校验位 */
    esp8266_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE;            /* 无硬件流控 */
    esp8266_handle.Init.Mode = UART_MODE_TX_RX;                     /* 收发模式 */
    HAL_UART_Init(&esp8266_handle);                                 /*会使能esp8266 */                 
}

接收缓冲区配置

void esp8266_rx_clear(void)
{
    memset(esp8266_rx_buf, 0, sizeof(esp8266_rx_buf)); /* 清空接收缓冲区 */
    esp8266_cnt = 0;                                   /* 接收计数器清零 */
}

中断服务函数

void USART2_IRQHandler(void)
{
    uint8_t receive_data = 0;   
    if(__HAL_UART_GET_FLAG(&esp8266_handle, UART_FLAG_RXNE) != RESET){/* 获取接收RXNE标志位是否被置位 */
        if(esp8266_cnt >= sizeof(esp8266_rx_buf))                     /* 如果接收的字符数大于接收缓冲区大小, */
            esp8266_cnt = 0;                                          /* 则将接收计数器清零 */
        HAL_UART_Receive(&esp8266_handle, &receive_data, 1, 1000);    /* 接收一个字符 */
        esp8266_rx_buf[esp8266_cnt++] = receive_data;    /* 将接收到的字符保存在接收缓冲区 */
    }

    if (__HAL_UART_GET_FLAG(&esp8266_handle, UART_FLAG_IDLE) != RESET) /* 获取接收空闲中断标志位是否被置位 */
    {
        printf("recv: %s\r\n", esp8266_rx_buf);                  /* 将接收到的数据打印出来 */
        esp8266_rx_clear();
        __HAL_UART_CLEAR_IDLEFLAG(&esp8266_handle);              /* 清除UART总线空闲中断 */
    }
}

等待接收函数

uint8_t esp8266_wait_receive(void)
{
	if(esp8266_cnt == 0)
			return ESP8266_ERROR;
	if(esp8266_cnt == esp8266_cntPre)
	{
		esp8266_cnt = 0;
		return ESP8266_EOK;
	}
		esp8266_cntPre = esp8266_cnt;
		return ESP8266_ERROR;
}

发送指令并期待返回值

uint8_t esp8266_send_command(char *cmd,char *res)//发送一个指令去   在指定时间内返回回来 否则没有接收到一个返回值
{
	uint8_t timeout_out = 250;
	
	esp8266_rx_clear(); //防止忍心内的数据影响
	HAL_UART_Transmit(&esp8266_handle,(uint8_t *)cmd,strlen(cmd),100);//发送命令 cmd在这里是一个uint8_t的数据 长度 阻塞的值
	//等待
	while(timeout_out--)//不停的等待
	{
		if(esp8266_wait_receive() == ESP8266_EOK)
		{
			if(strstr((const char*)esp8266_rx_buf, res) != NULL)//判断是否又有期待的字符串
			return ESP8266_EOK;
		}
		delay_ms(10);
		}
		return ESP8266_ERROR;//否则接收错误
	
}

接收数据

//接收的函数
void esp8266_receiv_data(void)
{
	if(esp8266_wait_receive() == ESP8266_EOK)
	{
		printf("esp8266 recv: %s\r\n", esp8266_rx_buf);
		esp8266_rx_clear();
	}
}

发送不定长数据

//发送的函数  不定长数据 参数不固定
void esp8266_send_data(char *fmt, ...)
{
	va_list ap;
	uint16_t len;
	
	va_start(ap,fmt);
	vsprintf((char *)esp8266_tx_buf,fmt, ap);
	va_end(ap);
	
	len = strlen((const char*)esp8266_tx_buf);
	HAL_UART_Transmit(&esp8266_handle, esp8266_tx_buf, len,100);//发送
}

设置a模块是否存在测试



uint8_t esp8266_at_test(void)
{
		return esp8266_send_command("AT\r\n", "OK");//记得加回车换行才能作为指令发送期待返回值为OK  直接作为返回值发送

}

设置模式

uint8_t esp8266_set_mode(uint8_t mode)//s四个函数
{
	switch(mode)
	{
		case ESP8266_STA_MODE:
				return esp8266_send_command("AT+CWMODE=1\r\n","OK");
		
		case ESP8266_AP_MODE:
				return esp8266_send_command("AT+CWMODE=2\r\n","OK");
		
		case ESP8266_STA_AP_MODE:
				return esp8266_send_command("AT+CWMODE=3\r\n","OK");
		
		default:
				return ESP8266_EINVAL;//如果指令不存在
	}
}

加入AP


uint8_t esp8266_join_ap(char *ssid,char *pwd)//账号密码
{
		char cmd[64];
		sprintf(cmd, "AT+CWJAP=\"%s\",\"%s\"\r\n",ssid,pwd);//\"HUAWEIAP-1\",=\"%s\  就指令带引号直接写不行,我们需要如此就不会将“”认为是配对的
		return esp8266_send_command(cmd,"WIFI GOT IP");;//调用指令函数
}

连接模式

	
uint8_t esp8266_connect_mode(uint8_t mode)//设置单路连接的模式(透传只能用此模式)
{
		char cmd[64];
		sprintf(cmd, "AT+CIPMUX=%d\r\n",mode);//作为模式传输进入
		return esp8266_send_command(cmd,"OK");;//调用指令函数
}
//连接TCP服务器

esp8266_连接模式

uint8_t esp8266_connect_mode(uint8_t mode)//设置单路连接的模式(透传只能用此模式)
{
		char cmd[64];
		sprintf(cmd, "AT+CIPMUX=%d\r\n",mode);//作为模式传输进入
		return esp8266_send_command(cmd,"OK");;//调用指令函数
}

 esp8266连接tpc服务器ip和端口

uint8_t esp8266_connect_tcp_server(char *server_ip,char*server_port)
{
		char cmd[64];
		sprintf(cmd, "AT+CIPSTART=\"TCP\",\"%s\",%s\r\n",server_ip,server_port);//作为模式传输进入
		return esp8266_send_command(cmd,"CONNECT");;//调用指令函数
}

进入透传模式

uint8_t esp8266_enter_unvarnished(void)//发送的模式
{
		uint8_t ret;//取巧的方式定义一个返回值
		//两次返回值都等于0,如果有一个不为0就为不为零的情况
		ret  = esp8266_send_command("AT+CIPMODE=1\r\n","OK");;//调用指令函数
		ret += esp8266_send_command("AT+CIPSEND\r\n",">");;//调用指令函数
		if(ret == ESP8266_EOK)
				return ESP8266_EOK;
		else
				return ESP8266_ERROR;		
}

建立tcp服务器

uint8_t esp8266_build_tcp_server(void)
{
		return esp8266_send_command("AT+CIPSERVER=1\r\n","OK");//发送AT+CIPSEVER=1,期待回复OK
}

初始化esp8266


void esp8266_init(uint32_t baudrate)//所以增加新添加一个
{
		printf("esp8266初始化开始...\r\n");
		esp8266_uart_init(baudrate);
	
		printf("1. 测试esp8266是否存在\r\n");
		while(esp8266_at_test())//esp8266_at_test();也是可以的不过一直不成功那就一直等待更为保险
			delay_ms(500);

		printf("2. 设置工作模式为AP...\r\n");
		while(esp8266_set_mode(ESP8266_AP_MODE))
			delay_ms(500);
		
		printf("3. 设置多路链接模式\r\n");
		while(esp8266_connect_mode(ESP8266_MULTI_CONNECTION))
			delay_ms(500);
		printf("4. 建立TCP服务器...\r\n");
		while(esp8266_build_tcp_server())
			delay_ms(500);		

		printf("esp8266初始化完成...\r\n");

		
		
	//esp8266的其他初始化
}

esp8266初始化测试

//测试函数
void esp8266_test(void)
{
	esp8266_send_data("this is from esp8266\r\n");
	esp8266_receiv_data();
}

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2222351.html

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

相关文章

08 实战:色彩空间展示(本程序以视频为主)

程序效果如下: 我在这里讲解RGB和YCbCr的原理: 一、RGB颜色空间 1.1 基本概念 RGB颜色空间是一种最基础和常用的颜色表示方式,它基于人眼感知色彩的三原色原理。RGB分别代表: R(Red):红色G(Green):绿色B(Blue):蓝色通过这三种基本颜色的不同组合,可以产生人眼…

c#编写的各类应用程序、类库的引用(黑白盒)

001 课程简介,C# 语言简介,开发环境准备 (yuque.com)https://www.yuque.com/yuejiangliu/dotnet/timothy-csharp-001 一个Solution里包含多个Project 一、见识 C# 编写的各类应用程序 二、类库的引用(黑/白盒引用) 1、黑盒引用&a…

杨辉三角算法

给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2: 输入: numRows 1 输出: [[1]]提示: 1 <…

2024ideaUI切换和svn与git的切换,svn的安装和配置,idea集成svn ,2024-10-18日

2024-10-18日 2024的UI实在很不舒服&#xff0c;隐藏了很多按键&#xff1b; 第一步&#xff1a; 视图 -》 外观 -》 工具栏选出来&#xff1b; 结果出来&#xff1a; 运行的按键和设置的按钮 第二步 点击设置的按钮&#xff0c;选择最后一个&#xff0c;重启就行 结果 舒服&…

LabVIEW提高开发效率技巧----用户权限控制

在LabVIEW开发中&#xff0c;用户权限控制是一个重要的设计模块&#xff0c;尤其在多用户系统中&#xff0c;它可以确保数据安全并控制不同用户的操作权限。为了实现用户权限控制&#xff0c;可以通过角色与权限管理模块来进行设计和实施。以下将从多个角度详细说明如何在LabVI…

Quarto ppt模板制作与Rstudio git连接

本篇记录下当前ppt演示中比较流行的quarto document使用情况以及Rstudio与git相连接的一些实操。 1 Quarto ppt模板制作 1.1 Quarto简介&#xff08;来自Kimi&#xff09; Quarto 是一个由 RStudio 的母公司 Posit 团队开发的开源科学和技术出版系统&#xff0c;它建立在 Pan…

Vue3 Composition Admin——基于 Vue 3 的现代化后台管理模板

Vue3 Composition Admin,这是一个基于 Vue 3 的现代化后台管理模板,旨在为开发者提供一个高效、灵活的开发基础。借助 Vue 3 的 Composition API,我们构建了一个可扩展的架构,使得代码更加清晰易读,同时提升了开发效率。 本项目集成了丰富的 UI 组件、动态路由管理和权限…

Android OpenGL光照效果

在计算机图形学领域&#xff0c;光照仿真是一个重要的研究领域&#xff0c;它对游戏画面的提升、电影和电视节目中的电脑生成图像&#xff08;CGI&#xff09;等方面产生了显著影响。通过使用不同的光照算法&#xff0c;我们可以改变场景的外观&#xff0c;例如模拟从白天到夜晚…

安装好的 Nginx 增加 nginx-module-vts 模块

目录 1. nginx-module-vts 准备 2.查看已安装的的 nginx 编译参数 3. 重新编译 nginx 添加 nginx-module-vts 模块 4. 验证 1. nginx-module-vts 准备 # 解压 unzip nginx-module-vts-master.zip # 将解压包移动到/usr/local/目录 mv nginx-module-vts-master /usr/local/ …

杭州威雅学校一席谈:企业家精神的传承

威雅一席谈 ABBEYTALK 《威雅一席谈》是杭州威雅学校为促进家校沟通推出的社区交流平台。我们将定期邀请家长代表分享自身经验与观点&#xff0c;通过真诚且深度的交谈探寻教育新契机。 本期一席谈&#xff0c;我们邀请了杭州威雅优秀学生家长Robin王先生。终身学习、工匠精神是…

Linux系统——dns域名解析

Linux系统——dns域名解析 一、dns域名解析介绍1、DNS核心概念1.1 区域 zone1.2 记录 record 二、DNS服务的配置1、正向解析的配置2、测试dns正常工作3、配置反向解析4、dns复制 三、DNS查询类型四、hosts文件的使用 一、dns域名解析介绍 dns&#xff0c;应用层协议 作用&…

arp代答观察

文章目录 代答和代理简述实验前提先不开启proxy代答的配置开启代答总结 代答和代理简述 ARP&#xff08;地址解析协议&#xff09;是在局域网中用于将IP地址映射到MAC地址的协议。在理解 ARP 代答和 ARP 代理之前&#xff0c;让我们先澄清一下 ARP 的基本工作原理。 ARP 代答&…

标题PLSQL 里面怎么在文件窗口下 ,创建文件夹,并做好常用sql语句的分类

标题PLSQL 里面怎么在文件窗口下 &#xff0c;创建文件夹&#xff0c;并做好常用sql语句的分类&#xff1f; 效果如图&#xff1a; 标题打开plsql,找到文件窗口 找到&#xff0c;窗口下的这个类似文件夹带扳手的这个图标&#xff0c;打开&#xff0c; 打开后&#xff0c;定位…

十一、pico+Unity交互开发教程——手指触控交互(Poke Interaction)

一、XR Poke Interactor 交互包括发起交互的对象&#xff08;Interactor&#xff09;和可被交互的对象&#xff08;Interactable&#xff09;。XR Interaction Toolkit提供了XR Poke Interactor脚本用于实现Poke功能。在LeftHand Controller和RightHand Controller物体下创建名…

LeetCode做题笔记第202题:快乐数

题目描述 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 1.对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。 2.然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。 3.如果这个过程 结…

「C/C++」C++ STL容器库 之 std::set 唯一键的集合容器

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

小鹏汽车股价分析:看涨信号已出现,技术指标显示还有40%的上涨空间

猛兽财经核心观点&#xff1a; &#xff08;1&#xff09;小鹏汽车的股价过去几天有所回落。 &#xff08;2&#xff09;随着需求的上升&#xff0c;该公司的业务发展的还算不错。 &#xff08;3&#xff09;猛兽财经对小鹏汽车股价的技术分析&#xff1a;多头已经将目标指向15…

【通俗理解】Neurosymbolic AI——融合神经网络与符号推理的智慧之力

【通俗理解】Neurosymbolic AI——融合神经网络与符号推理的智慧之力 关键词提炼 #Neurosymbolic AI #神经网络 #符号推理 #感知能力 #逻辑能力 #认知水平 #智慧与力量 第一节&#xff1a;Neurosymbolic AI的类比与核心概念 Neurosymbolic AI就像是给神经网络这位“大力士”…

排序算法 —— 计数排序

目录 1.计数排序的思想 2.计数排序的实现 3.计数排序的分析 时间复杂度 空间复杂度 稳定性 优点 缺点 1.计数排序的思想 顾名思义&#xff0c;计数排序就是通过计数的方式来排序&#xff0c;其基本思想为&#xff1a; 开辟一个计数数组&#xff0c;统计每个数出现的次…

计算机毕业设计Hadoop+大模型在线教育大数据分析可视化 学情分析 课程推荐系统 机器学习 深度学习 人工智能 大数据毕业设计

一、研究背景和意义 “互联网”和大数据带来了网络教育的蓬勃发展&#xff0c;学习分析技术和自适应学习也在近年内得到了重大突破。在线教育是互联网技术与传统教育的结合&#xff0c;是当前中国教育信息化发展最快的领域&#xff0c;而当下最迫切的是有效整合教育资源和互联…