2025 年最新树莓派 Pico 连接 ESP8266 模块实现 WiFi 通信、搭建 TCP 服务器实现数据交互详细教程
AT 指令基本结构概述
AT 指令最初由 Hayes 公司为其调制解调器(modem)开发,目的是提供一种标准化的方式来控制通信设备。最早的 Hayes Smartmodem 300 调制解调器(1981年)引入了这一指令集,因此 AT 指令也被称为 “Hayes 命令集”。“AT” 是 “Attention” 的缩写,用于唤醒设备并表示后续字符串是一个命令。
随着通信技术的发展,AT 指令被广泛应用于 GSM、GPRS、3G、4G 模块、蓝牙模块、Wi-Fi 模块等领域,成为许多设备的标准通信协议。现代 AT 指令集已由 3GPP(第三代合作伙伴计划)等组织标准化,尤其在移动通信领域。
基本结构
AT<命令>[参数][回车符]
ESP8266 概述
Wi-Fi 模块概述
主要功能:Wi-Fi模块主要用于设备之间的无线通信和连接。它可以使设备能够通过Wi-Fi网络进行数据传输、接入互联网以及与其他Wi-Fi设备进行通信。Wi-Fi模块通常配备有无线接收器和发送器,可以接收来自其他设备或无线路由器的无线信号,并发送数据到目标设备或路由器。技术标准:Wi-Fi模块遵循IEEE 802.11无线通信标准。不同的Wi-Fi模块可能支持不同的Wi-Fi标准,如802.11a/b/g/n/ac/ax等。这些标准定义了无线信号的频率、传输速率、安全性和其他通信参数,以确保Wi-Fi设备之间的互操作性。硬件组成:Wi-Fi模块通常由无线芯片、天线、射频前端、处理器和存储器等组成。无线芯片是Wi-Fi模块的核心部件,负责处理无线信号的接收和发送。天线用于接收和发送无线信号。射频前端负责信号的放大和调理。处理器和存储器用于执行无线通信协议、管理数据传输和存储相关配置信息。软件支持:Wi-Fi模块通常配备有嵌入式软件,用于实现Wi-Fi通信协议栈,处理数据传输和管理网络连接。这些软件通常由供应商提供,并且可以根据需求进行配置和定制。供电和接口:Wi-Fi模块通常通过供电引脚与外部电源连接,并通过UART、SPI、I2C等接口与主控制器或其他设备进行通信。这些接口使得Wi-Fi模块能够与各种不同类型的设备集成。应用领域:Wi-Fi模块广泛应用于各种物联网(IoT)设备、智能家居、工业自动化、医疗设备、消费电子产品等领域。它们可以使这些设备实现无线连接、远程控制和互联网接入功能。
ESP8266 概述
ESP8266 是一款低成本、高性能的 Wi-Fi 模块,由 Espressif Systems 开发。它集成了 Wi-Fi 功能和TCP/IP协议栈,并可通过串口与主控制器进行通信。
ESP 通常指 Espressif Systems 的微控制器系列,包括 ESP8266 和 ESP32。由中国公司Espressif Systems(乐鑫信息科技)开发,成立于2008年,总部位于上海。生产低成本、高性能的 Wi-Fi 和蓝牙 SoC(系统级芯片),广泛用于物联网(IoT)设备。
ESP8266 基础 AT 指令
ESP8266 基础 AT 指令集,用于通过串口控制模块。涵盖了基本配置、Wi-Fi 连接、TCP/IP 通信等操作。配合 115200 波特率 串口工具使用(例如:Arduino IDE 串口监视器、PuTTY 等)。
基本功能
指令 | 功能 | 示例 | 响应 |
---|---|---|---|
AT | 测试模块是否正常 | AT | OK |
AT+RST | 重启模块 | AT+RST | OK + 重启信息 |
AT+GMR | 查看固件版本 | AT+GMR | <版本号>\r\nOK |
ATE0 /ATE1 | 关闭/开启回显 | ATE0 | OK |
Wi-Fi 模式设置
指令 | 功能 | 示例 | 响应 |
---|---|---|---|
AT+CWMODE=<mode> | 设置 Wi-Fi 模式 | AT+CWMODE=1 | OK |
AT+CWMODE? | 查询当前模式 | AT+CWMODE? | +CWMODE:<mode>\r\nOK |
1:Station 模式(客户端,连接路由器)
2:AP 模式(热点,其他设备可连接)
3:Station+AP 混合模式
连接 Wi-Fi(Station 模式)
指令 | 功能 | 示例 | 响应 |
---|---|---|---|
AT+CWLAP | 扫描附近 AP | AT+CWLAP | 返回附近热点列表 |
AT+CWJAP="SSID","PWD" | 连接 Wi-Fi | AT+CWJAP="home","123456" | OK (成功时) |
AT+CWQAP | 断开当前 Wi-Fi | AT+CWQAP | OK |
AT+CIFSR | 查询本地 IP | AT+CIFSR | 返回 IP 地址 |
AP 模式配置(热点)
指令 | 功能 | 示例 | 响应 |
---|---|---|---|
AT+CWSAP="SSID","PWD",ch,ecn | 设置 AP 参数 | AT+CWSAP="ESP","pass",5,3 | OK |
AT+CWLIF | 查看连接的设备 | AT+CWLIF | 返回客户端 IP |
ch:信道(1~13)
ecn:加密方式(0-OPEN, 2-WPA_PSK, 3-WPA2_PSK, 4-WPA_WPA2_PSK)
TCP/IP 通信
指令 | 功能 | 示例 | 响应 |
---|---|---|---|
AT+CIPSTATUS | 查询连接状态 | AT+CIPSTATUS | 返回当前连接信息 |
AT+CIPSTART="TYPE","IP",port | 建立 TCP/UDP 连接 | AT+CIPSTART="TCP","192.168.1.100",80 | OK 或 ERROR |
AT+CIPSEND=<length> | 发送数据 | AT+CIPSEND=4 > ABCD | SEND OK |
AT+CIPCLOSE | 关闭连接 | AT+CIPCLOSE | OK |
AT+CIPMUX=<mode> | 设置连接模式 | AT+CIPMUX=1 | OK |
0:单连接
1:多连接(需配合 `AT+CIPSERVER` 使用)
HTTP 请求示例
AT+CIPSTART="TCP","www.example.com",80
AT+CIPSEND=48
> GET / HTTP/1.1\r\nHost: www.example.com\r\n\r\n
# 返回网页数据后关闭连接
AT+CIPCLOSE
RXD / TXD
TXD(Transmit Data)和 RXD(Receive Data)是串口通信(UART,Universal Asynchronous Receiver / Transmitter)中的两个关键引脚,分别用于数据的发送和接收。TXD 和 RXD 共同实现串口通信的双向数据交换,TXD负责输出,RXD负责输入,是串口通信的基础组件。
TXD(发送数据)
作用:用于设备发送数据到外部设备。
工作原理:当一个设备(例如微控制器或GSM模块)需要向另一设备发送数据时,数据通过TXD引脚以串行形式输出。
示例:微控制器通过TXD发送AT指令到调制解调器。
RXD(接收数据)
作用:用于设备接收来自外部设备的数据。
工作原理:当外部设备通过其TXD引脚发送数据时,目标设备的RXD引脚接收这些数据。
示例:调制解调器通过RXD返回AT指令的响应给微控制器。
一对一通信:TXD 和 RXD 通常以交叉方式连接,即设备 A 的 TXD 连接到设备 B 的 RXD,设备 B 的 TXD 连接到设备 A 的 RXD。
ESP8266 模块工作模式
STA 模式
在此模式下,模块可连接其他设备提供的无线网络,例如通过 WIFI 连接至路由器,从而可以访问互联网,进而实现手机或电脑通过互联网实现对设备的远程控制。
简单来说,此模式下,该模块相当于一个用户,需要链接外部的 WIFI(或自己的热点),通过链接的 WIFI 进行与其他设备的通信。
AP 模式
AP 模式为默认的模式,在此模式下,模块将作为热点供其他设备连接, 从而让手机或电脑直接与模块进行通讯,实现局域网的无线控制。
简单来说,此模式下,该模块相当于提供一个热点,创建一个小范围的局域网,凡是连接上的设备就能与其进行通信。
STA + AP 模式
该模式为 STA 模式与 AP 模式共存的一种模式,模块既能连接至其他 设备提供的无线网络,又能作为热点,供其他设备连接,以实现广域网与局域网的无缝切换, 方便操作使用。
WiFi ESP8266 搭建服务器
pico 端连接 WiFi 启动服务器
import machine
import time# Initialize UART with larger buffer
uart = machine.UART(0, baudrate=115200, tx=0, rx=1, timeout=100, rxbuf=2048) # Adjust pins, increase buffer# Send AT command
def send_cmd(cmd, wait=1000):uart.write(cmd + "\r\n")time.sleep_ms(wait)response = ""timeout = time.ticks_ms() + waitwhile time.ticks_ms() < timeout:if uart.any():data = uart.read()if data: # Check if data is not Nonetry:response += data.decode('utf-8')except UnicodeError:response += str(data) # Fallback for non-UTF-8 datatime.sleep_ms(10) # Avoid CPU overloadreturn response# Initialize ESP8266
def init_esp8266():print("Initializing ESP8266...")response = send_cmd("AT", 500) # Test communicationif "OK" in response:print("AT OK")else:print("AT failed:", response)return Falsesend_cmd("AT+CWMODE=1", 500) # Set to Station modesend_cmd("AT+CIPRECVTYPE=0", 500) # Set to normal data receive modereturn True# Connect to WiFi
def connect_wifi(ssid, password):print("Connecting to WiFi...")response = send_cmd(f'AT+CWJAP="{ssid}","{password}"', 10000) # Connect to WiFiif "OK" in response:print("WiFi connected")ip_response = send_cmd("AT+CIFSR", 1000) # Get IP addressprint("IP info:", ip_response)return Trueelse:print("WiFi connection failed:", response)return False# Start TCP server
def start_tcp_server(port=12345):print("Starting TCP server...")send_cmd("AT+CIPMUX=1", 500) # Enable multiple connectionsresponse = send_cmd(f'AT+CIPSERVER=1,{port}', 1000) # Start server on portif "OK" in response:print(f"TCP server started on port {port}")return Trueelse:print("Failed to start TCP server:", response)return False# Receive and respond to messages
def handle_tcp_communication():print("Listening for messages...")buffer = "" # Buffer to accumulate UART datawhile True:if uart.any():data = uart.read(uart.any()) # Read exact number of available bytesif data:try:buffer += data.decode('utf-8')except UnicodeError:buffer += str(data)print("Non-UTF-8 data received:", data)# Debug: Print raw buffer content# print("Raw buffer:", repr(buffer))# Clean up CONNECT/CLOSED messagesbuffer = buffer.replace(",CONNECT\r\n", "")buffer = buffer.replace(",CLOSED\r\n", "")# Process complete +IPD messageswhile "+IPD" in buffer:ipd_start = buffer.find("+IPD")colon_pos = buffer.find(":", ipd_start)if colon_pos == -1:break # Incomplete +IPD, wait for more data# Extract conn_id and data_lenheader = buffer[ipd_start:colon_pos]parts = header.split(",")if len(parts) < 3:break # Invalid +IPD formattry:conn_id = parts[1]data_len = int(parts[2].split(":")[0])except (IndexError, ValueError):break # Malformed header# Check if enough data is availabledata_start = colon_pos + 1if len(buffer[data_start:]) < data_len:break # Incomplete data, wait for more# Extract client dataclient_data = buffer[data_start:data_start + data_len]print(f"Received from conn {conn_id}: {client_data}")# Send responseresponse = f"Echo: {client_data}"send_cmd(f'AT+CIPSEND={conn_id},{len(response)}', 1000)time.sleep_ms(100) # Ensure ESP8266 processes send commandsend_cmd(response, 1000)send_cmd(f'AT+CIPCLOSE={conn_id}', 500) # Close connectionprint(f"Sent to conn {conn_id}: {response}")# Remove processed data from bufferbuffer = buffer[data_start + data_len:]time.sleep_ms(10) # Faster polling for UART data# Main program
try:if init_esp8266():# Replace with your WiFi credentialsif connect_wifi("CMCC-308", "165123308"):if start_tcp_server():handle_tcp_communication()
except Exception as e:print("Error:", e)
PC 测试请求
import socket
import time# ESP8266 IP and port
ESP8266_IP = "192.168.1.12" # Update with actual IP from AT+CIFSR
PORT = 12345def tcp_client():# Create socketclient = socket.socket(socket.AF_INET, socket.SOCK_STREAM)client.settimeout(10.0) # Increase timeout to 10 secondstry:# Connect to ESP8266client.connect((ESP8266_IP, PORT))print(f"Connected to {ESP8266_IP}:{PORT}")# Send test messagetimestamp = int(time.time())message = f"msg:{timestamp} hello world."client.send(message.encode('utf-8'))print("Sent:", message)# Receive responsedata = client.recv(1024)print("Received:", data.decode('utf-8'))except Exception as e:print("Error:", e)finally:client.close()print("Connection closed")if __name__ == "__main__":tcp_client()
运行结果
python .\pc_client.py
Connected to 192.168.1.12:12345
Sent: msg:1746379223 hello world.
Received: Echo: msg:1746379223 hello world.
Connection closed
Initializing ESP8266...
AT OK
Connecting to WiFi...
WiFi connected
IP info: AT+CIFSR
+CIFSR:STAIP,"192.168.1.12"
+CIFSR:STAMAC,"40:91:51:4b:b6:55"OKStarting TCP server...
TCP server started on port 12345
Listening for messages...
Received from conn 0: msg:1746379223 hello world.
Sent to conn 0: Echo: msg:1746379223 hello world.
相关文章:
2025 年最新树莓派 Pico 连接 ESP8266 模块实现 WiFi 通信、搭建 TCP 服务器实现数据交互详细教程
AT 指令基本结构概述 AT 指令最初由 Hayes 公司为其调制解调器(modem)开发,目的是提供一种标准化的方式来控制通信设备。最早的 Hayes Smartmodem 300 调制解调器(1981年)引入了这一指令集,因此 AT 指令也…...
java类=null的回收
在Java(或类似使用垃圾回收的语言)中,当你执行 a null 后,对象 B() 是否会被回收取决于是否还有其他引用指向它。具体分析如下: 关键点: 引用链分析: 初始时:a 引用了 A 实例&#…...
2025系统架构师---论面向对象的软件设计
摘要 自“软件危机”出现过后,工程化软件开发方法不断发展,采用什么方法对大 规模软件进行设计并保证软件的质量。在这样背景下,人们开始从面向数据流过 程开发法中不断思考,进而引入对象的概念。对象是数据与行为的封装&#…...
如何判断node节点是否启用cgroup?
要判断 Linux 节点是否启用了 cgroup(Control Groups),可以通过以下方法验证: 方法 1:检查 /proc/cgroups 文件 查看内核支持的 cgroup 子系统列表: cat /proc/cgroups 输出说明: 若文件不存…...
学习黑客Nmap 实战
金丹期第三重 — Debian 12 实战:Nmap 全流程探秘 testhtml5.vulnweb.com 晋阶宣言 本章彻底补完前面“只扫到 80/443 却没识别 nginx 版本”的缺憾。 道友将依次完成 快速侦查 → 深度洞察 → NSE 弱点扫描 三连招,并学会用 -sV、-Pn、--script-trace 等…...
AD创建元件符号
在创建好工程文档之后打开SCH Library 创建工程的方法:AD创建一个工程文档-CSDN博客 这里以创建一个电容符号为例子,先创建引脚,画引脚的时候要把网格尺寸设置为100mil AD原理图怎么改网格尺寸-CSDN博客 放置好引脚之后绘制元素࿰…...
第六章:6.1 ESP32教学:多任务处理与FreeRTOS实战
一、FreeRTOS简介 ESP32内置了FreeRTOS实时操作系统内核,这是一个专为嵌入式系统设计的开源实时操作系统。它支持: 多任务并行处理 任务优先级管理 内存管理 任务间通信 定时器管理 二、任务创建与管理 1. 任务创建(xTaskCreate&…...
Python生活手册-正则表达式:从快递单到咖啡订单的文本魔法
一、快递单号识别术(基础匹配) 1. 数字猎人(\d) 想象你有一叠快递单需要自动识别: import re快递单 "【顺丰】单号:SF123456789 签收人:张先生" 单号 re.search(r"SF\d&quo…...
Windows 自带删除缓存
Temp临时文件文件夹手动除 Windows键R 快速打开运行输入%temp%,其下所有文件删除 打开储存感知 打开「设置」→「系统」→「存储」,点击右侧面板中的「配置存储感知或立即运行」。将弹出页拉至最下方,勾选其中的「删除以前版本的 Windows」,再…...
Linux电源管理(6)_Generic PM之挂起功能
原文链接:Linux电源管理(6)_Generic PM之挂起功能 1.前言 Linux内核提供了三种暂停方式:Freeze,Standby和STR(暂停到RAM),在用户空间向” / sys / power / state”文件分别写入“ …...
MCP原理详解及实战案例(动嘴出UI稿、3D建模)
文章目录 MCP 原理介绍架构核心组件协议层传输层连接生命周期MCP与function calling: 互补关系 MCP python SDKMCP的优点 怎么用MCP:天气服务参考应用项目: REF 24年11月份,claude推出了模型上下文协议( MCP),作为一种潜在的解决方案…...
【Java项目脚手架系列】第二篇:JavaWeb项目脚手架
【Java项目脚手架系列】第二篇:JavaWeb项目脚手架 前言 在Java Web开发中,一个好的项目脚手架可以大大提高开发效率,减少重复工作。本篇文章将介绍一个基于Maven的JavaWeb项目脚手架,它包含了基础的Web开发配置和常用功能。 什…...
【机器学习-线性回归-5】多元线性回归:概念、原理与实现详解
线性回归是机器学习中最基础且广泛应用的算法之一,而多元线性回归则是其重要扩展。本文将全面介绍多元线性回归的核心概念、数学原理及多种实现方式,帮助读者深入理解这一强大的预测工具。 1. 多元线性回归概述 1.1 什么是多元线性回归 多元线性回归(…...
《TCP/IP详解 卷1:协议》之第十章:动态选路协议
目录 一、常见的动态路由协议 二、RIP 1、RIP 版本1: 1.1、报文格式 2、RIP 版本2: 2.1、报文格式 三、OSPF 1、链路状态路由协议 2、工作原理 3、OSPF的特点 四、BGP 五、参考链接 一、常见的动态路由协议 路由协议(Routing Pr…...
逆向常见题目—迷宫类题目
逆向常见题目—迷宫类题目 迷宫(maze) 思路: 1.找到地图(字符串) 2.找到方向(上左下右) 3.找到起点到终点 然后将路径输出即可 特征: 标题,hint为maze 或者 看到字符串###等等 整理字符串为图形.py (要是不是正方形需要自己输出行和列) import mathdef arra…...
Redis 数据类型详解(二):Hash 类型全解析
文章目录 一、什么是 Redis 的 Hash 类型?二、Hash为什么在有些时候比String好用三、常见命令1.HSET key field value2.HGET key field3.HMSET4.HMGET5.HGETALL6.HKEYS7.HVALS8.HINCRBY9.HSETNX 四、应用场景五、性能优势六、注意事项总结 提示:以下是本…...
Vite简单介绍
Vite 是一个现代化的前端构建工具,由 Vue.js 的创始人 Evan You 开发,旨在提供更快的开发体验和更高效的构建流程。它的名字来源于法语单词“vite”,意为“快速”,这也反映了它的核心优势——极速的冷启动和热模块替换(…...
jwt身份验证和基本的利用方式
前言 : 什么是jwt(json web token)? 看看英文单词的意思就是 json形式的token 他的基本的特征 : 类似于这样的 他有2个点 分割 解码的时候会有三个部分 头部 payload 对称密钥 这个就是对称加密 头部&am…...
基于YOLOv的目标检测训练数据构建方法研究—图像采集、标注、划分与增强一体化流程设计
在目标检测任务中,高质量的训练数据是模型性能提升的关键。本文围绕 YOLOv 系列模型,系统性地研究了目标检测训练数据的构建方法,提出了一套从图像采集、标注、数据集划分到数据增强的一体化流程设计 。通过多源图像采集策略确保样本多样性&a…...
c++类【开端】
运算符重载 方式:operator运算符(参数列表){}。 运算符就是:-*/[]等。 运算符重载,和定义一个方法效果是一样的,只是,重载运算符让类的-*/等操作看起来和普通数字的-*/一样。仅是看起来一样。我们重载运算符…...
wordperss AI插件:AI图文+视频+长尾关键词自动生成,已内置deepseek、kimi全模型,支持简单一键接入更多自定义API
【2.17最新版】Linkreate wordperss AI插件:AI图文视频长尾关键词自动生成,已内置deepseek、kimi全模型。 支持自定义接入其它API,包括但不限于腾讯云API和它的deepseek模型 后台只需要设置对应的API url 、模型 、API key,就可以让插件调用…...
【免费分享无广告】刷视频助手抖音快手小红书视频号自动脚本刷视频养号
养号可做极速版刷视频任务支持最新版软件 【资 源 名 称】刷视频助手 【资 源 版 本】1.0.2 【资 源 大 小】11.66M 【资 源 系 统】安卓 【资 源 介 绍】刷视频养号助手,操作简单,就一个页面。亲测无广纯净,打开即用 ———————————…...
Javascript大致框架
一、JavaScript简介 JavaScript,简称JS,是一种高级的、解释型的编程语言,主要用于为网页添加动态功能。它最初由Netscape公司于1995年推出,最早名为LiveScript,后更名为JavaScript。尽管名字中带有“Java”࿰…...
Linux 权限
目录 一、Linux 权限概念 1.1 用户 1.2 用户切换 1.3 sudo指令提权 1.4 文件访问者的分类(人) 1.5 文件类型和访问权限(事物属性) 1.6 文件访问权限和相关设置方法 1) chmod 2)chown 3)chgrp 二…...
linux stm32mp157 GIC-V2 中断处理过程分析
/* ** 中断触发时,调用的 handle_arch_irq 入口地址。 ** 因为此时,挂接的就是 gic_handle_irq 函数!gic_handle_irq 是个全局函数指针, ** static void __exception_irq_entry gic_handle_irq(struct pt_regs *regs) ** 它是Lin…...
Linux安装RTL8215网卡驱动
一、下载RTL8215驱动 下载地址:https://www.realtek.com/Download/ToDownload?typedirect&downloadid3763 二、安装编译工具 找一台能够访问互联网的linux服务器,下载对应的deb包 sudo apt-get install --download-only make gcc bzip2这将只下…...
用 Python 分析 IRIS 数据集:概率论与数理统计实战教程
一、引言 在数据科学的世界里,IRIS 数据集就像是一位常客,频繁出现在各种数据分析和机器学习的案例中。它包含 150 条记录,分属 Setosa、Versicolour、Virginica 这 3 种鸢尾花类别,每条记录还带有萼片长度、萼片宽度、花瓣长度、…...
QT6 源(79):阅读与注释表盘 QDial 的源码,其是基类QAbstractSlider 的子类,及其刻度线的属性举例
(1)源代码来自于头文件 qdial . h : #ifndef QDIAL_H #define QDIAL_H#include <QtWidgets/qtwidgetsglobal.h>#include <QtWidgets/qabstractslider.h>QT_REQUIRE_CONFIG(dial);QT_BEGIN_NAMESPACEclass QDialPrivate; class Q…...
Python 函数装饰器和闭包(闭包)
本章内容: Python 如何计算装饰器句法 Python 如何判断变量是不是局部的 闭包存在的原因和工作原理 nonlocal 能解决什么问题 掌握这些基础知识后,我们可以进一步探讨装饰器: 实现行为良好的装饰器 标准库中有用的装饰器 实现一个参数化装饰器…...
linux种文件名usr的含义是什么?
在Linux操作系统中,/usr目录是一个核心且容易引发困惑的概念。它既承载着历史演变的痕迹,又在现代系统中承担着关键功能。本文将从定义、结构、历史演变及常见问题等角度,全面解析usr的含义及其在Linux中的作用。 一、usr的起源与定义 1. 词…...
2025年中国光电子器件产业链分析
中商情报网讯:光电子器件作为信息时代的“光子引擎”,正从通信领域向消费电子、工业、医疗等全场景渗透。未来,随着材料科学、光子集成技术的突破,光电子器件将进一步重塑人类的信息交互方式,成为数字经济的关键基础设…...
基于 jQuery 实现灵活可配置的输入框验证功能
在 Web 表单开发中,输入框验证是保障数据准确性和安全性的关键环节。无论是用户注册、信息提交还是数据录入场景,都需要对用户输入内容进行合法性检查。本文将介绍如何使用 HTML、CSS 和 jQuery 构建一个可灵活配置的输入框验证系统,轻松应对…...
GPU性能加速的隐藏魔法:Dual-Issue Warp Schedule全解析
一、先来点"前菜":什么是Warp Schedule? 想象你是一个GPU的老板(比如NVIDIA老黄),手下有几万个"线程员工"要管理。直接让几万人同时开会?那得疯。于是你发明了"Warp"&#…...
无人机 | 无人机设计概述
无人机设计是一个复杂的系统工程,涉及空气动力学、电子技术、材料科学、控制算法等多个领域的综合应用。以下是无人机设计的主要模块和关键要素概述: 一、总体设计目标 任务需求定义 用途:航拍、物流、农业、军事侦察、环境监测等性能指标&am…...
电子邮件相关协议介绍
0 Preface/Foreword 1 协议介绍 电子邮件包含的主要协议: SMTPPOPIMAP 1.1 SMPT SMPT: Simple Mail Transfer Protocol,电子邮件传输的标准协议,负责将邮件从发送方传输到接收方邮件服务器。 1.2 POP POP: Post Office Protoc…...
标题:试验台铁地板:革新之路
在铁路行业中,地板是一项至关重要的元素,直接关系到列车的安全、舒适性以及使用寿命。近年来,试验台铁地板的开发和应用成为了铁路行业的热门话题之一。试验台铁地板的出现标志着铁路行业在技术创新方面迈出了重要的一步。本文将从试验台铁地…...
【C++】grpc(一):安装
因为接触了一些第三方项目和其他原因,我需要了解一些 RPC 相关的知识,首选的就是 Google 的 gRPC 库了。 安装 依然是使用WSL,发行版为Ubuntu 22.04.5 LTS gRPC的官网如下:https://grpc.org.cn/docs/languages/cpp/quickstart/…...
精益数据分析(41/126):深入解读移动应用商业模式的关键指标与策略
精益数据分析(41/126):深入解读移动应用商业模式的关键指标与策略 在创业与数据分析的学习征程中,我们不断探索不同商业模式的核心要点,以挖掘其中的商业价值。今天,我依旧带着与大家共同进步的初心&#…...
Python字符串全解析:从基础操作到高级应用的技术指南
引言 Python字符串作为编程领域的核心数据类型,其丰富的操作方法直接影响代码效率和可维护性。本文基于Python 3.10环境,结合工程实践中的高频需求,深度解析12类字符串操作技术,涵盖驻留机制、高效查询、编码…...
直方图反向投影
目录 一、概念 二、OpenCV C实现 2.1 基础实现代码 2.2 优化实现(带遮罩) 三、应用场景 3.1 目标跟踪 3.2 图像分割 3.3 工业检测 四、性能优化技巧 一、概念 直方图反向投影(Histogram Back Projection)是一种基于概率的图…...
TCP/IP协议深度解析:从分层架构到TCP核心机制
TCP/IP协议深度解析:从分层架构到TCP核心机制 一、TCP/IP协议族架构与核心概念 1. 协议族四层架构概述 TCP/IP是互联网的基础架构,采用四层分层模型,每层分工明确,协同实现网络通信: 层次核心功能关键协议/技术典…...
【动态规划】子序列问题
个人主页 : zxctscl 专栏 【C】、 【C语言】、 【Linux】、 【数据结构】、 【算法】 如有转载请先通知 文章目录 前言1 300. 最长递增子序列(经典)3.1 分析3.2 代码 2 376. 摆动序列2.1 分析2.2 代码 3 673. 最长递增子序列的个数3.1 分析3.…...
【C++】什么是头文件?
在 C 中,头文件(通常以 .h 或 .hpp 为扩展名)是用于声明类、函数、变量、宏和其他代码结构的文件。头文件的主要目的是提供接口定义,使得这些声明可以在多个源文件(.cpp 文件)中共享,从而避免重…...
shell(9)
流程控制(if) 1.if判断 i.基本语法(单分支) if [ 条件判断式 ] then 代码 fi ii.基本语法(多分支) if [ 条件判断式 ] then 代码 elif [ 条件判断式 ] 代码 ...... fi 注意事项:[ 条…...
Java设计模式: 工厂模式与策略模式
Java设计模式: 工厂模式与策略模式 在软件开发领域,设计模式是一种可重复使用的解决方案,用来解决常见的设计问题。工厂模式和策略模式是常用的设计模式之一,它们能够帮助开发人员更好地组织和管理代码,提高代码的可维护性和可扩展…...
大模型微调Fine-tuning:从概念到实践的全面解析
目录 引言 一、什么是大模型微调? 1.1 预训练与微调的区别 1.2 微调的技术演进 二、为什么需要微调? 2.1 解决大模型的固有局限 2.2 微调的优势 三、主流微调方法 3.1 全参数微调 3.2 参数高效微调(PEFT) 四、微调实践指…...
5月5日日记
今天是假期的最后一天,早上爽睡到11点起床。其实九点多就醒了,但是不愿意起来,睡了俩小时又。起来之后就点了外卖,西红柿打卤面两个卤蛋,11块钱很实惠。 起来之后洗袜子,简单策划了一下红色合唱。 给电动…...
TopK题-快速选择方法
代码 class Solution {public int findKthLargest(int[] nums, int k) {//k 就是对应的是下标 n - k 的位置 也就是说我们要的是下标n-k的元素return quickselect(nums, 0, nums.length - 1, nums.length - k);}public int quickselect(int[] nums, int left, int right, int …...
【SpringBoot篇】详解短信验证码登录功能实现
一:需求分析与设计 1.1 发送短信验证码 (1)产品原型 (2)业务逻辑 (3)接口设计 1.2 短信验证码登录 (1)业务逻辑 …...
深入理解 Bash 中的 $‘...‘ 字符串语法糖
在 Bash 脚本编程中,字符串处理是不可或缺的一部分。为了让开发者更高效地处理特殊字符和控制字符,Bash 引入了一种独特的字符串语法糖:$(带单引号的 ANSI-C 风格字符串)。这种语法来源于 C 语言的 ANSI-C 标准&#x…...