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

Clion开发STM32之ESP8266系列(四)

前言

上一篇: Clion开发STM32之ESP8266系列(三)

本篇主要内容

  1. 实现esp8266需要实现的函数
  2. 串口3中断函数的自定义(这里没有使用HAL提供的)
  3. 封装esp8266服务端的代码和测试

正文

主要修改部分

核心配置头文件(添加一些宏定义)

  1. sys_core_conf.h文件中

在这里插入图片描述

在这里插入图片描述

实现esp8266需要实现的函数

在这里插入图片描述

源码

/******************************************************************************** @author scl* @email shchlu188@163.com*      @brief 实现esp8266的驱动******************************************************************************/
#include "module_esp8266.h"
#include "bsp.h"extern data_frame_t esp_rx_frame;static void sys_delay(uint32_t ms) {HAL_Delay(ms);
}/*** @brief esp8266 驱动外设初始化*/
void esp8266_driver_init() {/*设置系esp8266延时回调*/esp8266_set_delay_call(sys_delay);/*配置 CH_PD 引脚*/gpio_init(GPIOB, GPIO_PIN_8, GPIO_MODE_OUTPUT_PP, GPIO_NOPULL, GPIO_SPEED_FREQ_HIGH);/* 配置 RST 引脚*/gpio_init(GPIOB, GPIO_PIN_9, GPIO_MODE_OUTPUT_PP, GPIO_NOPULL, GPIO_SPEED_FREQ_HIGH);/*串口配置*/com3_init(115200);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8 | GPIO_PIN_9, GPIO_PIN_SET);/*开启串口中断*/UART_ENABLE_IT(USART3, UART_IT_RXNE);    /** 开启串口中断*/UART_ENABLE_IT(USART3, UART_IT_IDLE);   /** 开启串口空闲中断*/
}/*** @brief esp8266 复位引脚* @param flag true: 置高; false: 置低*/
void esp8266_rst_pin(bool flag) {if (flag) {pin_high(GPIOB, GPIO_PIN_9);} else {pin_low(GPIOB, GPIO_PIN_8);}
}/*** @brief esp8266 使能引脚* @param flag true: 使能*/
void esp8266_ch_enable(bool flag) {if (flag) {pin_high(GPIOB, GPIO_PIN_8);} else {pin_low(GPIOB, GPIO_PIN_8);}
}/*** @brief esp8266 发送数据* @param data* @param len*/
void esp8266_send(void *data, uint16_t len) {HAL_UART_Transmit(com_handle_get(com3), data, len, 1000);
}/*** @brief 清空接收缓冲区*/
void esp8266_clear_buf(void) {esp_rx_frame.InfAll = 0;
}/*** @brief esp8266 接收数据* @return 接收数据*/
char *esp8266_rec() {if (esp_rx_frame.InfBit.frame_finished_flag != 0) {/*添加结束符*/esp_rx_frame.p_rx_buf[esp_rx_frame.InfBit.frame_len] = '\0';esp_rx_frame.InfAll = 0;// 清除一次标志位return esp_rx_frame.p_rx_buf;}return NULL;
}/*** @brief esp8266 构造指令的缓存区* @return*/
char *esp8266_get_cmd_buf() {static char esp8266_buf[200] = {0};return esp8266_buf;
}

对应的串口3中断函数的编写

在这里插入图片描述

extern data_frame_t esp_rx_frame;static inline void esp8266_tcp_server_IRQHandler() {uint8_t ucTemp;if (UART_GET_FLAG(USART3, UART_FLAG_RXNE)) {ucTemp = READ_REG(USART3->DR);// 读取数据if (esp_rx_frame.InfBit.frame_len < (esp_rx_frame.rx_buf_len - 1)) {esp_rx_frame.p_rx_buf[esp_rx_frame.InfBit.frame_len++] = ucTemp;}}//数据帧接收完毕if (UART_GET_FLAG(USART3, UART_FLAG_IDLE)) {esp_rx_frame.InfBit.frame_finished_flag = 1;// 添加结束符esp_rx_frame.p_rx_buf[esp_rx_frame.InfBit.frame_len] = '\0';//由软件序列清除中断标志位(先读USART_SR,然后读USART_DR)_UART_CLEAR_PEFLAG(USART3);}
}void USART3_IRQHandler(void) {/* HAL库中断处理函数*/// HAL_UART_IRQHandler(&com3_handle);/* 自定义中断处理函数*/esp8266_tcp_server_IRQHandler();
}

封装esp8266服务端的代码(针对驱动层再进行一个封装)

头文件

/******************************************************************************** @author scl* @email shchlu188@163.com******************************************************************************/#ifndef STM32F103VET6_ESP8266_ESP8266_SERVICE_H
#define STM32F103VET6_ESP8266_ESP8266_SERVICE_H#include "service_include.h"
/*wifi 账号*/
#define WIFI_SSID "账号"
/*wifi 密码*/
#define WIFI_PWD "密码"
/*尝试执行次数*/
#define TRY_CNT 3
/*本地IP配置*/
#define LOCAL_SERVER_IP "192.168.199.12"
/*本地端口配置*/
#define LOCAL_SERVER_PORT 8000
/*宏定义调试日志*/
#define esp_ps(fmt, ...) os_ps(fmt,##__VA_ARGS__)
/*************************************ESP 服务端 STA模式**********************************************/
/*** @brief esp8266 在sta模式下初始化 sever* @return*/
bool esp_sta_tcp_server_init(void);
/*** @brief esp8266 在sta模式下获取ip* @param dstIp 保存ip* @param len  dstIp的长度* @return*/
bool esp_sta_tcp_server_get_ip(char *dstIp, uint8_t len);
/*** @brief esp8266 客户端请求处理* @param data 接收的数据* @param len  数据长度* @return*/
bool esp_sta_tcp_server_request_handle(char *data, uint16_t len);#endif //STM32F103VET6_ESP8266_ESP8266_SERVICE_H

源文件

/******************************************************************************** @author scl* @email shchlu188@163.com******************************************************************************/#include "esp8266_service.h"
#include "module_esp8266.h"
#include "bsp.h"/*** @brief 禁止接收数据(静态内联函数)*/
sys_force_static_inline void esp_disable_rec() {UART_DISABLE_IT(USART3, UART_IT_RXNE);
}sys_force_static_inline void esp_enable_rec() {UART_ENABLE_IT(USART3, UART_IT_RXNE);
}bool esp_sta_tcp_server_init(void) {esp_ps("--esp_sta_tcp_server_init start---\r\n");/*使能信号*/esp8266_ch_enable(true);/*测试AT指令*/try_cnt_run (esp8266_base_at_cmd_test(10, 500), 1);esp_ps("esp8266_base_at_cmd_test ok\r\n");/*动态分配IP地址*/try_cnt_run(esp8266_dhcp_cur_set(sta_mode, true, -1), TRY_CNT);/* 设置为STA模式 */try_cnt_run(esp8266_wifi_mode_cur_set(sta_mode, -1), TRY_CNT);esp_ps("esp8266_mode_cur_set ok\r\n");/* 设备本地设备ip*/try_cnt_run(esp8266_ip_sta_cur_set(LOCAL_SERVER_IP, NULL, NULL, -1), TRY_CNT);esp_ps("esp8266_ip_sta_cur_set ok\r\n");/*连接WiFi*/try_cnt_run (esp8266_wifi_join_cur_set(WIFI_SSID, WIFI_PWD, NULL, -1), TRY_CNT);esp_ps("esp8266_wifi_join_cur_set ok\r\n");/*允许多连接*/try_cnt_run (esp8266_mul_connect_set(true, -1), TRY_CNT);esp_ps("esp8266_mul_connect_set ok\r\n");/*开启服务器模式*/try_cnt_run (esp8266_server_tcp_start(true, LOCAL_SERVER_PORT, -1), TRY_CNT);esp_ps("esp8266_server_tcp_start ok\r\n");/*设置服务器链接超时时间*/try_cnt_run (esp8266_server_tcp_timeout_set(20, -1), TRY_CNT);esp_ps("esp8266_server_tcp_timeout_set ok\r\n");esp_ps("--esp_sta_tcp_server_init end---\r\n");return true;
}bool esp_sta_tcp_server_get_ip(char *dstIp, uint8_t len) {esp_ps("--esp_sta_tcp_server_get_ip start---\r\n");try_cnt_run (esp8266_ip_sta_inquire(dstIp, len, -1), TRY_CNT);esp_ps("--esp_sta_tcp_server_get_ip end---\r\n");return true;
}
/*** @brief 解析接收的数据* @param rec_data 接收的数据* @param no_id socket id* @param data_len 发送的数据长度* @return 实际数据的位置*/
sys_force_static_inline char *parse_rec_data(char *rec_data, uint8_t *no_id, uint16_t *data_len) {static char *pre_str = "+IPD,";char *p_data = strstr(rec_data, pre_str);// 数据解析错误 +IPD,0,2:12if (!p_data) return false;/*跳过前缀*/p_data += strlen(pre_str);/*解析socket id 号*/*no_id = strtol(p_data, &p_data, 10);if (!*p_data) return false;/*解析数据长度 */*data_len = strtol(p_data + 1, &p_data, 10);if (!*p_data) return false;/*获取数据*/p_data += 1;return p_data;
}bool esp_sta_tcp_server_request_handle(char *data, uint16_t len) {/* 禁止esp多个客户端同时发送数据 */uint16_t data_len = 0;/*实际客户端发送的数据长度*/uint8_t socket_id;/*实际客户端连接的端口号*/bool result_flag = true;/*禁止接收,保证同一时间只只处理一个请求 */esp_disable_rec();/*实际客户端发送的数据位置*/char *p_data = parse_rec_data(data, &socket_id, &data_len);if (p_data) {// todo 这里就是做业务逻辑控制的地方,目前只是回显esp_ps("parse_rec_data:%d %d %s\r\n", socket_id, data_len, p_data);if (esp8266_server_tcp_send_to(socket_id, p_data, data_len, -1)) {esp_ps("response ok\r\n");} else {esp_ps("response error\r\n");}} else {result_flag = false;}/*清除这次的请求数据,保证下次数据为最新的*/esp8266_clear_buf();/*开启请求,保证同一时间只只处理一个请求 */esp_enable_rec();return result_flag;
}

esp8266驱动配置文件的编写

在这里插入图片描述

/******************************************************************************** @author scl* @email shchlu188@163.com******************************************************************************/
#include "app_conf.h"
#include "module_esp8266.h"
#include "service.h"/*创建数据接收帧*/
static char rx_buf[1024] = {0};
data_frame_t esp_rx_frame = {.p_rx_buf=rx_buf, .rx_buf_len=1024};static void driver_init(void) {/*esp8266初始化*/esp8266_driver_init();
}/*这句话就是将驱动导出到段中*/
DRIVER_EXPORT(esp8266_driver, driver_init);/*** 测试阶段暂时使用此方法* */
void app_run() {if (esp_sta_tcp_server_init()) {os_ps("--esp_sta_tcp_server_init ok--\r\n");while (1) {if (esp_rx_frame.InfBit.frame_finished_flag) {esp_sta_tcp_server_request_handle(esp_rx_frame.p_rx_buf, esp_rx_frame.InfBit.frame_len);}}} else {os_ps("--esp_sta_tcp_server_init error--\r\n");}}

代码测试

  1. 本次设置esp8266模块的IP为192.168.199.12,端口号为8000

主入口函数调整

在这里插入图片描述### 下载程序

观察日志记录

在这里插入图片描述

用客户端去连接192.168.199.12:8000

在这里插入图片描述

客户端

在这里插入图片描述

查看串口

  1. 接收数据正常

在这里插入图片描述
在这里插入图片描述

结尾

  1. ESP8266系列的章节也就更新完成,目前基础功能模板工程已经完。
  2. 目前可以根据此工程执行对应的指令控制的逻辑了。
  3. 后续在此基础之上设计一个指令集动态加载服务器接收处理和响应的框架。
  4. 完整的项目已上传到gitee,有需要自行查看开头结尾的git地址.

下个系列的目标

  1. 整合Freertos
  2. 整合Modbus协议和自定义协议框架

相关文章:

Clion开发STM32之ESP8266系列(四)

前言 上一篇: Clion开发STM32之ESP8266系列(三) 本篇主要内容 实现esp8266需要实现的函数串口3中断函数的自定义&#xff08;这里没有使用HAL提供的&#xff09;封装esp8266服务端的代码和测试 正文 主要修改部分 核心配置头文件(添加一些宏定义) sys_core_conf.h文件中…...

降本增效,StarRocks 在同程旅行的实践

作者&#xff1a;周涛 同程旅行数据中心大数据研发工程师 同程旅行是中国在线旅游行业的创新者和市场领导者。作为一家一站式平台&#xff0c;同程旅行致力于满足用户旅游需求&#xff0c;秉持 "让旅行更简单、更快乐" 的使命&#xff0c;主要通过包括微信小程序、AP…...

INTP型人格适合选择哪些专业?

INTP人格内倾理性人格、具有强烈的好奇心、创造性和独立性的特点。他们善于独立思考和寻找问题的本质&#xff0c;并对抽象的想法和理论感兴趣。 INTP人格的人具有很强的逻辑思维和分析能力&#xff0c;他们的思维方式非常系统&#xff0c;追求完美和准确。因此他们适合选择需…...

【LeetCode热题100】打卡第16天:组合总和

文章目录 组合总和⛅前言&#x1f512;题目&#x1f511;题解 组合总和 ⛅前言 大家好&#xff0c;我是知识汲取者&#xff0c;欢迎来到我的LeetCode热题100刷题专栏&#xff01; 精选 100 道力扣&#xff08;LeetCode&#xff09;上最热门的题目&#xff0c;适合初识算法与数…...

tinkerCAD案例:1.戒子环

基本戒指 在本课中&#xff0c;您将学习使用圆柱形状制作戒指。来吧&#xff01; 说明 将圆柱体拖动到工作平面上并使其成为孔。 圆柱体应缩放以适合其制造手指。 在本例中&#xff0c;我们将使用 17mm 作为直径&#xff0c;但请根据您的需要随意调整尺寸。 将“圆柱”形状拖…...

RPC接口测试技术-Tcp 协议的接口测试

【摘要】 首先明确 Tcp 的概念&#xff0c;针对 Tcp 协议进行接口测试&#xff0c;是指基于 Tcp 协议的上层协议比如 Http &#xff0c;串口&#xff0c;网口&#xff0c; Socket 等。这些协议与 Http 测试方法类似&#xff08;具体查看接口自动化测试章节&#xff09;&#xf…...

MyBatis Plus基本用法-SpringBoot框架

依赖 使用 Mybatis Plus 框架时&#xff0c;需要添加以下依赖&#xff1a; <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>latest-version</version> </dependency…...

指针--指针变量的定义和初始化

存放变量的地址需要一种特殊类型的变量&#xff0c;这种特殊的数据类型就是指针&#xff08;Pointer&#xff09;。 具有指针类型的变量&#xff0c;称为指针变量&#xff0c;它时专门用于存储变量的地址值和变量。 其定义形式如下&#xff1a; 类型关键字 * 指针变量名&#x…...

Web基本概念

一、前言 World Wide Web的简称&#xff0c;是一个由许多互相链接的超文本组成的系统&#xff0c;通过互联网访问 &#xff08;为用户提供信息&#xff09; 静态网页 仅适用于不能经常更改内容的网页&#xff1b; 动态网页 网络编程技术创建的页面&#xff1b;通过在传统的静态…...

Niagara—— Texture Sample 与 Particle Subuv 区别

目录 一&#xff0c;Texture Sample 二&#xff0c;Particle Subuv 一&#xff0c;Texture Sample 此节点是最基本的采样节点&#xff0c;依据UV坐标来采样Texture&#xff1b; MipValueMode&#xff0c;设置采样的Mipmap Level&#xff1b; None&#xff0c;根据当前Texture…...

如何在食品行业运用IPD?

食品是我国重要的民生产业之一&#xff0c;是保障和满足人民群众不断增长消费需求的重要支撑。食品指各种供人食用或者饮用的成品和原料以及按照传统既是食品又是药品的物品&#xff0c;包括加工食品&#xff0c;半成品和未加工食品&#xff0c;不包括烟草或只作药品用的物质。…...

如何用pandas进行条件分组计算?

Pandas提供了强大的分组聚合功能&#xff0c;可以轻松进行条件分组计算和统计。本文通过一个例子&#xff0c;展示如何使用Pandas的.groupby()和.agg()方法进行条件分组计算。 准备数据 假设有这样一个字典数据: dict { 姓名: [张三&#xff0c;李四&#xff0c;王五&#x…...

tomcat如何调优,涉及哪些参数?

Tomcat是一个流行的开源Java Servlet容器&#xff0c;用于部署和管理Java Web应用程序。调优Tomcat可以提高性能、并发处理能力和稳定性。以下是一些常见的Tomcat调优参数和技巧&#xff1a; 1.调整内存参数&#xff1a; -Xms&#xff1a;指定Tomcat启动时的初始堆内存大小。 -…...

java培训机构学校教学教务选课管理平台springboot+vue

近年来&#xff0c;随着培训机构机构规模的逐渐增大&#xff0c;人工书写的方式已经不能满足如此庞大的数据。为了更好的适应信息时代的高效性&#xff0c;一个利用计算机来实现培训机构教务管理工作的系统将必然诞生。基于这一点&#xff0c;设计了一个培训机构教务管理系统&a…...

半导体(TSS)放电管的两大选购注意事项及选型小策略

固体放电管&#xff0c;是以半导体工艺制作而成的&#xff0c;因此我们也称为半导体&#xff08;TSS&#xff09;放电管&#xff0c;它常在电路中并联使用&#xff0c;具备伏安特性。 TSS放电管在电路中类似开关&#xff0c;在正常工作时不动作&#xff0c;但一般被保护电路受到…...

05-使用Vue3 + Vue CLI 实现前端模块的搭建

1、环境准备 流程:安装node得到npm,使用npm安装vue cli(脚手架),使用vue cli创建项目。 Vue CLI版本和Node版本有关,用Node V12只能下载到Vue CLI V4.X,必须用Node V18才能下载到Vue CLI V5.X IDEA支持配置多个版本的Node,类似配置多个JDK。 node.js安装 1、官网下载…...

3.1 增加多进程执行playwright

增加了多进程的方式执行测试代码&#xff0c;对代码改动比较大 1、case case目录依然是自动生成 2、config dir_collection.py新增了配置 mkdir_collections [case,log,img, ] del_collections [results,report ] del_regex temp3、data/img/log/resource/video data/im…...

关于单片机的时钟浅谈及STM32F103/F030单片机的内外时钟切换问题

绪论 本文主要讲解单片机的时钟系统的相关知识&#xff0c;并进行超频测试&#xff0c;同时介绍如何在STM32F0单片机上进行内外时钟的切换&#xff0c;在不使用外部晶振或者外部晶振不启动时自动切换内部时钟的方法。 一、杂谈 问题来源于群里的一次问答&#xff1a; 诚然&…...

centos6.10环境下安装php7.4(基于WLNMP包)

centos6系统已经被官网停止维护&#xff0c;要安装软件必须用第三方的RPM包&#xff0c;下面使用yum安装php7.4正式版&#xff0c;当前基于WLNMP提供的一键安装包来安装 1、添加epel源 yum install epel-release yum install epel-release 2、添加WLNMP一键安装包源 rpm -iv…...

Qt使用第三方库openssl进行RSA加密解密操作详解

一、openssl库的编译,可以参考文档: https://blog.csdn.net/liang19890820/article/details/51658574/ 因为我这里使用的是windows操作系统,可以直接下载exe格式的安装文件,直接安装即可,就包含了我们需要的头文件和库文件,省去了编译操作。exe安装文件下载地址: htt…...

激发数学思维:GPT-4实证研究探索挑战性数学问题

深度学习自然语言处理 原创作者&#xff1a;wkk 考虑到自然语言在许多科学和工程领域表达的数学问题的丰富性&#xff0c;使用大语言模型(LLM)来解决数学问题是一项有趣的研究工作。今天给大家介绍一篇微软研究院联合欧美高校关于如何使用GPT-4解决数学问题的研究论文。 之前的…...

如何配置IP地址

一.自动获取IP 1.dhclient 2.ifconfig 通过这个命令可以查看系统有几块网卡和网卡的IP。 如果您的Linux有多块网卡&#xff0c;那么在Linux中它会显示成eth1, eth2 依此类推 二.手动配置IP 如果您的虚拟机不能自动获取IP&#xff0c;那么只能手动配置&#xff0c;配置方法为&am…...

CentOS + Nginx 环境自动申请和部署Let‘s Encrypt免费SSL证书教程

文章目录 步骤 1&#xff1a;安装Certbot工具步骤 2&#xff1a;配置Nginx服务器步骤 3&#xff1a;生成SSL证书步骤 4&#xff1a;配置Nginx以使用SSL证书步骤 5&#xff1a;重新加载Nginx配置步骤 6&#xff1a;自动续期证书 本文介绍如何在 CentOS Nginx 环境下&#xff0c…...

浅谈对BI工具价值的看法

浅谈对BI工具价值的看法 BI的定义看法 百度百科的定义&#xff1a; 商业智能&#xff08;Business Intelligence&#xff0c;简称&#xff1a;BI&#xff09;&#xff0c;又称商业智慧或商务智能&#xff0c;指用现代数据仓库技术、线上分析处理技术、数据挖掘和数据展现技术…...

创建定时任务

import schedule import timedef task():print("Im working...")if __name__ __main__:schedule.every(10).seconds.do(task) # 每10秒一次schedule.every(10).minutes.do(task) # 10分钟一次schedule.every().hour.do(task) # 每小时schedule.every().day.at(&q…...

MyBatis的使用、Spring AOP、Spring事务

一、MyBatis 的使用 1、环境配置 1.1、建库建表 -- 创建数据库 drop database if exists mycnblog; create database mycnblog DEFAULT CHARACTER SET utf8mb4;-- 使⽤数据数据 use mycnblog;-- 创建表[⽤户表] drop table if exists userinfo; create table userinfo(id in…...

Apache Doris 冷热分层技术如何实现存储成本降低 70%?

在数据分析的实际场景中&#xff0c;冷热数据往往面临着不同的查询频次及响应速度要求。例如在电商订单场景中&#xff0c;用户经常访问近 6 个月的订单&#xff0c;时间较久远的订单访问次数非常少&#xff1b;在行为分析场景中&#xff0c;需支持近期流量数据的高频查询且时效…...

MySQL 两个备机同时挂掉故障分析

来源&#xff1a; 接报线上出现两个5.7.38的备库同时crash&#xff0c;crash堆栈相同&#xff0c;内容如下&#xff1a; stack_bottom 7fd7700b0d30 thread_stack 0x40000 /home/service/app/mysql33066/bin/mysqld(my_print_stacktrace0x2c)[0xf1062c] /home/service/app/m…...

序列化与反序列化深入理解

序列化与反序列化深入理解 1 介绍1.1 概述1.2 序列化实现的需求 2 常用序列化实现函数序列化语言内置开源序列化实现 3 各序列化实现比较4 各序列化实现概述XMLJSONProtobufJava 内置TLVVLE&#xff08;Variable Length Encoding&#xff09; 5 flex & bison5.1 介绍应用解…...

hudi系列-小文件优化

hudi使用mvcc来实现数据的读写一致性和并发控制,基于timeline实现对事务和表服务的管理,会产生大量比较小的数据文件和元数据文件。大量小文件会对存储和查询性能产生不利影响,包括增加文件系统的开销、文件管理的复杂性以及查询性能的下降。对于namenode而言,当整个集群中…...

泉州网站建设哪家好/百度首页

fun String?.printWithDefault(default: String) print(this ?: default);fun <T> T.easyPrint(): T {println(this)return this }fun main() {val strnull;str.printWithDefault("1324")"狗蛋".printWithDefault("1324")}...

怎样用网站做淘宝客/杭州优化商务服务公司

title: 2018.9.2 OSI七层模型及数据的传输过程 tags: 计算机网络, OSI七层模型, 数据传输, 数据解封装 --- OSI七层模型和TCP/IP五层模型 OSI七层模型 我们说的七层模型第七层都是应用层&#xff0c;第一层是最底下的物理层。 图中只有物理层之间的线条是实线的&#xff0c;可以…...

小程序制作公司/seo排名快速优化

1. 双向链表 1.1 概念 双向链表也叫双链表&#xff0c;是链表的一种&#xff0c;它的每个数据结点中都有两个指针&#xff0c;分别指向直接后继和直接前驱。所以&#xff0c;从双向链表中的任意一个结点开始&#xff0c;都可以很方便地访问它的前驱结点和后继结点。 1.2 实例…...

门户网站开发用什么框架好/参考网是合法网站吗?

摘要&#xff1a;机器人技术是当今世界备受关注的前沿课题,伴随着近年来人工智能技术不断的发展,机器人技术也成为了一个令人浮想联翩的技术领域。本文以大家喜闻乐见的中国传统的非完备信息二人军棋计算机博弈作为研究对象,军棋博弈的每方拥有25个棋子、12种类型棋子,每个棋子…...

章丘建网站/广州网站营销优化qq

一、SGI 标准的空间配置器&#xff0c;std::allocator SGI也定义了一个符合部分标准&#xff0c;名为allocator的配置器&#xff0c;但是它自己不使用&#xff0c;也不建议我们使用&#xff0c;主要原因是效率不佳。 它只是把C的操作符::operator new和::operator delete做了一…...

燕郊做网站找谁/指数查询

视频效果 炫酷按钮思路&#xff1a; 大致实录就是将盒子里边的before倾斜变形&#xff0c;使其变成一个平行四边形的效果&#xff0c;然后将其缩小隐藏&#xff0c;在放大&#xff0c;添加过渡时间就会出现如图所示的效果 代码&#xff1a; <!DOCTYPE html> <html l…...