基于CircuitPython的红外遥控发射器:从原理到实现的万能控制方案

news2026/5/16 12:20:32
1. 项目概述打造你的万能红外遥控发射器搞嵌入式开发的朋友对红外遥控肯定不陌生。家里电视、空调、风扇的遥控器本质上都是一个红外信号发射器。你有没有想过自己动手做一个能模拟所有遥控器的“万能发射器”今天我就来分享一个基于CircuitPython的实现方案。这个项目不仅能让你彻底理解红外遥控的底层原理更能让你亲手打造一个可编程、能学习、能发射的硬件工具无论是用来控制智能家居设备还是进行产品原型测试都非常实用。整个项目的核心是利用一块支持CircuitPython的开发板比如Adafruit的Feather系列或QT Py配合一个红外发射LED通过代码精确地生成各种红外遥控协议所需的脉冲信号。听起来有点复杂别担心我会把每一步的原理、代码和踩过的坑都讲清楚。你最终会得到一个可以存储多种遥控编码、通过按钮一键发射的便携设备。下面我们就从最基础的原理开始拆解。2. 红外遥控原理与硬件选型解析2.1 红外通信的核心调制与解调红外遥控不是简单地把红外LED点亮和熄灭。环境中有大量的红外干扰源比如阳光、白炽灯。为了可靠通信工程师们想出了“调制”的办法。你可以把它想象成用摩斯电码发信号但手电筒本身还在以极高的频率闪烁只有能看懂这个特定闪烁频率的接收器才知道你在“说话”。这个特定的闪烁频率就是载波频率最常见的是38kHz。这意味着红外LED会以每秒38000次的频率闪烁。我们要发送的数据比如“开机”指令通过改变这个高频闪烁的“有”和“无”的持续时间来编码。接收头内部有一个带通滤波器只对38kHz附近的光信号敏感这样就完美避开了环境光的干扰。在代码里我们使用PWM脉冲宽度调制来生成这个38kHz的载波。PWM通常用来模拟模拟电压但在这里我们把它当作一个高速开关精确控制红外LED的通断频率。2.2 硬件清单与连接要点你需要准备以下硬件支持CircuitPython的开发板如Adafruit Feather RP2040、QT Py RP2040或ESP32-S3。选择它们是因为CircuitPython对硬件抽象做得很好pulseio库稳定。红外发射LED注意是“发射”管通常是透明或蓝紫色的。别买成黑色的红外接收头。型号如TSAL6200。限流电阻红外LED工作电流较大通常在100mA以上必须串联一个电阻保护LED和主板GPIO。根据你的电源电压通常是3.3V和LED正向电压约1.2V计算。例如目标电流150mA电阻值 R (3.3V - 1.2V) / 0.15A ≈ 14欧姆选择一个10-20欧姆、1/4瓦的电阻即可。其他可选按钮用于触发滑动开关选择模式一个普通LED和蜂鸣器用于状态反馈。连接方式非常简单红外LED的阳极长脚通过限流电阻连接到开发板指定的REMOTEOUT引脚或任何一个支持PWM输出的GPIO如board.A2。阴极短脚接地。按钮一端接GPIO如board.A0另一端接地并在代码中启用内部下拉电阻。注意红外LED的驱动电流很大远超单个GPIO引脚通常能提供的电流约20mA。像Adafruit Feather这样的板子其REMOTEOUT引脚通常直接连接到一个晶体管开关电路上由板载电源直接供电GPIO只提供控制信号。如果你用的是普通GPIO务必使用一个NPN三极管如2N2222或MOSFET来驱动红外LED否则极易烧毁主控芯片这是第一个也是最重要的坑。2.3 协议纷争NEC、RC-5、Sony与原始脉冲不同品牌的设备使用不同的编码协议。主要区别在于逻辑“0”和“1”的定义例如NEC协议用560us的载波脉冲560us的空闲表示“0”用560us脉冲1690us空闲表示“1”。帧结构包括引导码一个长脉冲、地址码、命令码、反码以及结束符。载波频率虽然38kHz是主流但有些设备用36kHz、40kHz或56kHz。我们的方案采用了一种“原始脉冲记录”的通用方法。不关心高层协议只记录下红外接收头解码出来的、由一系列“高电平有载波持续时间”和“低电平无载波持续时间”交替组成的原始数组。发射时原样复现这个数组。这就像录音和放音兼容性最强。项目中提到的codes.txt文件存储的就是这种经过压缩处理的原始脉冲字典。3. CircuitPython代码深度剖析与实现3.1 环境搭建与库依赖首先确保你的开发板已经刷入了最新的CircuitPython固件。将板子通过USB连接到电脑它会显示为一个名为CIRCUITPY的U盘。在这个盘的根目录下你需要有以下几个文件code.py主程序文件CircuitPython会自动运行它。codes.txt存储红外编码数据的文件。lib文件夹里面需要放置必要的库文件。本项目核心依赖pulseio库它通常是CircuitPython内置的。但为了更稳定建议从CircuitPython库捆绑包中确认并获取最新版本。codes.txt文件的数据从哪里来你需要另一个“红外学习”项目或者使用现成的解码库如adafruit_irremote先将遥控器的信号解码并保存下来。由于篇幅所限本文聚焦于发射端。你可以先从网上找到一些常见设备如NEC协议的电视的脉冲数组示例手动构造一个codes.txt文件进行测试。3.2 核心代码逐行解读让我们结合你提供的代码片段深入理解每一个部分。初始化硬件import board import digitalio import pulseio import time import array # 初始化按钮A和B配置为输入并启用内部下拉电阻。 # 这意味着当按钮未按下时引脚被拉低值为False按下时连接到高电平值为True。 button_a digitalio.DigitalInOut(board.A0) button_a.direction digitalio.Direction.INPUT button_a.pull digitalio.Pull.DOWN button_b digitalio.DigitalInOut(board.A1) button_b.direction digitalio.Direction.INPUT button_b.pull digitalio.Pull.DOWN # 初始化模式开关、状态LED和蜂鸣器 switch digitalio.DigitalInOut(board.A3) switch.direction digitalio.Direction.INPUT switch.pull digitalio.Pull.UP # 假设开关拨到一端接高电平另一端通过电阻接地 led digitalio.DigitalInOut(board.LED) led.direction digitalio.Direction.OUTPUT spkr digitalio.DigitalInOut(board.A2) # 假设这个引脚连接蜂鸣器 spkr.direction digitalio.Direction.OUTPUT创建PWM和脉冲输出对象# 关键步骤创建PWM输出对象。 # 使用board.REMOTEOUT如果板子有专用引脚或任意支持PWM的GPIO。 # frequency38000是初始载波频率。 # duty_cycle2**15 设置占空比为50%对于16位精度32767/65535 ≈ 50%。50%占空比的方波驱动LED效率较高。 # variable_frequencyTrue 至关重要它允许我们在运行时动态改变频率以适配不同协议的设备。 pwm pulseio.PWMOut(board.REMOTEOUT, frequency38000, duty_cycle2**15, variable_frequencyTrue) # PulseOut对象是真正的“发射器”。它接收一个PWM源pwm和一个脉冲序列数组 # 然后按照序列交替地开启和关闭PWM输出从而生成精确的红外波形。 pulse pulseio.PulseOut(pwm)主循环逻辑while True: # 等待任意按钮被按下。button_a.value or button_b.value在按下时为True。 while not (button_a.value or button_b.value): pass # 空循环等待 time.sleep(0.5) # 按下后等待500毫秒。这是一个“防抖”和“对齐”的延迟。 # 防止误触发也给用户一个准备时间确保发射时遥控器对准设备。 # 打开存储编码的文件 with open(/codes.txt, r) as f: # 使用with语句确保文件最终被关闭比直接f.open()更安全。 for line in f: # 使用eval()将文本行转换回Python字典。这是便捷但存在安全风险的做法。 # 前提是你必须完全信任codes.txt文件的内容。切勿从不可信来源加载此文件。 code eval(line.strip()) # .strip()去掉首尾空白字符 print(Transmitting:, code.get(name, Unnamed code)) # 打印调试信息 # 根据开关状态选择用LED还是蜂鸣器指示发射状态 if switch.value: led.value True else: spkr.value True # 解析重复参数。有些信号如长按音量键需要连续发送多次。 repeat code.get(repeat, 1) # 默认重复1次 delay code.get(repeat_delay, 0) # 重复之间的延迟单位秒 # 解码脉冲序列。为了节省存储空间原始脉冲可能被压缩存储。 # table是一个列表里面是多个小的脉冲对数组。 # index是一个列表其元素是table的索引按顺序拼起来就是完整脉冲。 table code[table] pulses [] for idx in code[index]: pulses.extend(table[idx]) # 将脉冲片段扩展到总列表中 # 通常最后一个脉冲是长时间的低电平停止位发射时不需要所以移除。 pulses.pop() # **核心发射步骤** # 1. 动态设置PWM频率为该编码对应的载波频率如38kHz, 36kHz。 pwm.frequency code[freq] # 2. 将Python列表转换为C语言风格的array.array(H, pulses)H表示无符号短整型提高pulseio处理效率。 # 3. 调用pulse.send()发送脉冲序列并根据需要重复。 for i in range(repeat): pulse.send(array.array(H, pulses)) if i repeat - 1: # 如果不是最后一次重复则等待指定延迟 time.sleep(delay) # 发射完毕关闭指示灯 led.value False spkr.value False # 等待该组编码定义的整体延迟再准备读取下一行下一个编码 time.sleep(code[delay])重要提示eval()函数的使用。在最终产品中如果编码文件来自不可控来源这非常危险因为它会执行文件中的任意Python代码。一个更安全的替代方案是使用json.loads()来解析格式化的JSON字符串。你需要将codes.txt的每一行存储为JSON格式例如{freq: 38000, table: [[...]], index: [0,1], delay: 0.1}然后在代码中使用code json.loads(line)。我强烈建议你这样做。3.3codes.txt文件格式详解理解这个文件格式是成功的关键。它存储的是经过压缩的脉冲数据。一个典型的条目看起来像这样为了可读性进行了格式化实际文件可能是一行{freq: 38000, delay: 0.1, name: TV_Power, table: [[9000, 4500], [560, 560], [560, 1690]], index: [0, 1, 1, 0, 1, 0, ...]}freq: 载波频率单位Hz。delay: 发射完这个信号后需要等待多长时间秒才能处理下一个信号。用于模拟连续按键之间的合理间隔。name: 编码名称方便识别。table: 一个“脉冲对”查找表。每个元素是一个包含两个整数的列表[high_time, low_time]单位通常是微秒。例如[9000, 4500]可能代表NEC协议的9ms高电平和4.5ms低电平的引导码。index: 一个整数列表。每个整数是table列表的索引。通过按顺序拼接table[index[i]]对应的脉冲对就还原出了完整的原始脉冲序列。这种“索引化”存储对于像NEC这样只有几种固定脉冲模式的协议能极大减少存储空间占用。4. 实战从信号捕获到成功发射全流程4.1 步骤一捕获红外信号要填充你的codes.txt首先需要捕获信号。你有两个选择使用现成的解码脚本在另一个CircuitPython设备上连接一个红外接收头如VS1838B运行adafruit_irremote库中的示例代码irremote.py。按下遥控器它会在串行终端REPL打印出捕获到的原始脉冲数组。把这个数组记录下来。使用逻辑分析仪或示波器这是最专业的方法。将红外接收头的信号输出引脚接到逻辑分析仪通道按下遥控器你就能看到精确的波形和脉冲时间宽度。这种方法能获得最准确的数据。假设我们捕获到一个NEC协议的“电源”键原始脉冲单位微秒[9000, 4500, 560, 560, 560, 560, 560, 1690, 560, 560, 560, 560, 560, 560, 560, 560, 560, 1690, ...](后续还有地址码、命令码等)。4.2 步骤二压缩并格式化编码数据观察这个数组发现只有几种时间模式900045005601690。它们成对出现。我们可以这样构建table和indextable [[9000, 4500], [560, 560], [560, 1690]]// 索引012分别代表三种脉冲对。原始脉冲数组可以表示为这些索引的序列。我们需要两两一组地看(9000,4500)是索引0(560,560)是索引1(560,1690)是索引2... 所以index就是从数组开头开始每两个数看成一个脉冲对然后在table中找到其对应的索引号组成的列表。手动做这个转换比较繁琐你可以写一个小的Python脚本在电脑上完成。脚本读取原始脉冲数组自动识别独特的脉冲对生成table并输出对应的index列表和最终的数据字典。4.3 步骤三烧录与测试将生成的字典一行一个写入到CIRCUITPY盘根目录下的codes.txt文件中。修改code.py将按钮A映射到第一行编码比如电视开关按钮B映射到第二行编码比如音量加。给设备上电打开串行监视器如Mu编辑器、Thonny或screen /dev/ttyACM0。按下按钮你应该能看到打印出的编码信息同时红外LED会闪烁肉眼不可见但用手机摄像头能看到紫色光点。将发射器对准你的电视按下按钮电视应该会有反应4.4 性能优化与调试技巧发射距离短这是最常见的问题。首先确保红外LED的驱动电流足够大。使用三极管驱动并尝试减小限流电阻但不要低于计算值太多防止过流。其次红外LED有指向性要对准设备的接收窗。最后有些接收头对频率非常敏感尝试微调pwm.frequency比如从37900到38100之间调整。设备无反应检查频率确认目标设备使用的载波频率。有些空调或小众品牌可能用36kHz或40kHz。检查脉冲精度pulseio库的时序基于系统时钟非常精确。但如果你手动测量的原始脉冲时间有误差可能导致解码失败。尝试将捕获到的脉冲时间四舍五入到最接近的10或50微秒。检查编码协议确保你捕获的是完整的、正确的信号。有些协议有复杂的头部和校验。使用逻辑分析仪捕获的波形最可靠。添加引导码有些协议需要很长的引导码如NEC的9ms确保你的脉冲数组里包含了它。功耗问题红外LED发射时电流很大。如果使用电池供电发射间隙长按按钮会导致电池快速耗尽。在代码中确保指示灯LED/蜂鸣器只在发射瞬间点亮并尽快进入低功耗的等待循环。5. 进阶应用与扩展思路5.1 构建红外信号学习器将本项目与红外接收头结合就能升级为一个“学习型”万能遥控。基本思路是增加一个“学习模式”按钮。当处于此模式时设备用pulseio.PulseIn监听红外接收头引脚记录下高电平/低电平的持续时间并将其压缩、格式化然后追加写入到codes.txt文件中。这样你就可以用物理遥控器对着它按一下自动完成信号捕获和存储。5.2 集成网络控制对于像ESP32-S2/S3这样带有Wi-Fi的开发板你可以轻松地为其添加Web服务器或MQTT客户端功能。这样一来你的红外发射器就变成了一个网络红外网关。你可以通过手机APP、网页或者Home Assistant、Node-RED这样的家庭自动化平台发送指令给ESP32再由它控制红外设备。这实现了传统红外设备的智能化改造。5.3 创建宏与场景利用多个编码和延迟你可以编写复杂的“宏”。例如一个“观影模式”宏可以依次发送投影仪开机等待10秒- 幕布下降等待5秒- 功放开机等待3秒- 输入源切换。只需将这些编码按顺序写入codes.txt并设置合理的delay参数然后用一个按钮触发读取文件中的所有行依次发射即可。5.4 使用外部存储当需要存储成百上千个红外编码时板载闪存可能不够用。你可以为支持它的板子如Feather RP2040添加一个SPI或I2C接口的SD卡模块或Flash芯片将庞大的codes.txt数据库存放在外部存储器中通过文件系统API进行读取。6. 常见问题与排查实录在实际制作过程中我遇到了不少问题这里总结一个速查表希望能帮你少走弯路。问题现象可能原因排查与解决方法按下按钮无任何反应REPL无输出1. 代码未运行。2. 按钮接线或配置错误。3. 开发板死机。1. 检查code.py文件名是否正确REPL是否有错误信息。2. 用万用表测量按钮按下时GPIO电压是否从0V变为3.3V。检查代码中button.pull设置是否正确按下时应为value为True。3. 尝试硬件复位。REPL有打印信息但红外设备不响应1. 红外LED未工作或接反。2. 载波频率错误。3. 脉冲数据错误或格式不对。4. 发射功率不足。1. 用手机摄像头观察发射时LED是否闪烁呈淡紫色。检查LED极性。2. 确认code[freq]值尝试微调±1kHz。3. 打印pulses数组检查其长度和数值是否合理应为微秒级。对比原始捕获数据。4. 检查驱动电路确保LED有足够电流100mA。对准接收头距离拉近至10厘米内测试。设备偶尔响应不稳定1. 电源干扰。2. 环境光干扰强。3. 时序存在微小抖动。1. 尝试用电池供电或为开发板并联一个100uF的电解电容。2. 避开直射阳光或强白炽灯。确保发射和接收之间没有障碍物。3. CircuitPython的时序在复杂任务中可能被中断。尝试在发射关键循环期间禁用中断高级操作需谨慎。或简化主循环逻辑。发送复杂信号时系统崩溃1. 内存不足。2.pulses数组过大。1. CircuitPython内存有限。优化代码减少全局变量。对于极长的脉冲序列如某些空调协议考虑分段发送或使用更高效的压缩方式。2. 检查pulses数组长度。如果超过几千个元素可能超出处理能力。无法打开codes.txt文件1. 文件不存在或路径错误。2. 文件系统损坏。1. 确认文件在CIRCUITPY根目录且名为codes.txt。在REPL中执行import os; print(os.listdir(/))查看。2. 安全弹出U盘后重新拔插或重新刷写CircuitPython固件。最后关于功耗我想再强调一下。这个项目在待机时功耗极低主要耗电在发射瞬间。如果你打算用电池长期供电务必在代码中将不用的外设如模拟数字转换器ADC关闭并考虑让MCU在等待按钮时进入轻睡眠模式如果固件支持。实测一个容量为2000mAh的锂电池如果每天发射几十次续航几周是没问题的。

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…