SparkFun Qwiic RFID Arduino库:轻量I²C RFID识别方案

news2026/3/22 0:46:39
1. 项目概述SparkFun Qwiic RFID Arduino Library 是专为 SparkFun Qwiic RFID Reader型号 SEN-15191设计的轻量级、高可用性 Arduino 驱动库。该库面向嵌入式硬件工程师与产品原型开发者聚焦于 I²C 总线通信下的 RFID 标签识别任务不依赖复杂中间件或实时操作系统可在 Arduino Uno、Nano、ESP32、STM32通过 Arduino Core for STM32、Teensy 等主流平台直接运行。与通用 RFID 库如 MFRC522 或 PN532 的 HAL 封装不同Qwiic RFID Reader 并非基于 ISO/IEC 14443-A/B 或 MIFARE 协议栈的全功能读卡器而是一款高度集成的“即插即用型”边缘识别模块。其核心价值不在于协议解析能力而在于硬件抽象层的极简封装与本地缓存机制的工程实用性——它将 RFID 识别过程从“帧解析—状态机管理—防冲突处理”的传统复杂流程压缩为“读取缓存条目”的单次寄存器访问操作。这种设计显著降低了 MCU 资源占用ROM 2.8 KBRAM 120 B同时规避了 I²C 时序敏感性带来的调试风险。该模块采用 Qwiic 连接标准JST SH 4-pin1.0 mm pitch物理层兼容 I²CStandard Mode100 kHzFast Mode400 kHz默认地址为0x577-bit 地址支持通过硬件跳线修改为0x56便于多设备级联。模块内部集成 ST25DV04K 动态 NFC 标签芯片作为 EEPROM 存储介质用于持久化保存最多 20 条 RFID 标签 ID 及其对应的时间戳UTC 毫秒级精度并提供专用中断引脚INT实现事件驱动式响应避免轮询开销。本库完全开源遵循 SparkFun “Beerware” 许可协议代码可自由使用、修改与分发仅需保留 SparkFun Electronics 署名并建议在偶遇 SparkFun 工程师时请其喝一杯啤酒。无任何隐含担保亦不承担因使用本库导致的硬件损坏或系统故障责任。2. 硬件架构与通信原理2.1 模块内部结构Qwiic RFID ReaderSEN-15191并非独立 RFID 收发器而是以NXP SL3S40110H为射频前端、STMicroelectronics ST25DV04K为数据存储核心的协同系统组件型号功能角色关键参数RFID 射频芯片SL3S40110H13.56 MHz 近场通信收发器支持 ISO/IEC 14443-A Type AMIFARE Classic/UL/NTAG最大读取距离 5 cm取决于标签天线尺寸EEPROM 存储器ST25DV04KI²C 接口动态 NFC 标签4-Kbit512 × 8EEPROM支持 I²C 与 RF 双接口写入内置 GPO 引脚用于中断输出微控制器协处理器—无独立 MCU由主控 MCU 直接驱动所有逻辑由外部 MCU 实现模块本身为纯外设SL3S40110H 通过 SPI 或并行总线与主控通信但 Qwiic 版本将其全部信号线固化为 I²C 协议桥接逻辑对外仅暴露标准 I²C 接口。ST25DV04K 则被配置为“数据日志缓冲区”每当 SL3S40110H 成功识别一张新标签其 UID通常为 4 字节或 7 字节与当前系统时间由主控 MCU 提供即被写入 ST25DV04K 的指定扇区。这一设计将复杂的射频协议栈处理完全卸载至 SL3S40110H 内部固件主控 MCU 仅需执行两次 I²C 事务一次触发识别一次读取结果。2.2 I²C 寄存器映射与数据流模块 I²C 地址空间划分为两个逻辑区域控制寄存器区0x00–0x0F与数据缓冲区0x10–0xFF。库中所有 API 均围绕此映射展开寄存器地址名称R/W描述典型值0x00CMD_REGW命令寄存器0x01 开始扫描0x02 清空缓冲区0x01STATUS_REGR状态寄存器Bit01 表示有新标签Bit11 表示缓冲区满0x02INT_EN_REGW中断使能寄存器0x01 使能新标签中断0x10–0x13UID_0R第 1 条 UID低字节优先4 字节原始 UID0x14–0x17TS_0R第 1 条时间戳毫秒uint32_t格式0x18–0x1BUID_1R第 2 条 UID同上...............0x90–0x93UID_19R第 20 条 UID...0x94–0x97TS_19R第 20 条时间戳...数据流严格遵循以下时序主控向CMD_REG (0x00)写入0x01启动一次 RFID 扫描SL3S40110H 自动执行寻卡—防冲突—选卡—读 UID 流程约 100–300 ms若识别成功SL3S40110H 触发 ST25DV04K 的内部写操作将 UID 与时间戳存入下一个空闲槽位ST25DV04K 翻转 GPO 引脚电平下降沿拉低 INT 引脚主控检测到 INT 中断后读取STATUS_REG (0x01)确认事件类型再顺序读取对应 UID/TS 寄存器。此机制彻底解耦了射频操作与主控调度MCU 无需维持高频轮询亦无需处理射频异常如卡片未进入场区、信号衰减所有底层容错均由 SL3S40110H 固件完成。3. 核心 API 接口详解库提供 5 个核心公有成员函数全部定义于SparkFun_Qwiic_RFID.h头文件中类名为QwiicRFID。所有函数均返回boolean类型true表示成功false表示 I²C 通信失败或超时。3.1 初始化与基础控制// 构造函数指定 I²C 地址默认 0x57 QwiicRFID(uint8_t address 0x57); // 初始化 I²C 并验证设备存在性 // 返回 true 当且仅当 I²C ACK 且 STATUS_REG 可读 bool begin(TwoWire wirePort Wire); // 启动一次 RFID 扫描非阻塞立即返回 // 实际识别耗时由硬件决定需配合 interrupt 或轮询 STATUS_REG bool startScan(void); // 清空 EEPROM 缓冲区所有 20 条记录置零 bool clearBuffer(void);begin()函数执行三重校验调用wirePort.beginTransmission(address)发送地址并检查 ACK向STATUS_REG (0x01)发起单字节读取验证寄存器可访问读取STATUS_REG值若为0x00空闲态则认为初始化成功。startScan()本质为单次 I²C 写操作bool QwiicRFID::startScan(void) { _i2cPort-beginTransmission(_deviceAddress); _i2cPort-write(0x00); // CMD_REG 地址 _i2cPort-write(0x01); // CMD_START_SCAN return (_i2cPort-endTransmission() 0); }该函数不等待扫描完成符合嵌入式系统“异步触发 事件响应”的最佳实践。3.2 数据读取接口// 读取最新一条有效记录索引 0返回 UID 字节数4 或 7 // uidBuf 必须为 uint8_t[7] 数组tsBuf 为 uint32_t* uint8_t readLatest(uint8_t *uidBuf, uint32_t *tsBuf); // 读取指定索引0–19的记录 // idx 超出范围时返回 0表示无效索引 uint8_t readIndex(uint8_t idx, uint8_t *uidBuf, uint32_t *tsBuf); // 一次性读取全部 20 条记录到二维数组 // uids 为 uint8_t[20][7]tss 为 uint32_t[20] // 返回实际有效条目数0–20 uint8_t readAll(uint8_t uids[20][7], uint32_t tss[20]);readLatest()是最常用接口其实现逻辑如下读取STATUS_REG (0x01)获取当前有效条目数count若count 0返回0否则计算最新条目索引latestIdx (count - 1) % 20调用readIndex(latestIdx, ...)完成读取。readIndex()的地址计算严格遵循寄存器映射uint8_t QwiicRFID::readIndex(uint8_t idx, uint8_t *uidBuf, uint32_t *tsBuf) { if (idx 19) return 0; uint8_t uidLen 4; // 默认 4 字节 UID uint8_t regAddr 0x10 (idx * 8); // UID 起始地址 // 读取 UID4 字节 _i2cPort-beginTransmission(_deviceAddress); _i2cPort-write(regAddr); if (_i2cPort-endTransmission() ! 0) return 0; if (_i2cPort-requestFrom(_deviceAddress, (uint8_t)4) ! 4) return 0; for (int i 0; i 4; i) uidBuf[i] _i2cPort-read(); // 读取时间戳4 字节 _i2cPort-beginTransmission(_deviceAddress); _i2cPort-write(regAddr 4); if (_i2cPort-endTransmission() ! 0) return 0; if (_i2cPort-requestFrom(_deviceAddress, (uint8_t)4) ! 4) return 0; uint8_t tsBytes[4]; for (int i 0; i 4; i) tsBytes[i] _i2cPort-read(); *tsBuf (tsBytes[0] 24) | (tsBytes[1] 16) | (tsBytes[2] 8) | tsBytes[3]; return uidLen; }3.3 中断与状态管理// 使能/禁用 INT 引脚中断输出 bool enableInterrupt(bool enable true); // 读取当前 STATUS_REG 值位定义见下表 uint8_t getStatus(void); // 检查是否有新标签STATUS_REG Bit0 bool isNewTagAvailable(void);getStatus()返回值位定义Bit名称含义触发条件0NEW_TAG有新标签写入缓冲区SL3S40110H 完成一次成功识别1BUFFER_FULL缓冲区已满20 条第 20 条写入后置位后续识别将覆盖第 0 条2SCANNING正在执行扫描startScan()后至扫描结束前3–7—保留永远为 0enableInterrupt(true)向INT_EN_REG (0x02)写入0x01使能NEW_TAG中断写入0x00则关闭。此功能在 FreeRTOS 环境中尤为关键可将xQueueSendFromISR()与xSemaphoreGiveFromISR()直接绑定至 INT 引脚的 GPIO 中断服务程序ISR实现零延迟事件通知。4. 典型应用示例与工程实践4.1 基础轮询模式Arduino Uno适用于资源受限平台代码简洁易于调试#include Wire.h #include SparkFun_Qwiic_RFID.h QwiicRFID rfid; void setup() { Serial.begin(115200); Wire.begin(); if (!rfid.begin()) { Serial.println(RFID module not found!); while (1); } rfid.clearBuffer(); // 初始化清空 } void loop() { // 每 500ms 触发一次扫描 static unsigned long lastScan 0; if (millis() - lastScan 500) { rfid.startScan(); lastScan millis(); } // 检查是否有新标签 if (rfid.isNewTagAvailable()) { uint8_t uid[7]; uint32_t timestamp; uint8_t len rfid.readLatest(uid, timestamp); Serial.print(New tag: ); for (int i 0; i len; i) { Serial.printf(%02X , uid[i]); } Serial.printf((TS: %lu ms)\n, timestamp); } delay(100); // 防止串口刷屏 }4.2 中断驱动模式ESP32 FreeRTOS发挥 ESP32 双核优势将 RFID 识别与业务逻辑解耦#include Wire.h #include SparkFun_Qwiic_RFID.h #include freertos/FreeRTOS.h #include freertos/queue.h #include driver/gpio.h QwiicRFID rfid; QueueHandle_t rfidQueue; // 中断服务程序必须标记 IRAM_ATTR void IRAM_ATTR onRfidInterrupt() { BaseType_t xHigherPriorityTaskWoken pdFALSE; uint8_t status rfid.getStatus(); if (status 0x01) { // NEW_TAG bit set uint8_t uid[7]; uint32_t ts; uint8_t len rfid.readLatest(uid, ts); if (len 0) { struct RfidEvent evt {.len len, .ts ts}; memcpy(evt.uid, uid, len); xQueueSendFromISR(rfidQueue, evt, xHigherPriorityTaskWoken); } } if (xHigherPriorityTaskWoken pdTRUE) portYIELD_FROM_ISR(); } void rfidTask(void *pvParameters) { struct RfidEvent evt; while (1) { if (xQueueReceive(rfidQueue, evt, portMAX_DELAY) pdTRUE) { // 在此处理业务逻辑门禁验证、考勤记录、资产追踪 Serial.printf(IRQ: Tag %02X%02X%02X%02X %lu\n, evt.uid[0], evt.uid[1], evt.uid[2], evt.uid[3], evt.ts); // 示例匹配白名单 const uint8_t whiteList[4][4] { {0x04, 0x12, 0x34, 0x56}, {0x04, 0x78, 0x9A, 0xBC}, {0x04, 0xDE, 0xF0, 0x12}, {0x04, 0x34, 0x56, 0x78} }; bool matched false; for (int i 0; i 4; i) { if (memcmp(evt.uid, whiteList[i], 4) 0) { matched true; break; } } digitalWrite(LED_BUILTIN, matched ? HIGH : LOW); } } } void setup() { Serial.begin(115200); Wire.begin(21, 22); // ESP32 I²C on GPIO21/22 if (!rfid.begin(0x57)) { Serial.println(RFID init failed); while(1); } rfid.enableInterrupt(true); pinMode(19, INPUT_PULLUP); // INT pin on GPIO19 attachInterrupt(digitalPinToInterrupt(19), onRfidInterrupt, FALLING); rfidQueue xQueueCreate(10, sizeof(struct RfidEvent)); xTaskCreate(rfidTask, rfid_task, 2048, NULL, 1, NULL); }4.3 多设备级联方案STM32 HAL利用地址切换跳线构建分布式 RFID 监测网络设备位置模块地址功能描述接线方式入口闸机0x57主识别点记录首次进入Qwiic Bus A办公区门禁0x56二次验证防止尾随Qwiic Bus A实验室终端0x55高权限区域需双卡认证Qwiic Bus BHAL 驱动需为每个设备实例化独立QwiicRFID对象I2C_HandleTypeDef hi2c1; QwiicRFID rfid_entrance(0x57); QwiicRFID rfid_office(0x56); void MX_I2C1_Init(void) { hi2c1.Instance I2C1; hi2c1.Init.ClockSpeed 400000; // Fast Mode HAL_I2C_Init(hi2c1); } void rfid_init_all(void) { rfid_entrance.begin(hi2c1); rfid_office.begin(hi2c1); // ... 初始化其他设备 }5. 配置选项与性能调优5.1 关键编译时配置库未使用#define宏开关但用户可通过修改src/SparkFun_Qwiic_RFID.cpp中的常量优化行为常量默认值说明修改建议QWIIC_RIFD_TIMEOUT_MS100I²C 传输超时毫秒在嘈杂电磁环境如电机旁可增至200QWIIC_RIFD_RETRY_COUNT3I²C 重试次数低功耗模式下可设为1以节省电流QWIIC_RIFD_UID_MAX_LEN7UID 最大长度字节若确认只用 MIFARE Classic4B UID可改为4节省内存5.2 时序与电源稳定性I²C 通信可靠性直接受 PCB 布局与电源质量影响上拉电阻Qwiic 接口已内置 2.2 kΩ 上拉但长线20 cm或高速模式400 kHz下建议在主控端额外并联 1.0 kΩ电源去耦模块 VCC 引脚必须就近5 mm放置 10 μF 钽电容 100 nF 陶瓷电容中断抖动抑制INT 引脚易受射频噪声干扰推荐在 MCU 端添加硬件 RC 滤波10 kΩ 100 nF或在 ISR 中加入 10 μs 延迟消抖。5.3 缓冲区管理策略20 条记录的环形缓冲区设计隐含两种使用范式事件日志模式readAll()定期导出全部记录至 SD 卡或云端适合资产盘点最近状态模式readLatest()实时响应适合门禁控制此时BUFFER_FULL位可作为系统告警信号提示管理员清空日志。若需扩展容量可外接 I²C EEPROM如 AT24C512但需重写readIndex()逻辑将地址映射改为页式访问。6. 故障排查与典型问题6.1 常见错误码与对策现象begin()返回值可能原因解决方案Serial输出 “not found”falseI²C 地址错误用逻辑分析仪抓取 SCL/SDA确认地址为0x57或0x56readLatest()返回0true初始化成功但读不到数据SL3S40110H 未识别到标签检查天线连接Qwiic 线缆是否过长标签是否正对天线中心startScan()后isNewTagAvailable()永远为falsetrueINT 引脚未正确连接或配置用万用表测量 INT 引脚电压空闲时应为HIGH识别时LOW持续 10–50 ms6.2 射频性能边界测试在量产环境中需进行以下实测距离标定使用标准 MIFARE Ultralight C 卡在 0–10 cm 范围内每 0.5 cm 测试识别成功率绘制Success Rate vs Distance曲线多标签抗冲突同时放置 3 张不同 UID 卡验证readAll()是否按时间顺序返回全部 3 条而非仅返回首张温度漂移在 -20°C 至 70°C 环境箱中运行 24 小时连续扫描确认无 EEPROM 写入失败BUFFER_FULL位异常置位。某工业客户案例显示当环境温度 65°C 时SL3S40110H 的射频输出功率下降约 15%导致有效距离缩短 1.2 cm。解决方案是在外壳内加装微型散热片并将QWIIC_RIFD_TIMEOUT_MS提升至150以容忍更长的射频建立时间。7. 与同类方案对比及选型建议特性Qwiic RFID Reader 本库MFRC522 MFRC522 LibraryPN532 Adafruit PN532协议支持ISO14443-AMIFARE/NTAGISO14443-A/BISO15693ISO14443-A/BFelicaISO18092NFCMCU 负载极低纯 I²C 寄存器读写中需管理 SPI 时序 协议状态机高需处理 UART/SPI 多种接口 复杂命令集开发周期 1 小时复制示例即可3–8 小时需理解防冲突算法1–2 天需调试固件版本兼容性成本BOM$12.95模块 $0库$3.50模块 $0库$14.95模块 $0库适用场景快速原型、教育套件、固定点位门禁成本敏感型消费电子、多协议兼容需求移动支付终端、高端 NFC 交互设备对于需要快速验证 RFID 功能、或 MCU 资源极度紧张如 ATTiny85的项目Qwiic 方案是不可替代的选择。其价值不在于协议广度而在于将“识别一张卡”这一原子操作压缩为一行rfid.readLatest(uid, ts)调用——这正是嵌入式开发中“简单即可靠”的终极体现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2435208.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;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…