Arduino串口通信进阶:深入理解数字与模拟信号处理
1. 从“会亮灯”到“会思考”为什么串口是Arduino进阶的必经之路如果你已经玩过Arduino点亮过LED控制过舵机甚至用上了超声波传感器那么恭喜你你已经成功迈入了物理计算的大门。但不知道你有没有过这样的困惑为什么我读取的光敏电阻数值总是在跳变为什么我设置的舵机角度和实际转动角度对不上为什么我的传感器数据看起来“不太对劲这些问题的答案往往就藏在Arduino与电脑之间那条看不见的“数据通道”里——串口通信。很多人把串口仅仅当作一个上传代码的工具或者一个简单的“打印”窗口这实在是大大低估了它的价值。在我看来能否熟练、深入地使用串口是区分Arduino“玩家”和“开发者”的一道分水岭。它不仅仅是一个输出工具更是你窥探Arduino内部世界、调试程序、理解硬件与软件如何对话的“眼睛”和“耳朵”。今天我们就来聊聊串口通信但不止于“Serial.begin(9600)”和“Serial.println()”。我们将以串口为镜深入剖析Arduino世界里两个最核心、也最容易混淆的概念“数字”与“模拟”。理解了它们你才能真正读懂传感器在“说”什么才能让你的Arduino项目从“能动”进化到“能精准地动”、“能智能地动”。2. 串口不只是上传代码的通道更是调试与对话的生命线在深入数字与模拟之前我们必须重新认识串口。Arduino Uno板子上标有“0 (RX)”和“1 (TX)”的那两个引脚就是硬件串口。RX负责接收ReceiveTX负责发送Transmit。当你用USB线连接电脑和Arduino时电脑端会虚拟出一个串口如COM3, COM5, /dev/ttyUSB0等通过这条通道我们完成了三件大事上传程序、与Arduino双向通信、为Arduino供电。2.1 串口监视器你的第一个“示波器”与“逻辑分析仪”Arduino IDE内置的“串口监视器”工具其重要性不亚于一块万用表。它的核心功能是显示从Arduino发送来的任何文本信息并允许你向Arduino发送命令或数据。注意上传代码时请务必关闭串口监视器窗口因为IDE需要独占串口进行通信。上传完成后再打开否则会导致上传失败。但它的高级用法远不止于此实时监控变量在程序关键位置用Serial.print()输出变量的值你可以看到程序运行过程中某个温度、距离或角度是如何变化的。这是最基础的调试手段。绘制数据曲线使用“串口绘图器”功能工具 - 串口绘图器你可以将发送的数值实时绘制成曲线图。这对于观察传感器信号的稳定性、滤波效果、周期性变化如心率、波形直观无比。交互式控制通过Serial.read()或Serial.readString()读取你从电脑端输入的命令如‘a’、‘b’、‘1’、‘0’可以让Arduino执行不同的任务实现不重新上传代码就改变行为的效果。2.2 波特率通信双方必须说同一种“语速”Serial.begin(9600)中的9600就是波特率Baud Rate单位是“波特”bps可以粗略理解为每秒传输的二进制位数。常见的波特率还有115200、57600、19200等。最关键的原则是Arduino程序中设定的波特率必须与串口监视器右下角下拉菜单中选中的波特率完全一致。如果不一致你看到的将是一堆乱码。更高的波特率意味着更快的通信速度但并非越高越好过高的波特率在长距离或干扰大的环境下容易出错。对于大多数调试场景9600或115200是稳妥的选择。2.3 数据格式从原始字节到可读文本Serial.print(“Hello”)发送的是字符串“Hello”对应的ASCII码。Serial.print(123)默认将整数123转换为字符串“123”再发送。Serial.println()则在发送内容后额外发送一个换行符‘\n’和回车符‘\r’这在串口监视器中表现为另起一行。一个更强大的函数是Serial.write()它直接发送原始字节数据。例如Serial.write(65)发送的就是一个字节其值为65即ASCII码的‘A’。当你需要传输非文本的二进制数据如图像、音频采样、自定义协议包时Serial.write()是必须掌握的。理解了串口是“如何说话”的我们才能用它来听清“数字”和“模拟”这两个核心概念到底在“说什么”。3. 数字信号非黑即白的“开关世界”让我们先从相对简单的数字信号说起。在Arduino的语境下“数字”首先指的是数字引脚Digital Pins即板子上标有数字编号如2, 3, 4, … 13的引脚。这些引脚最核心的能力就是读取或输出两种明确的状态HIGH高电平和LOW低电平。3.1 电平的物理意义电压的阈值对于大多数5V供电的Arduino如UnoHIGH通常指引脚电压在3V以上实际阈值约为2.5V-3V。LOW通常指引脚电压在1.5V以下实际阈值约为1.5V-2V。这个“非高即低”的特性使得数字信号极其抗干扰。只要噪声没有大到把高电平拉到阈值以下或者把低电平推到阈值以上信号就能被正确识别。这就像判断一盏灯是“亮”还是“灭”只要光线不是微弱到难以辨认结论就是明确的。3.2 数字输入读取开关与传感器的状态配置引脚为输入模式pinMode(pin, INPUT)你就可以读取外部电路的状态。最经典的例子是按钮开关。const int buttonPin 2; int buttonState 0; void setup() { Serial.begin(9600); pinMode(buttonPin, INPUT); } void loop() { buttonState digitalRead(buttonPin); Serial.print(“Button state: “); Serial.println(buttonState); // 按下通常是LOW(0)松开是HIGH(1)取决于电路接法 delay(100); }通过串口你可以实时看到按钮被按下和释放时buttonState在0和1之间跳变。许多模块如红外避障传感器、触摸开关、磁簧管输出的都是这种简单的数字信号有障碍物/被触摸/有磁场时输出LOW或HIGH否则输出相反电平。3.3 数字输出控制LED与继电器配置引脚为输出模式pinMode(pin, OUTPUT)你就可以用digitalWrite(pin, HIGH/LOW)来控制它输出高电平约5V或低电平0V。这可以直接驱动LED需串联限流电阻或者通过三极管、MOS管驱动继电器、电机等大功率设备。const int ledPin 13; void setup() { pinMode(ledPin, OUTPUT); } void loop() { digitalWrite(ledPin, HIGH); // LED亮 delay(1000); digitalWrite(ledPin, LOW); // LED灭 delay(1000); }3.4 一个关键技巧上拉电阻与下拉电阻当你用按钮做输入时可能会发现一个现象按钮未按下时digitalRead的值不稳定随机在0和1之间跳动。这是因为输入引脚在悬空既不高也不低时其电平是浮动的极易受电磁干扰影响。解决方案是启用Arduino内部的上拉电阻。在setup()中使用pinMode(pin, INPUT_PULLUP)。启用后引脚内部通过一个约20kΩ-50kΩ的电阻连接到5V。此时当按钮未按下引脚被拉高读取为HIGH按钮按下引脚通过按钮接地变为LOW。pinMode(buttonPin, INPUT_PULLUP); // 启用内部上拉电阻提示使用内部上拉电阻时你的按钮接线逻辑是反的按下为LOW松开为HIGH。这是最常用、最省事的接法无需外部电阻。3.5 PWM数字引脚模拟出的“灰度”细心观察Arduino Uno的引脚会发现其中一些数字引脚旁标有“~”符号如3, 5, 6, 9, 10, 11。这些引脚支持PWM脉冲宽度调制。PWM的本质仍然是数字信号快速地在HIGH和LOW之间切换但通过改变一个周期内高电平所占的时间比例占空比可以模拟出类似模拟量的效果例如让LED呈现不同的亮度让电机有不同的转速。使用analogWrite(pin, value)函数其中value是0-255之间的整数。0对应0%占空比常低255对应100%占空比常高127对应约50%占空比。const int ledPin 9; int brightness 0; int fadeAmount 5; void setup() { pinMode(ledPin, OUTPUT); } void loop() { analogWrite(ledPin, brightness); // 用PWM控制亮度 brightness brightness fadeAmount; if (brightness 0 || brightness 255) { fadeAmount -fadeAmount; // 到达边界后反转方向 } delay(30); }通过串口绘图器观察brightness变量的变化你会看到一个完美的三角波。但请记住PWM是“模拟效果”而非真正的模拟信号。它无法提供真正的、连续可调的电压值。4. 模拟信号连续变化的“渐变世界”与数字信号的“非此即彼”不同模拟信号是连续变化的。在Arduino上这主要指模拟输入。板子上标有“A0”-“A5”Uno有6个的引脚就是专用的模拟输入引脚。它们内部连接到一个叫ADC模数转换器的模块。4.1 ADC将连续电压“切片”成数字Arduino Uno的ADC是10位精度的。这意味着它可以将0V到参考电压默认是工作电压5V之间的连续电压量化为2^10 1024个离散的数值。所以analogRead(pin)的返回值范围是0到1023。输入电压为0V时analogRead返回0。输入电压为5V时analogRead返回1023。输入电压为2.5V时analogRead返回大约512。其转换关系是线性的测量电压 (读取值 / 1023) * 参考电压。4.2 读取模拟传感器以光敏电阻为例光敏电阻的阻值随光照强度变化。我们通常将它和一个固定电阻串联构成一个分压电路从中点取出变化的电压接到模拟引脚。const int sensorPin A0; int sensorValue 0; void setup() { Serial.begin(9600); } void loop() { sensorValue analogRead(sensorPin); Serial.println(sensorValue); delay(100); }打开串口绘图器用手遮挡光敏电阻你会看到数值曲线随之上下波动。这就是模拟世界的直接体现光照是连续变化的电阻是连续变化的电压是连续变化的最终读到的数值也是连续变化的。4.3 模拟信号的“噪声”与稳定性在实际操作中你可能会发现即使光源稳定analogRead的返回值也在一定范围内跳动例如在512附近±5波动。这不是程序错误而是现实世界的常态电源噪声USB供电或电池供电并非绝对纯净的5.00V存在微小纹波。传感器噪声光敏电阻、热敏电阻等元件本身存在一定的噪声。ADC量化误差10位ADC本身就有±1到±2个最小单位的固有误差。电磁干扰周围的电机、继电器、甚至手机信号都可能引入干扰。4.4 软件滤波从“毛糙”数据中提取“光滑”真相为了得到更稳定、可用的数据我们必须对原始模拟读数进行滤波。这里介绍两种最常用、最易实现的软件滤波方法。4.4.1 滑动平均滤波原理是维护一个最近N次读数的队列每次新读数加入最旧的读数移出然后计算队列中所有数的平均值作为输出。这种方法能有效平滑随机波动。const int numReadings 10; // 平均的样本数 int readings[numReadings]; // 读数数组 int readIndex 0; // 当前读数索引 int total 0; // 总和 int average 0; // 平均值 void setup() { Serial.begin(9600); // 初始化数组为0 for (int thisReading 0; thisReading numReadings; thisReading) { readings[thisReading] 0; } } void loop() { // 减去最早的读数 total total - readings[readIndex]; // 读取新的值 readings[readIndex] analogRead(A0); // 加上新的读数 total total readings[readIndex]; // 移动到下一个位置 readIndex readIndex 1; if (readIndex numReadings) { readIndex 0; } // 计算平均值 average total / numReadings; Serial.print(“Raw: “); Serial.print(analogRead(A0)); Serial.print(” Average: “); Serial.println(average); delay(10); // 短延迟增加采样率 }通过串口监视器对比Raw原始值和Average平均值你会发现平均值曲线要平稳得多。numReadings越大曲线越平滑但对变化的响应也越迟钝。需要根据实际场景权衡。4.4.2 中值滤波另一种思路是取最近N次读数的中位数排序后位于中间的值。这种方法对于消除偶发的、幅度很大的脉冲干扰例如开关大功率设备产生的瞬间干扰特别有效因为中位数不受极端值影响。const int filterSize 5; // 取5个样本 int samples[filterSize]; int medianFilter(int newValue) { // 1. 将新值放入数组并整体前移 for (int i 0; i filterSize - 1; i) { samples[i] samples[i 1]; } samples[filterSize - 1] newValue; // 2. 复制数组进行排序冒泡排序简单但低效仅作演示 int temp[filterSize]; for (int i 0; i filterSize; i) temp[i] samples[i]; for (int i 0; i filterSize - 1; i) { for (int j 0; j filterSize - i - 1; j) { if (temp[j] temp[j 1]) { int swap temp[j]; temp[j] temp[j 1]; temp[j 1] swap; } } } // 3. 返回中值 return temp[filterSize / 2]; } void loop() { int rawValue analogRead(A0); int filteredValue medianFilter(rawValue); Serial.print(“Raw: “); Serial.print(rawValue); Serial.print(” Median: “); Serial.println(filteredValue); delay(50); }在实际项目中滑动平均滤波更通用中值滤波则用于对抗“野值”。你可以将滤波后的稳定数值通过串口发送用于更可靠的控制或数据记录。5. 数字与模拟的实战对话用串口搭建一个环境监测仪理论说再多不如动手做一遍。让我们设计一个小项目综合运用数字输入、模拟输入、PWM输出和串口通信并在这个过程中深刻体会两者的区别与联系。5.1 项目目标与硬件清单目标制作一个简易环境监测仪。用数字输入读取一个按钮用于切换显示模式例如在“温度”和“光照”读数间切换。用模拟输入读取一个温度传感器如LM35输出与温度成正比的电压和一个光敏电阻的电压。用PWM输出控制一个LED其亮度随光照强度反向变化越暗LED越亮作为夜灯指示。用串口将所有的状态信息按钮模式、原始模拟值、转换后的物理量、LED亮度值实时发送到电脑并用串口监视器观察。硬件清单Arduino Uno x1LM35温度传感器 x1光敏电阻 x1 10kΩ固定电阻 x1用于与光敏电阻分压按钮 x1LED x1 220Ω限流电阻 x1面包板和若干杜邦线5.2 电路连接详解LM35三个引脚。中间引脚Vout接A0Vs接5VGND接GND。LM35每摄氏度输出10mV0°C时输出0V。光敏电阻分压电路光敏电阻一端接5V另一端同时接A1和10kΩ电阻的一端。10kΩ电阻的另一端接GND。这样A1读取的就是光敏电阻与10kΩ电阻之间的分压电压。按钮一端接数字引脚2另一端接GND。同时在setup()中为引脚2配置INPUT_PULLUP利用内部上拉电阻。LED长脚阳极通过220Ω电阻接数字引脚9PWM引脚短脚阴极接GND。5.3 代码实现与分步解析// 引脚定义 const int buttonPin 2; const int tempSensorPin A0; const int lightSensorPin A1; const int ledPin 9; // 变量定义 int displayMode 0; // 0:显示温度1:显示光照 int lastButtonState HIGH; // 由于启用上拉初始为高 int buttonState; unsigned long lastDebounceTime 0; unsigned long debounceDelay 50; // 防抖延时 float temperatureC; int lightValue; int ledBrightness; void setup() { Serial.begin(115200); // 使用较高的波特率传输数据更快 pinMode(buttonPin, INPUT_PULLUP); pinMode(ledPin, OUTPUT); Serial.println(“Environment Monitor Started.”); Serial.println(“Mode: 0Temperature, 1Light”); } void loop() { // ———— 第一部分数字输入处理按钮防抖与模式切换 ———— int reading digitalRead(buttonPin); // 防抖逻辑只有当读数变化且稳定一段时间后才认为有效按下 if (reading ! lastButtonState) { lastDebounceTime millis(); } if ((millis() - lastDebounceTime) debounceDelay) { if (reading ! buttonState) { buttonState reading; if (buttonState LOW) { // 按钮被按下上拉模式下为LOW displayMode 1 - displayMode; // 在0和1之间切换 Serial.print(“Mode changed to: “); Serial.println(displayMode); } } } lastButtonState reading; // ———— 第二部分模拟输入读取与物理量转换 ———— // 1. 读取温度传感器LM35 int tempRaw analogRead(tempSensorPin); // 将ADC读数转换为电压 (参考电压为5V) float voltage tempRaw * (5.0 / 1023.0); // LM35: 10mV per °C, 所以电压 * 100 温度摄氏度 temperatureC voltage * 100.0; // 2. 读取光照传感器光敏电阻 lightValue analogRead(lightSensorPin); // 值范围 0-1023 // 简单的映射光照越强读数越大。我们将其映射为百分比0-100% // 注意这个映射非常粗略仅用于演示。实际应通过校准确定最小最大值。 int lightPercent map(lightValue, 50, 900, 0, 100); // 假设50为全暗900为最亮 lightPercent constrain(lightPercent, 0, 100); // 限制在0-100之间 // ———— 第三部分PWM输出控制LED亮度随光照反向变化 ———— // 光照越弱lightPercent小LED越亮brightness大 ledBrightness map(lightPercent, 0, 100, 255, 0); // 将光照百分比反向映射到PWM值 ledBrightness constrain(ledBrightness, 0, 255); analogWrite(ledPin, ledBrightness); // ———— 第四部分串口数据输出与格式化 ———— Serial.print(“Mode:”); Serial.print(displayMode); Serial.print(” | “); if (displayMode 0) { Serial.print(“Temp: “); Serial.print(temperatureC); Serial.print(” °C”); } else { Serial.print(“Light: “); Serial.print(lightPercent); Serial.print(”% (Raw:”); Serial.print(lightValue); Serial.print(”)”); } Serial.print(” | LED PWM: “); Serial.print(ledBrightness); Serial.print(”/255”); Serial.println(); // 换行 delay(200); // 主循环延时控制数据刷新率 }5.4 串口数据解读与项目深潜将代码上传打开串口监视器波特率设为115200你会看到类似这样的数据流Mode:0 | Temp: 25.34 °C | LED PWM: 120/255 Mode:0 | Temp: 25.31 °C | LED PWM: 118/255 Mode:1 | Light: 45% (Raw:467) | LED PWM: 140/255 Mode:1 | Light: 43% (Raw:445) | LED PWM: 145/255数字世界的体现Mode和按钮状态是典型的数字量非0即1。我们通过一个displayMode变量来记住这个状态并用防抖逻辑确保每次按压只触发一次切换。这是数字逻辑控制的典型应用。模拟世界的体现Temp和Light (Raw)来自模拟引脚。Temp是经过公式计算出的连续物理量你会看到它有小数且在极小的范围内波动如25.34, 25.31。Light (Raw)是原始的ADC读数是0-1023之间的整数但代表了连续变化的光照强度。我们通过map函数将其映射到0-100%的范围内这是一种常见的模拟信号标定方法。数字与模拟的桥梁LED PWM值是一个0-255的整数数字量但它通过PWM技术控制了一个模拟效果——LED的亮度。这个亮度值又是根据模拟输入lightPercent计算出来的。这就是用数字系统处理模拟信号再输出模拟控制量的完整链条。串口的枢纽作用所有这一切——数字状态、原始模拟值、计算后的物理量、控制参数——都通过串口清晰地呈现在我们面前。没有串口我们就像在盲操。有了串口我们才能验证“我的温度计算公式对吗”、“光照映射的范围合理吗”、“按钮防抖生效了吗”、“LED的亮度变化符合我的预期吗”通过这个综合项目你应该能清晰地感受到数字信号用于逻辑控制、状态判断和开关命令模拟信号用于感知连续变化的物理世界而串口则是你理解、调试和连接这两个世界的桥梁。当你再看到传感器数值跳动时你会知道这是正常的模拟噪声并想到用滤波算法当你需要实现一个渐变效果时你会自然地想到PWM。这才是从“会接线”到“懂原理”的关键一步。

相关新闻

创客教育实践指南:从智能硬件到跨学科融合的创新能力培养

创客教育实践指南:从智能硬件到跨学科融合的创新能力培养

1. 赛事背景与核心价值:为什么“创客”教育在今天如此重要?如果你是一位家长、老师,或者只是关注教育领域动态的从业者,最近可能被一条消息刷屏了:全国中小学生创客邀请赛在常州举行了。这听起来像是一场普通的竞赛&am…

2026/7/29 14:42:59阅读更多 →
Unix时间戳原理与C语言时间计算实战:从1970纪元到18岁生日天数

Unix时间戳原理与C语言时间计算实战:从1970纪元到18岁生日天数

1. 项目概述:从“1970年秒数”到时间计算的本质 最近在论坛上看到一个挺有意思的讨论,起因是一个看似简单的编程题:“计算当前时间距离1970年的秒数”。很多新手朋友第一反应就是调用 time(NULL) 或者 time.time() ,然后打印结…

2026/7/29 14:42:59阅读更多 →
从Arduino到立方星:开源硬件如何降低太空探索门槛

从Arduino到立方星:开源硬件如何降低太空探索门槛

1. 项目概述:当开源硬件飞向太空 几年前,当我和几个朋友在车库里捣鼓Arduino,试图让几个传感器和LED灯协同工作时,我们大概不会想到,同样的技术栈有一天会被塞进一个鞋盒大小的金属壳里,然后由火箭送上近地…

2026/7/29 14:42:59阅读更多 →
MAA明日方舟助手:从日常繁琐到智能游戏管理的效率革命

MAA明日方舟助手:从日常繁琐到智能游戏管理的效率革命

MAA明日方舟助手:从日常繁琐到智能游戏管理的效率革命 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: https://git…

2026/7/29 16:11:18阅读更多 →
Grok 4.5 辅助 Python 学习完整指南:零基础到实战的 AI 编程学习路径

Grok 4.5 辅助 Python 学习完整指南:零基础到实战的 AI 编程学习路径

零基础学Python,最怕的不是语言难,是卡住的时候没人问。看视频教程跟着敲还行,一报错就懵了——搜Stack Overflow看不懂,翻文档更是一头雾水。Grok 4.5免费额度大、响应速度快,很适合当"随身家教"。我设计了…

2026/7/29 16:11:18阅读更多 →
工业物联网通信系统:LTE Cat 1与STM32L432KC实战

工业物联网通信系统:LTE Cat 1与STM32L432KC实战

1. 项目概述:构建工业级物联网通信系统 在工业物联网(IIoT)领域,稳定可靠的通信系统是保障设备远程监控和控制的基础。本项目基于u-blox LARA-R6401D-00B LTE Cat 1通信模块与STM32L432KC微控制器的组合,构建了一套完整的物联网通信解决方案。…

2026/7/29 16:11:18阅读更多 →
收藏!小白程序员抓住AI大模型应用开发红利期,转行就业新机遇!

收藏!小白程序员抓住AI大模型应用开发红利期,转行就业新机遇!

本文探讨了AI行业的现状,指出虽然部分大厂如微软在裁员,但英伟达等公司在AI核心领域扩招,表明AI行业正在进行人才结构的调整和洗牌。文章强调,AI大模型应用开发是普通人转行和入场的良好切入点,因为这类岗位需求量大、…

2026/7/29 16:11:18阅读更多 →
AI+制造:大小模型协同破解制造企业痛点,小白程序员必备收藏!

AI+制造:大小模型协同破解制造企业痛点,小白程序员必备收藏!

本文介绍了扬州大数据集团推出的“AI场景”系列专题,聚焦AI制造。传统制造模式存在工艺优化、设备运维、专家经验流失、协同不足等痛点。解决方案是采用“大小模型协同智能体”的全流程赋能体系,通过数据底座搭建、大小模型协同、四大智能体部署、全流程…

2026/7/29 16:11:18阅读更多 →
Agent 开发调试工具链:单步执行、变量观察与调用栈追踪

Agent 开发调试工具链:单步执行、变量观察与调用栈追踪

Agent 开发调试工具链:单步执行、变量观察与调用栈追踪Agent 出错了你只知道"结果不对"——没有单步执行和变量观察,调试 Agent 就像盲修电路。一、场景痛点 你的 Agent 执行了 5 个步骤后输出结果,结果明显不对。你查了日志&#…

2026/7/29 16:09:18阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/29 9:47:45阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/29 7:00:19阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/29 7:58:51阅读更多 →
28. Agent 执行到一半想暂停?用 interrupt 给它设个“关卡“!

28. Agent 执行到一半想暂停?用 interrupt 给它设个“关卡“!

28. Agent 执行到一半想暂停?用 interrupt 给它设个“关卡“! 在构建复杂的 Agent 系统时,我们经常会遇到这样的场景:Agent 正在执行一个多步骤的任务,比如“下单购买商品”,但执行到一半时,我们…

2026/7/29 0:01:46阅读更多 →
自律同行,突破无界!NANK南卡正式官宣曾舜晞成为品牌代言人

自律同行,突破无界!NANK南卡正式官宣曾舜晞成为品牌代言人

近日,国际专注开放式技术研发的声学品牌Nank南卡,正式官宣实力艺人曾舜晞担任品牌代言人。消息一经发出便轰动全网。为什么耳机品牌不选择流量明星、老牌歌手?而且是选择曾舜晞?让我们一起来探索一下!比起短期的流量&a…

2026/7/29 0:01:46阅读更多 →
【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

一、本文介绍 🔥本文在RT-DETR多模态融合目标检测中引入RLAB残差线性注意力模块,可在不同模态特征交互阶段进行多次残差细化,使可见光、红外等特征在尺度、语义和空间位置上更好对齐;随后将细化特征与解码器输出拼接并生成Q、K、V,通过线性注意力自适应强化关键通道、目…

2026/7/29 0:01:46阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/28 20:22:24阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/29 4:31:51阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/29 14:26:42阅读更多 →